【java】DDD架构同普通微服务项目的区别
前言:
初次接触DDD架构有点蒙蔽,简单实战过后,有点心得和体会,简单总结下:
拆解成 4 个关键词:
统一语言
开发、业务、测试用同一套无歧义的业务词汇说话,并原封不动地出现在代码里。
例:代码里出现 order.confirmPayment(),而不是 orderService.updateStatus(orderId, 2)。
限界上下文(Bounded Context)
把庞大系统切成一个个高内聚、低耦合的业务边界,每个边界内部有一套完整的模型和语言。
例:订单上下文只关心“订单聚合”,库存上下文只关心“库存聚合”,两者通过事件交互。
聚合根(Aggregate Root)
每个业务边界里,用一个“根实体”封装所有业务规则和数据一致性。
例:Order 聚合根内部自己校验状态、扣减库存、发布事件,外部代码不能直接碰它的子对象。
领域事件(Domain Event)
把“发生了什么”广播出去,让其他上下文异步响应,实现松耦合。
例:OrderPaidEvent 触发库存扣减、邮件发送、BI 统计,而订单聚合根本身不直接调用库存服务。
一句话记忆:
DDD 让代码先描述业务,再考虑技术;普通架构让代码先描述技术,再补业务。
普通服务下单:校验状态在service层,扣减库存,,,ddd 校验状态在领域层,然后扣减库存通过异步mq 是这点区别吗
订单业务举例
把“校验状态 + 扣减库存”这两个动作拆开来看,DDD 与普通服务在位置、时机、耦合度上完全不同,下面用一张“时间线”让你一眼看懂。
一句话总结
普通服务:Service 既当裁判又当运动员——校验、改状态、调库存全混在一起,同步耦合。
DDD:聚合根当裁判(只负责业务正确性),事件当邮差(异步通知别人干活),彻底解耦。
所以区别不仅是“校验位置”,而是“谁负责业务正确性 + 如何通知协作方”的整体设计哲学。