人人都是架构师-清晰架构 | 京东物流技术团队
内容提要
清晰架构是将多种架构方案整合后形成的一种架构,包括EBI架构、领域驱动设计、端口与适配器架构等。架构演化过程包括系统的基本构建块、工具和将传达机制和工具连接到应用核心。主适配器和从适配器分别包装端口,控制反转是架构层面的控制反转原则。洋葱架构采用DDD的分层,应用层包括应用服务和接口,领域层包括领域服务和领域模型。组件是根据子域和限界上下文划分的代码隔离。控制流从用户出发,进入应用核心,再返回应用核心并最终返回给用户。共享内核是多个限界上下文之间共享的代码。通过代码命名和组织结构可以清晰地展现架构。C4模型是一种记录软件架构的模型,包括系统上下文图、容器图、组件图和代码图。
延伸解读
清晰架构的整合逻辑与适用边界
清晰架构并非全新发明,而是将EBI、DDD、端口与适配器、洋葱架构等方案的优点整合而成。其核心在于依赖方向由外向内,业务逻辑只依赖按自身需求设计的端口,而非具体工具或适配器。这种设计让核心原则保持稳定,外层可灵活适配不同业务场景。但文章也指出,实际应用项目尚且较少,且它只是一份指南,是否采用、解耦到什么程度,需结合项目需求、时间、团队经验等因素判断。
主从适配器与控制反转的实践含义
主适配器(如Controller)包装端口并告知应用核心该做什么,从适配器(如Repository实现)则实现端口并被注入应用核心。控制反转体现在:适配器依赖具体工具和端口,但业务逻辑只依赖自己定义的接口。这意味着更换数据库或消息队列时,只需替换从适配器,核心代码基本不变。文章强调,端口应按应用核心的需要设计,而不是简单套用工具的API,否则控制反转的效果会打折扣。
组件解耦的代价与共享内核的约束
组件按子域和限界上下文划分,追求高内聚低耦合。但完全解耦意味着组件间不能直接引用,需要借助事件、共享内核、最终一致性或发现服务。共享内核是多个限界上下文共享的代码,范围应尽可能小,因为它的任何变化都会影响所有组件。在异构语言系统中,共享内核还需与语言无关,例如用JSON描述事件而非事件类。文章提醒,异步事件适用于解耦,但需要即时触发的场景仍需直接调用,此时可引入发现服务来解耦组件。
用代码和文档显性表达架构
文章主张通过代码命名和组织结构清晰展现架构。根目录下可设用户界面、应用核心、基础设施三个命名空间,核心内再分组件、共享内核和端口。组件内按应用层和领域层组织,端口按工具类型划分。文档方面,C4模型提供四种粒度:系统上下文图、容器图、组件图和代码图,从整体上下文到类级别逐步细化。这种显性化让开发者能理解边界,有助于保持模块化设计,但文章也提醒,分组方式影响不大,关键是让架构意图可读。
Q&A
清晰架构是什么?它整合了哪些架构方案?
清晰架构(Explicit Architecture)是将多种架构方案的部分优势整合后形成的一种架构,包括EBI架构、领域驱动设计、端口与适配器架构、洋葱架构、整洁架构、事件驱动架构、CQRS、面向服务的架构等。
端口和适配器架构中的主适配器和从适配器有什么区别?
主适配器(主动适配器)包装端口并通过它告知应用核心应该做什么,将来自传达机制的信息转换成对应用核心的方法调用;从适配器(被动适配器)实现一个端口并被注入到需要这个端口的应用核心里,由应用核心告知它该做什么。
清晰架构中的控制反转原则是如何体现的?
控制反转原则体现在依赖方向由外向内:业务逻辑只依赖按照它的需求设计的端口(接口),并不依赖特定的适配器或工具。适配器根据使用的工具不同可以灵活变更,但业务逻辑产生的接口基本不会变化。
洋葱架构中的应用层和领域层分别包含哪些内容?
应用层包括应用服务(及其接口)、端口与适配器架构中的接口(如ORM接口、搜索引擎接口、消息接口等),以及命令总线和查询总线的处理程序。领域层包括领域服务和领域模型,领域服务接收一组实体并执行某种业务逻辑,领域模型包含实体、值对象、枚举以及领域事件等。
在清晰架构中,组件之间如何解耦?
组件之间通过事件、共享内核、最终一致性甚至发现服务来解耦。当一个组件需要触发另一个组件的逻辑时,可以使用事件派发器派发领域事件,由监听组件处理;如果事件本身需要共享,可以放入共享内核。对于需要即时调用的场景,可以使用发现服务。组件不允许修改不属于它的数据,但可以查询和使用任何数据。
C4模型包括哪四种不同粒度的架构图?
C4模型包括四种不同粒度的架构图:第一级系统上下文图,第二级容器图,第三级组件图,第四级代码图。
清晰架构中如何通过代码组织来体现架构?
在源代码根目录下创建三个文件夹(命名空间)分别对应用户界面、应用核心和基础设施。用户界面下按API、CLI、网站等类型细分;基础设施下按工具类型(如ORM、消息队列)和供应商细分;核心下分为组件、共享内核和端口。组件下再按应用层和领域层划分。依赖方向由外向内,内层对外层可见,外层对内层不可见。