《微服务架构设计模式》读书笔记---第五章:微服务架构中的业务逻
组织业务逻辑主要有两种方法:面向过程的事务脚本模式和面向对象的领域建模模式。
面向过程的事务脚本模式
这种方式的一个重要的特征就是,实现行为的类和存储状态的类是分开的。脚本通常位于服务类中,例如Order Service类,使用Order Dao访问数据库,而数据对象Order类,是一个纯数据类。
这种模式,适合于简单的业务场景,如果场景变得复杂,那么代码将变得难以维护。
面向对象的领域建模模式
对于复杂的业务逻辑,最好使用领域模型模式,进行面向对象的设计。
领域模型:将业务逻辑组织为具有状态和行为的类构成的对象模型。
这种方式依然存在Order Service这样的服务类,但服务类仅提供针对每个请求的方法,大量的业务逻辑以调用对象的行为完成,通常这些服务类比较简单。
好处:
- 易于理解和维护
- 容易测试
- 面向对象的设计更容易扩展
关于领域驱动设计
领域驱动设计(Domain-Drive Design,DDD)是对面向对象设计的改进,是开发复杂业务逻辑的一种方法。
DDD中的聚合,是一个边界内的领域对象的集群,可以将其视为一个单元,他由根实体和可能的额一个或多个其他实体和值对象组成。例如Order聚合,就由Order实体、一个或多个OrderLineItem值对象一起其他值对象(Address,Payment Information)组成。
聚合还阐述了加载、更新和删除等操作的范围,这些操作作用于整个聚合,而非部分聚合。聚合通常从数据库中完整加载。
聚合的规则
- 只能引用聚合根,客户端只能通过调用聚合跟上的方法来更新聚合。
- 聚合间的引用必须使用主键。也可以保证聚合是松耦合的。
- 在一个事务中,只能创建或者更新一个聚合。多个聚合的更新,应该使用Saga操作。
领域事件
领域事件是聚合发生的事情。它由领域模型中的一个类表示。Order聚合状态变化时间包括Order Create,Order Cancelled, Order Shipped等
为什么需要领域事件
其他协作方,对聚合状态的更改,感兴趣。例如
- 服务之间的数据一致性
- 通知维护副本的服务,元数据已经变更
- 需要将状态更新发送给用户
怎样识别领域事件
- 从需求中寻找领域事件
- 使用事件风暴,识别领域事件和聚合
谁来发送领域事件
- 在服务中发送领域事件。在聚合状态发生改变后,返回给服务一个事件列表。服务通过依赖注入,获取消息传递API的引用,使用这个引用发送事件列表中的事件。
- 聚合根在一个内部字段中积累保存时间。服务检索这些事件。
发送领域事件,也需要注意可靠性。服务需要使用事务性消息来发布事件,确保领域事件作为更新数据库中聚合的事务的一部分对外发布。