java DDD领域分层架构设计思想

1为什么要分层

  • 高内聚:分层的设计可以简化系统设计,让不同的层专注做某一模块的事
  • 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节
  • 复用:分层之后可以做到很高的复用
  • 扩展性:分层架构可以让我们更容易做横向扩展

微服务架构模型有很多种,例如洋葱架构、CQRS和六边形架构等。其核心理念都是为了设计出“高内聚,低耦合”的微服务。而DDD分层架构的出现,使微服务的架构边界变得越来越清晰。

DDD分层架构包含四层,从上到下依次是:用户接口层、应用层、领域层和基础层。
 

java DDD领域分层架构设计思想_第1张图片

DDD分层架构

1. 用户接口层

微服务应用面向不同前端应用时,同样一段业务逻辑,可能由于渠道不同,而在前端展示的页面要素,因此要求后端微服务返回的数据结果会不同。为了避免暴露微服务的核心业务逻辑,防止数据外泄,不能将后端对象的所有属性数据,不加区分地暴露给所有前端应用;更不能仅仅因为前端应用不同的数据展示要求,而后端定制开发出多个不同的应用服务或领域服务,面向前端应用提供不同的服务适配。保证应用层和领域层核心领域逻辑的稳定。

Facade服务:封装应用服务,适配不同前端应用的集成技术体系,提供不同类型的服务接口适配。数据组装器Assembler:根据不同前端应用的数据需求,完成前端DTO和后端DO对象的组装和转换操作。

2. 应用层

应用层连接用户接口层和领域层,不应该实现领域模型的核心领域逻辑。主要职能:协调领域层多个聚合完成服务的组合和编排。

应用服务主要负责:服务组合、编排和转发,处理业务用例的执行顺序以及结果的拼装。在应用服务中还可以进行安全认证、权限校验、事务控制、领域事件发布或订阅等。

3. 领域层

领域层是领域模型的核心,主要实现领域模型的核心业务逻辑。领域模型的业务逻辑主要由实体和领域服务来实现。其中实体会采用充血模型来实现业务功能,如单一实体(或值对象)不能实现时,就交由领域服务进行组合和协调聚合内多个实体(或值对象),实现复杂的业务逻辑。

4. 基础层

基础层贯穿DDD所有层。其职能:提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。

DDD分层架构的重要原则:每层只能与位于其下方的层发生耦合。

DDD分层架构特点和

(1)特点

  1. 数据、缓存等都视为基础层, 可以被所有层调用
  2. 抽离了领域层,负责核心业务逻辑处理,领域层调用外部依赖全部通过接口,以保证领域层的100%单测覆盖率
  3. 应用层聚合多个领域层的能力,只做功能的组合、转发,不负责具体业务逻辑

优点:相比于三层方式,更关注领域服务,即业务核心逻辑的划分、收敛

缺点:分层复杂, 如果业务逻辑简单没有必要

适应场景:业务复杂的业务

(2)和传统三层架构的对比

DDD四层架构也基于传统三层架构的,不同点有以下几方面:

  1. 关注点不一样:三层架构关注请求调用顺序;DDD架构关注领域服务。
  2. 横向划分方式不一样:三层架构主要关注纵向划分,对横向划分没有约定;DDD架构更关注纵向,即:多个领域层之间划分及交互方式。
  3. 对资源的定位不一样:三层架构把所有依赖的数据都放到数据访问层;DDD架构只将领域强关联的数据放到Repository中,其他比如API层缓存、文件等都当成基础服务来处理。


 

java DDD领域分层架构设计思想_第2张图片

DDD分层架构的优势

  1. 层间松耦合,成功降低了层与层之间的依赖。可以专注于本层的设计和开发,不担心会影响到其他层。

  2. 是程序的结构变得更加清晰,升级和维护变得更加容易,修改工作量小且范围可控。只要本层服务接口不变,其他层皆不用修改,即是结构发生变化,也只影响相邻的上层。

可参考地址:百度安全验证

可参考专家:DDD领域模型设计实战 - 知乎

你可能感兴趣的:(java,架构,java)