知识卡片
松散分层架构的三个隐患:为什么不建议任意下层暴露给上层
内容
松散分层架构允许任意层直接依赖它下方的任意层,不要求逐级封装,实体方法和领域服务因此可以直接暴露给应用层甚至用户接口层。这种方式看起来省事,但书中指出三个具体隐患:一是容易把领域层核心业务的实现细节直接暴露出去,失去了封装这层”外壳”应有的保护作用;二是当某个实体方法或领域服务需要变更时,由于它可能同时被好几层的服务直接调用和组合,很难完整找出所有调用方,通知和修改所有受影响的服务变得困难;三是如果应用服务过多地直接访问实体或实体方法,容易在应用层沉淀本该属于领域层的业务逻辑——如果直接封装的是同一个聚合内的多个实体,会混淆应用层和领域层的边界;如果直接封装的是不同聚合的实体,会让原本该保持松耦合的多个聚合在应用层产生强依赖,破坏微服务未来演进的可能性。相比之下,严格分层要求每层只能向紧邻的上一层提供服务,虽然增加了逐层封装的样板代码工作量,但换来的是:核心逻辑不会被直接暴露、服务变更时只需要通知紧邻的上一层(而不是可能散落在各层的所有调用方)、聚合之间也不会因为应用层的越级调用而被迫产生强依赖——这正是本书明确不建议采用松散分层架构的原因。
参考来源
- 位置:《中台架构与实现:基于DDD和微服务》第17章《服务和数据在微服务各层的协作》"17.1.4 两种分层架构的服务依赖关系"(源文件:_epub-src/OEBPS/Text/chapter4-6-1-4.xhtml)
- 结论依据:原文说明"容易暴露领域层核心业务的实现逻辑……当实体方法或领域服务发生服务变更时,由于下层服务同时被多层服务调用和组合,不容易找出哪些上层服务调用和组合了它……如果应用服务过多地直接访问实体或实体的方法,就很容易在应用层沉淀太多的领域逻辑……不利于微服务架构的演进……基于以上分析和存在的问题,不建议采用松散分层架构的封装模式",直接支撑本卡片结论。
- 原始内容:容易暴露领域层核心业务的实现逻辑。当实体方法或领域服务发生服务变更时,由于下层服务同时被多层服务调用和组合,不容易找出哪些上层服务调用和组合了它,不方便通知和修改所有的服务调用方。