初识

沉淀、分享、成长,让自己和他人都能有所收获!😄
领域驱动设计DDD{Domain-Driven Design}历史较长但随着微服务的兴起DDD又活跃到人们的视线,它提供的是一套架构设计思想,我们可以使用这套方法论将架构设计的尽可能做到高内聚、低耦合、可扩展性强的应用服务。本专题以DDD实战落地为根本,分章节设计不同的架构模型。学习并实战是奔入应用级最快的方法,Hi HelloWorld!我来了。

#前言介绍

DDD(Domain-Driven Design 领域驱动设计)是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题。整个过程大概是这样的,开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上建立模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。
notion image
开发目标
依靠领域驱动设计的设计思想,通过事件风暴建立领域模型,合理划分领域逻辑和物理边界,建立领域对象及服务矩阵和服务架构图,定义符合DDD分层架构思想的代码结构模型,保证业务模型与代码模型的一致性。通过上述设计思想、方法和过程,指导团队按照DDD设计思想完成微服务设计和开发。
  1. 拒绝泥球小单体、拒绝污染功能与服务、拒绝一加功能排期一个月
  1. 架构出高可用极易符合互联网高速迭代的应用服务
  1. 物料化、组装化、可编排的服务,提高人效
服务架构
notion image
  • 应用层{application}
    • 应用服务位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装。
    • 应用层的服务包括应用服务和领域事件相关服务。
    • 应用服务可对微服务内的领域服务以及微服务外的应用服务进行组合和编排,或者对基础层如文件、缓存等数据直接操作形成应用服务,对外提供粗粒度的服务。
    • 领域事件服务包括两类:领域事件的发布和订阅。通过事件总线和消息队列实现异步数据传输,实现微服务之间的解耦。
  • 领域层{domain}
    • 领域服务位于领域层,为完成领域中跨实体或值对象的操作转换而封装的服务,领域服务以与实体和值对象相同的方式参与实施过程。
    • 领域服务对同一个实体的一个或多个方法进行组合和封装,或对多个不同实体的操作进行组合或编排,对外暴露成领域服务。领域服务封装了核心的业务逻辑。实体自身的行为在实体类内部实现,向上封装成领域服务暴露。
    • 为隐藏领域层的业务逻辑实现,所有领域方法和服务等均须通过领域服务对外暴露。
    • 为实现微服务内聚合之间的解耦,原则上禁止跨聚合的领域服务调用和跨聚合的数据相互关联。
  • 基础层{infrastructrue}
    • 基础服务位于基础层。为各层提供资源服务(如数据库、缓存等),实现各层的解耦,降低外部资源变化对业务逻辑的影响。
    • 基础服务主要为仓储服务,通过依赖反转的方式为各层提供基础资源服务,领域服务和应用服务调用仓储服务接口,利用仓储实现持久化数据对象或直接访问基础资源。
  • 接口层{interfaces}
    • 接口服务位于用户接口层,用于处理用户发送的Restful请求和解析用户输入的配置文件等,并将信息传递给应用层。

#开发环境

  1. jdk1.8【jdk1.7以下只能部分支持netty】
  1. springboot 2.0.6.RELEASE
  1. idea + maven

#代码示例

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
演示部分重点代码块,完整代码下载关注公众号;bugstack虫洞栈 | 回复DDD落地
application/UserService.java | 应用层用户服务,领域层服务做具体实现
1234567891011
domain/repository/IuserRepository.java | 领域层资源库,由基础层实现
123456789101112
domain/service/UserServiceImpl.java | 应用层实现类,应用层是很薄的一层可以只做服务编排
123456789101112131415161718192021222324252627282930313233343536373839
infrastructure/po/UserEntity.java | 数据库对象类
12345678910111213
infrastructrue/repository/UserRepository.java | 领域层定义接口,基础层资源库实现
1234567891011121314151617181920212223242526272829303132333435363738394041
interfaces/dto/UserInfoDto.java | DTO对象类,隔离数据库类
123456789101112131415161718
interfaces/facade/DDDController.java | 门面接口
1234567891011121314151617181920212223

#综上总结

  • 以上基于DDD一个基本入门的结构演示完成,实际开发可以按照此模式进行调整。
  • 目前这个架构分层还不能很好的进行分离,以及层级关系的引用还不利于扩展。
  • 后续会持续完善以及可以组合搭建RPC框架等,让整个架构更利于互联网开发。
微信搜索「bugstack虫洞栈」公众号,关注后回复「DDD落地案例」获取本文源码&更多原创专题案例!此外推荐你一个可以上手实践的DDD项目,看看如何从流程中提炼领域设计代码实现,在应用层、领域层以及基础层的仓储实现是如何完成开发和调用的,项目地址:https://t.zsxq.com/jAi2nUf
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP