如何正确地理解应用架构并开发(中):https://developer.aliyun.com/article/1443482
常见问题
▐ API层
API包一般放什么内容?
- 对外暴露接口:直接代理外界需要访问的领域服务。
- Facade模式:对Domain层的能力,基于易用性的目的,进行一定的重组;比如多个领域服务合一个API、一个领域服务拆多个API
- 对于一些通用的判断方法可以放在里面
- 通用的异常类型
- 通用的枚举
▐ Application层
Application层即API的设计要划分领域吗?
- 需要划分领域,细节可能和Domain层存在一些差异,由于属于顶层服务
API和Domain Service都是接口,它们的区别是什么?
- API是暴露给外部系统,希望外部系统感知的能力;领域服务的能力仅暴露在系统内部。
- API暴露的能力一般比领域服务少,因为领域服务还要给JobProcessor、MessageListener或其它领域服务提供服务。
分层原则(也是任何分层分域的一般准则)
- 架构解决的是变化的问题。根据子系统变化的快慢,对子系统进行分层,从而隔离变化。例如上面的基础域变化慢,业务域变化快,分开。
▐ Domain
为什么Domain层和Infrastructure层要依赖倒置?
- 通过依赖倒置,消除Domain层的外部依赖,完全隔离外部变化,实现自洽。
Repository和防腐层(Anti-Corruption)是什么?
- Repository就是DDD里的领域仓库,负责领域实体的生命周期管理(可以简单理解为增删改查)
- 防腐层(Anti-Corruption)是为了隔离变化而抽象出来的概念,负责和外部系统打交道。
Repository和防腐层(Anti-Corruption)的区别是什么?
- 从代码结构上来看是一样的。如果按设计模式来解读,本质上都是Adaptor。其中,本领域充当Adaptor中的client角色。即Repository和防腐层(Anti-Corruption)的接口签名是基于本领域的需求而设计(而不是基于外部系统的签名来设计)。这也是为什么Repository和防腐层(Anti-Corruption)要按域来组织,而不是按外部系统来组织。
- 从语义上来讲,Repository偏数据,防腐层(Anti-Corruption)偏功能。这种语义区分能提升系统可维护性。
▐ Infrastructure
什么决定了是放Domain层还是Infrastructure层?约定:访问中间件/外部系统的,放基础设施层。领域层只放领域逻辑,从而隔离变化。
基础设施从字面上看偏基础,为什么把中间件、外部系统放这里?按照洋葱圈架构的说法,这些其实都是适配器,都应该属于外部依赖的范畴
Utils放哪里,是不是基础设施的一部分?
- 不建议:如果认为工具是基础设施的一部分,则Domain层甚至API层将感知Infrastructure层,破坏了依赖单向性。
- 建议基础工具抽到单独的二方包;业务工具放到对应的Module。
回顾下整篇文章,咱们对于应用架构的混乱问题进行了总结与归纳,并给出了一些重点需要理解的内容,希望能对大家的日常开发有一些帮助。
附录
- 后端开发实践系列——领域驱动设计(DDD)编码实践 - Thoughtworks洞见(地址:https://insights.thoughtworks.cn/backend-development-ddd/)
- 实现领域驱动设计(地址:https://book.douban.com/subject/25844633//)
- Cola-阿里巴巴开源应用架构(地址:https://github.com/alibaba/COLA)
团队介绍
我们是淘天集团物流技术团队,服务淘天物流部及零售行业的产技团队,一直深耕在物流及供应链的数字化协同与运营领域:为零售业务提供灵活多样的经营模式管理方案及可以快速适配市场变化的经营策略数宇化管理工具;为商家提供高效低成本的物流及供应链解决方案,加快资金效率,提升协同效率;为消费者提供即时便捷的购物体验。