本篇主要总结第五章:微服务架构中的业务逻辑设计

首先,作者介绍了传统的业务逻辑设计:事务脚本。作者不推荐这种设计,我们直接略过。领域模型模式才是本章的重头戏。

领域模型模式

领域模型:将业务逻辑组织为由具有状态和行为的类构成的对象模型。

领域模型模式,采用基于面向对象的设计,自带面向对象设计的优点。同时,面向对象的设计原则、设计模式也已经比较成熟,使领域模型设计更加容易上手、有迹可循。作者是相当的推荐,也是大多数中、后台或微服务采用的模式。

说到领域模型,肯定跑不了领域驱动设计DDD。下面一张图简单说明一下领域驱动设计干的事情。




微服务实体模块化_编程语言


领域驱动设计,Eric Evans在出版《Domain-Driven Design –Tackling Complexity in the Heart of Software》(中文名称:领域驱动设计——软件核心复杂性应对之道)一书中首次提出的简称Evans DDD。

作者简要介绍了DDD的两个设计阶段:

  • 战略性DDD
  • 子域
  • 相关联的限界上下文
  • 战术性DDD
  • 实体(entity)
  • 值对象(value object)
  • 工厂(factory)
  • 存储库(repository)
  • 服务(services)

然后,作者本章的重中之重就是介绍Aggregate——聚合模式。

聚合模式

聚合模式:将领域模型组织为聚合的集合,每个聚合都是可以作为一个单元进行处理的一组对象构成的图。

包括以下几个特点:

  • 聚合拥有明确的边界
  • 从数据库完整加载
  • 删除聚合会从数据库中删除其对应的对象

聚合的使用规则:

  • 只引用聚合根。聚合根是外部唯一可以引用聚合的部分,确保聚合能够强制执行各种不变量约束。
  • 聚合间的引用必须使用主键。引用聚合必须通过标识(主键)而不是对象引用。
  • 使聚合保持松耦合
  • 避免出现跨服对象的引用
  • 在一个事务中,只能创建或更新一个聚合。确保单个事务的范围不超越服务的边界。

紧接着,作者又推荐了另一个模式——领域事件。

领域事件

领域事件:聚合在被创建时,或发生其他重大更改时发布领域事件。

在讨论领域事件的过程中,作者提到了“事件风暴”的方法论。

事件风暴:一套通过协作,基于事件还原系统全貌,从而快速分析复杂业务领域,完成领域建模的方法。

学习总结

业务逻辑的设计,主要是使用领域驱动设计的方法。在微服务架构中,在具体业务逻辑的划设计上,作者推荐使用聚合模式和领域事件。运用前几章介绍的知识,综合分析一下Order Service的目前业务逻辑。


微服务实体模块化_编程语言_02


首先,以六边形软件架构风格为基础:

  • 入站适配器
  • REST API
  • Order命令处理程序
  • OrderEvent Consumer
  • SagaReply消息适配器
  • 出站适配器
  • 领域事件发布适配器
  • 数据库适配器
  • 出站命令消息适配器

其次,使用第4章介绍的Saga实现分布式事务*OrderSaga。

第三,使用DDD领域驱动设计中的聚合模型。将Order服务划分出几个聚合:

  • Order聚合。代表消息者下的订单。包括以下几个部分
  • 聚合根:Order
  • 外部聚合(主键引用)
  • ConsumerId
  • RestaurantId
  • 值对象
  • OrderLineItem
  • DeliveryInfo
  • Address
  • PaymentInfo
  • Money
  • 方法
  • createOrder:创建一个Order并发布OrderCreatedEvent。
  • noteApproved/noteRejected:在CreateOrderSaga结束后修改订单状态
  • Restaurant聚合

然后,使用OrderService承接各种入站适配器调用,并创建Saga,同时触发各种逻辑调用各种出站适配器。以创建订单为例:

  • 首先查看承接订单的餐馆信息,如果查询失败抛出异常
  • 调用createOrder静态工厂方法创建Order聚合
  • 发布createOrder返回的领域事件
  • 创建create order saga开始分布式事务处理