摘要

最近DDD设计很火,但是刚刚入门还是很懵,通过的学习DDD项目设计的结构目录来实现对DDD设计理解同时也是为大家在公司能够看懂公司的DDD项目结构目录做一个参考和学习。同时后期本人将推出更多的对DDD设计的理解。同时提供一个DDD设计的模板框架:https://github.com/2462612540/Senior-Architect/tree/a_1.0/Springcloud_microservice_ddd

DDD设计的四层

参考官方架构草图,DDD总体结构分为四层  :  Infrastructure(基础实施层),Domain(领域层),Application(应用层),Interfaces(表示层,也叫用户界面层或是接口层)。

对于DDD的设计而言,最重要的是如何去划分领域,划分好边界。在代码设计上,之前有看到过大佬用模块(Modules)来进行上下文界定和划分。而对于微服务而言,就非常适合从业务上去划分以上的各个Modules,划分好各个业务板块。

在实际开发中,我们一般会采用模块来表示一个领域的界限上下文,比如:抽奖上下文:com.xjl.business.lottery.*风控上下文:com.xjl.business.riskcontroller.*奖品上下文:com.xjl.business.prize.*活动资格上下文:com.xjl.business.qualification.*库存上下文:com.xjl.business.stock.*对于模块内的组织结构,一般情况下我们是按照领域对象、领域服务、领域资源库、防腐层等组织方式定义的。领域对象-值对象:com.xjl.business.lottery.domain.valobj.*领域对象-实体:com.hafiz.business.lottery.domain.entity.*领域对象-聚合根: com.xjl.business.lottery.domain.aggregate.*领域服务:com.xjl.business.lottery.domain.service.*领域资源库:com.xjl.business.lottery.domain.repo.*领域防腐层:com.xjl.business.lottery.domain.facade.*

微服务 + DDD,首先是从微服务的角度(如何划分微服务)考虑去划分大的业务模块,每一个微服务都应该是一个可以单独部署,各司其职的模块;而在微服务实际开发中,结合DDD的思想去划分所有属于自己的领域。

项目框架总体设计

Infrastructure(基础实施层)

Infrastructure 层 :  基础实施层,向其他层提供通用的技术能力(比如工具类,第三方库类支持,常用基本配置,数据访问底层实现).基础实施层主要包含以下的内容:

  • 为应用层传递消息(比如通知)
  • 为领域层提供持久化机制(最底层的实现)为用户界面层提供组件配置)
  • 基础设施层还能够通过架构框架来支持四个层次间的交互模式。

Domain(领域层)

Domain层 : 主要负责表达业务概念,业务状态信息和业务规则;是整个系统的核心层,几乎全部的业务逻辑会在该层实现。Domain层是整个系统的核心层,几乎全部的业务逻辑会在该层实现。领域模型层主要包含以下的内容:

  • 实体(Entities):具有唯一标识的对象
  • 值对象(value objects):无需唯一标识的对象
  • 领域服务(Domain Services):一些行为无法归类到实体对象或值对象上,本质是一些操作,而非事物聚合/聚合根(Aggregates,Aggregate Roots):
  • 聚合是指一组具有内聚关系的相关对象的集合,每个聚合都有一个root和boundary工厂(Factories):创建复杂对象,隐藏创建细节
  • 仓储(Repository):提供查找和持久化对象的方法

Application(应用层)

Application层 :  相对于领域层,应用层是很薄的一层,应用层定义了软件要完成的任务,要尽量简单。它不包含任务业务规则或知识,为下一层的领域对象协助任务、委托工作。它没有反映业务情况的状态,但它可以具有反映用户或程序的某个任务的进展状态。对外为展现层提供各种应用功能(service)。对内 调用领域层(领域对象或领域服务)完成各种业务逻辑任务(task)。这一层也很适合写一些任务处理,日志监控。

注 : 这里图里面所说的对内对外,对程序而言,事实上是从展现层调用应用层,应用层调用领域层,领域层或调用基础设施层。

Interfaces(表示层,也叫用户界面层或是接口层)

Interfaces层 : 负责向用户显示信息和解释用户命令,请求应用层以获取用户所需要展现的数据(比如获取首页的商品数据)。发送命令给应用层要求其执行某个用户命令(实现某个业务逻辑,比如用户要进行转账)用户界面层应该包含以下的内容:

  • 数据传输对象(Data Transfer 0bject):DTO也常被称作值对象,Vo,实质上与领域层的vO并不相同
  • DTo是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离。
  • 装配(Assembler):实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。
  • 表面,门面(Facade): facade的用意在于为远程客户端提供湘粒度的调用接口。它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller

总结

无论我们代码结构如何规划,也并非一成不变,应该从实际出发,去思考划分结构的意义。此例子是对于微服务+DDD反应到实际开发,代码的结构设计上的一种初步的思考与探索,一个样板工程,不应该成为我们对实际DDD思考与设计的限制。

  • 微服务架构设计,一个微服务应该就是一个可单独部署,可运行的应用,也就是微服务最小的运行单元。
  • 微服务本身内部高度内聚,微服务与微服务之间低耦合。
  • 首先对于应用划分上,就应该想清楚每个微服务的职责,每个微服务服务内部建立起自己的依赖,完成自己的职责和业务。
  • 微服务与微服务之间交互通过HTTP或RPC接口调用,降低微服务之间代码实现和业务的耦合。
  • 微服务的实现不应该受限某程序语言(或Java,或Go,或Python),不应该受限于某框架(或SpringCloud,或Dubbo,或各种RPC框架等等)。
  • 我的代码结构是对于一个微服务本身(即应用)划分的,领域是对于微服务内部本身而言的,即这个微服务涉及哪些领域。
  • 首先从大的方向去划分每一个微服务,然后再从每一个微服务确定所包含的领域,领域的边界,等等。
  • 比如划分了一个 认证授权服务,那么 领域可能有 用户,权限;实体可能有角色,资源等等。领域行为有授权登录,用户退出,授权等等。

博文参考

一个微服务+DDD(领域驱动设计)的代码结构示例_如果频繁就私信一下呢-CSDN博客
DDD领域驱动设计实战-分层架构及代码目录结构_JavaEdge全是干货的技术号-CSDN博客_ddd分层架构的代码结构

系统架构设计——DDD设计框架基本学习相关推荐

  1. Java生鲜电商平台-App系统架构开发与设计

    Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计 2.Java生鲜电商平台-App架构设计经验谈: ...

  2. mysql 亿级高并发_亿级流量系统架构之如何设计每秒十万查询的高并发架构.md

    亿级流量系统架构之如何设计每秒十万查询的高并发架构 一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入 ...

  3. 每秒10万并发 mysql_亿级流量系统架构之如何设计每秒十万查询的高并发架构

    一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入,同时如何在高并发写入的背景下还能保证系统的超高性能 ...

  4. 亿级流量系统架构之如何设计承载百亿流量的高性能架构【石杉的架构笔记】...

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 本文来源:石杉的架构笔记(ID:shishan100) 一.往期回顾 上篇文章<大型系统架构 ...

  5. 系统架构师—软件架构设计(二)CS/BS/SOA/DSSA/ABSD

    1.层次架构风格 1.1.两层C/S架构 客户端和服务器都有处理功能,相比较于传统的集中式软件架构,还是有不少优点的,但是现在已经不常用,原因有:开发成本较高.客户端程序设计复杂.信息内容和形式单一. ...

  6. 系统架构设计师的设计工作和需求

    系统架构设计师是产品经理的天花板,也是软考高级证书,系统架构设计师,并且还能够入选省专家人才库,成为副主任工程师,在实际落地项目中,要求就跟软考有些区别,但是需要落地,我就在这里介绍下架构师的能力和水 ...

  7. 腾讯云海外直播系统架构是怎么设计的?(附视频回放)

    | 导语 6月29日,音视频及融合通信技术技术沙龙圆满落幕.本期沙龙特邀请腾讯云技术专家分享关于最新的低延迟技术.全新的商业直播方案等话题,针对腾讯云音视频及融合通信产品的技术全面剖析,为大家带来纯干 ...

  8. APP系统架构方面的设计

    App开发的完整流程如下: 1. idea形成--APP项目雏形 一个APP项目的最初首先要确定项目整体方案,整个项目的规划,大体框架,做成文档展现出来,以便大家提意见和更好的改进.也就是说首先要确立 ...

  9. 系统架构师—软件架构设计(一)概述、构建、视图、基本架构风格

    1.软件架构概述 从需求分析到软件设计之间的过渡过程称为软件架构.只要软件架构设计好了,整个软件就不会出现坍塌性的错误,即不会崩溃. 架构设计就是需求分配,将满足需求的职责分配到组件上. 软件架构为软 ...

最新文章

  1. ARTS打卡计划第一周-Share-系统字典模块的设计
  2. 空值排序(oracle/sqlserver)
  3. 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
  4. mysql帖子排序_mysql - 无法按元值对帖子排序 - SO中文参考 - www.soinside.com
  5. C语音的预处理,编译,汇编,链接过程分析
  6. 将excel用VBA生成指定格式的TXT文件
  7. 实现接口java_Java – 实现接口
  8. 运放的主要参数详细介绍
  9. 借助TensorFlow框架,到底能做什么?
  10. 前端学习(2237):react实现疫情数据
  11. linux 管道交互,Linux C:具有独立读写命名管道的“交互式会话”?
  12. java容器类---概述
  13. 数据库类型约束自增长
  14. 《Android游戏编程入门经典》——4.6节问与答
  15. 编写xml文件不当时会出现R文件找不到情况
  16. 计算机组成原理(第3版)唐朔飞著 知识点总结 第五章输入输出系统
  17. BT06串口蓝牙模块的配置以及与电脑的配对
  18. xmanager连接linux7桌面,使用Xmanager连接CentOS 7远程桌面
  19. Spark SQL编程之RDD-RDD转换
  20. 爬虫python下载网站所有图片_爬取某图片网站多页图片的python爬虫

热门文章

  1. VUE+VSCODE(新建一个项目)
  2. linux php-fpm 配置文件,linux下php-fpm开启与关闭方法
  3. 一种多层级机构数据库表设计的思路及组织机构树数据库表设计
  4. java-php-python-晨光文具店进销存系统设计与开发计算机毕业设计
  5. 【项目评级】ArcBlock(ABT)-区块链基石网络
  6. POJ 1915(双向广搜)
  7. PAT乙级_1068 万绿丛中一点红 (20 分)_python
  8. 小型三维引擎设计实现-渲染层的设计总结
  9. 玩转华为数据中心交换机系列 | 配置基于子网划分VLAN示例
  10. 中科院计算所寒武纪团队DianNao系列论文导读