DDD Lite:DDD 领域驱动设计微服务简化版

异步流沙
• 阅读 8757

DDD Lite

DDD 领域驱动设计的大名大家应该都有所耳闻,但是实际项目完整落地 DDD 的很少。因为 DDD 概念繁杂,领域、子域、核心子域、通用子域、实体、值对象、领域服务、应用服务、领域事件、上下文等一大堆概念,直接把人绕晕,对应到实际业务模型时,横看成岭侧成峰,开发人员内部都难以达成一致。

因为 DDD 设计之初目标是作为复杂软件解决之道,但我们大部分应用并没有那么复杂,一个简单的应用使用这么一套复杂的概念,有点弄巧成拙。在微服务时代,设计原则就是根据领域划分上下文,单体应用复杂度大大降低,微服务需要一种精简的架构。

这里我提出轻量级 DDD 架构: DDD Lite,让其更好的契合微服务。

分层架构在 MVC 中就被广泛采用,DDD 中也有四层架构、五层架构、六边形架构等多种流派。 DDD Lite 采用较为简单的四层架构,自上而下为:

  • Interface
  • Service
  • Model
  • Infrastructure

分层

Interface

接口层。

对外提供 HTTP,RPC 等接口,参数校验、编解码等逻辑在本层处理,业务状态码、对外数据结构在本层定义。

Service

服务层。

主要业务逻辑层,调用 Model 层 Repository 接口实现领域业务逻辑,事务组装。一个 Service 对应一个领域,领域是指相似业务逻辑的归类。一个微服务一般只有一到两个 Service,不宜过多。

Model

数据模型层。

定义数据结构,以及数据模型对应的 Repository 接口,但不包含具体实现。多个相关 Model 组成领域,此处对领域进行简化,不再纠结于子域、实体、值对象等细粒度概念。围绕 Model 定义 Repository 接口,不掺杂业务逻辑,供 Service 层调用,方便在 Service 层组成事务。

Repository pattern

这里单独讲一下 Repository 设计模式,这是设计好数据模型的重中之重。

Repository 模式即是将对数据结构的操作抽象成接口,将业务逻辑(business logic)和数据处理(data access)分离,加入了一个抽象层。

有了 Repository 接口,依赖就从具体变成抽象,和 DB 等基础层依赖解耦,方便实施 TDD(测试驱动开发)。

Repository 接口应该保持细粒度,设计得足够通用,减少业务属性,方便复用。

Infrastructure

基础设施层。

实现 Model 层 Repository 接口,对接 DB、MQ 等数据持久化,或者 RPC 远程调用后端服务。

同时也可以提供 Repository fake 实现,供 Service 层单元测试使用。

总结

DDD 中的很多方法论,其中大部分大家在项目工程中都见过或者实践过。但 DDD 要求的前提过于理想,比如什么领域专家,通用语言等前提,在民工式敏捷开发,需求朝令夕改,996加速的大环境下,过于虚幻,难以落地。 所以我们没必要全盘照搬,应该因地制宜,去取精华去其糟粕,提炼出适合自己的应用架构。DDD Lite 对 DDD 设计模式进行了简化,是作者对 DDD 的理论结合实际工程经验的一些总结和思考。

DDD Lite 架构仅为个人理解,如有高见,欢迎交流。

完整项目代码:win5do/go-microservice-demo (github.com)

Reference

DDD 分层架构:https://www.yyang.io/2015/12/31/DDD-and-Layered-Architecture/

国外大佬提出的 DDD Lite 架构: https://threedots.tech/post/ddd-lite-in-go-introduction/

国内大佬完整遵循 DDD 设计的 Go demo,个人觉得略显繁琐:https://github.com/agiledragon/ddd-sample-in-golang

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
DDD领域驱动设计实战
整洁架构、CQRS、六边形架构等微服务架构都旨在“高内聚低耦合”。那DDD分层架构又如何?1DDD分层架构1.1分层架构的基本原则每层只能与位于其下方的层发生耦合。1.2分层架构的分类严格分层架构(StrictLayersArchitect
Wesley13 Wesley13
3年前
DDD领域驱动
DDD领域驱动领域驱动模型。模型驱动代码接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言而不是数据,重点不同导致编程世界观不同。具体的问题,具体解决,以后遇到相同的问题,这个问题就成了领域DDD是解决复杂中大型软件的一套行之有效方式,在
Wesley13 Wesley13
3年前
DDD 领域驱动设计简述
目录文章目录目录传统分层架构存在的问题领域驱动设计领域驱动设计思想领域驱动设计面临的问题传统分层架构存在的问题!在这里插入图片描述(https://imgblog.csdnimg.cn/20200914233249156.pngpic_center)
Wesley13 Wesley13
3年前
DDD领域驱动设计
C进阶系列——DDD领域驱动设计初探(七):Web层的搭建(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Flandeanfen%2Fp%2F4920577.html)C进阶系列——DDD领域驱动设计初探(六):领域服务(https://w
Wesley13 Wesley13
3年前
DDD 领域驱动设计使微服务更好地落地
!(https://oscimg.oschina.net/oscnet/2e0cb8f726f146669f1c4aacfb327d52.png)DDD介绍DDD(领域驱动设计)早在2003年就被提出,但当时国内开发环境较为单一,完全用不到DDD,也就没有团队去研究和布道。最近几年,
郑文 郑文
1年前
DDD(领域驱动设计)思想解读及优秀实践
DDD(领域驱动设计)思想解读及优秀实践download》quangneng.com/1964/DDD是什么DDD(DomainDrivenDesign,领域驱动设计)是一种软件开发方法论,它提供了一种方式来设计软件应用程序,以满足复杂需求。该方法将重点放
京东云开发者 京东云开发者
11个月前
【理论篇】关于聚合根,领域事件的那点事---深入浅出理解DDD
作者:京东物流赵勇萍前言最近有空会跟同事讨论DDD架构的实践落地的情况,但真实情况是,实际中对于领域驱动设计中的实体,值对象,聚合根,领域事件这些战术类的实践落地,每个人理解依然因人而异,大概率是因为这些概念还是有一些抽象,同时有有别于传统的MVC架构开发
DDD技术方案落地实践 | 京东云技术团队
1\.引言从接触领域驱动设计的初学阶段,到实现一个旧系统改造到DDD模型,再到按DDD规范落地的3个的项目。对于领域驱动模型设计研发,从开始的各种疑惑到吸收各种先进的理念,目前在技术实施这一块已经基本比较成熟。在既往经验中总结了一些在开发中遇到的技术问题和