2.2.2 业务架构设计

应用DDD设计的系统,可以采用传统的分层架构来实现,也可以采用六边形架构和CQRS读写分离架构来实现。

1.分层架构

(1)接口层

统一处理系统对外的服务接口,可以是直接查询,也可以是三方系统对接。

(2)应用层

调用各个领域完成一个具体的业务流程应用,不关心具体的业务实现,例如完成旅客购买机票这个行为,需要旅客和机票两个领域参与。

(3)领域层

实际完成业务逻辑处理的地方,包含领域模型和领域服务,无须关心显示及存储等相关问题。

(4)基础设施层

提供底层支撑功能,包括持久化、序列化与反序列化、消息中间件等。

这种分层架构与我们熟悉的MVC分层架构大同小异,是很容易从传统分层过渡到DDD分层的架构设计。DDD分层架构如图2-5所示。

图2-5 DDD分层架构

2.六边形架构

为六边形架构如图2-6所示。六边形架构可以理解为“去结构化”的架构,系统内部与外界的交互过程通过适配器来完成,没有层次,所有交互双方只知道适配器的存在,不用知晓对方的存在。内部是核心业务逻辑,外部是基础支撑或者其他交互系统。这种架构的好处是显而易见的,一方面是解耦,另一方面是方便外部统一驱动、测试内部程序。例如与REST接口交互,使用REST适配器;与SOAP系统交互,使用SOAP适配器;与消息系统交互,使用消息适配器等。

图2-6 六边形架构

3.CQRS读写分离架构

CQRS读写分离架构如图2-7所示。向左的箭头是Command线,向右的箭头是Query线。

图2-7中为了方便把读写进程画在了一起,读写的数据库也集中在一个数据库。实际上读写完全可以是两套系统,读库和写库也可以完全隔离。读库和写库的同步问题通常采取消息事件机制来解决,也可以监听数据库的binlog类的日志来完成同步。

图2-7 CQRS读写分离架构

实际生产中,笔者推荐将上述三种架构做一个融合,各取所长。架构整体上是六边形架构,去中心化,读写必须分离,最后在各微服务领域内,采用DDD分层结构来组织业务流程及代码。最终架构图如图2-8所示。

图2-8 推荐的架构图

随着业务越来越多元化,越来越复杂,对信息平台的要求也越来越高。系统自然也由简单走向复杂,由单体走向集群。在架构后续的演进中,组件化和服务化几乎就成了一条必经之路。