-- 知识铺
推荐关注
顶级架构师后台回复 1024 有特别礼包
来源:https://blog.csdn.net/u011487470/article/details/123369678
大家好,我是顶级架构师。
我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢?
一、专业术语
各种服务
IAAS:基础设施服务,Infrastructure-as-a-service
PAAS:平台服务,Platform-as-a-service
SAAS:软件服务,Software-as-a-service
二、架构演变
从图中已经可以很容易看出架构的演进过程,通过对三个层的举例来进行说明:
SAAS:比如我们最早的就是单体应用,多个业务之间可能都没有进行分层,之后我们业务多了,都各自混淆在一起,后来我们就通过MVC、SSM、分层等方式进行业务拆分,保证业务与业务之间解耦
PAAS:随者业务的增长,我们打算分离出一个子系统,但是成本太高,每次都需要从头搭建一个子系统,效率低下。这时我们就抽取除了一些通用技术,比如mesh、SOA、微服务等方式来隔离系统,且对通用技术复用来快速搭建一个系统
IAAS:比如订单服务并发量高,单台服务器已经无法满足要求,这时我们需要多台服务器,可能有windows的、linux、mac,想要快速部署就需要屏蔽OS,于是就有了VM、Docker、K8S等技术来屏蔽OS
三、限界上下文
限界上下文概念
BC与业务的关系:
通过对业务的划分,比如订单系统,订单是一个子域;库存是一个子域;
其中商品再不同的子域中所表示的意义也不同,比如在订单上下文中的商品表示商品的单价、折扣等等;而在库存的上下文中商品表示商品的库存量、成本、存放位置等。
BC与技术的关系:
多个子域之间必须需要在应用层进行聚合,而聚合的过程中就引出了技术方案,比如订单到库存到支付,他们应该采用同步方式;这几个子域调用通知都应该是异步,那么可能就需要消息中间件或其它技术方案
<p mp-original-font-size="17" mp-original-line-height="25.600000381469727"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="4" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImaged6b6de4cb704e1001be7584d.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="5" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImagefdc8395221452bb0080a1c5f.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="6" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImageb81c44c384d8b989b81e1c22.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="7" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImagec82d10eb1b307508a96026fa.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="8" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImagea1f9e832ce92e4fd09559504.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"><img data-ratio="1" data-type="png" data-w="64" data-src="https://mmbiz.qpic.cn/mmbiz_png/b96CibCt70iaajvl7fD4ZCicMcjhXMp1v6UXcBIdyPOYfUfaibicSXbZSrkFL9jwZRTUz8aKA1zXq1GDV8Z7uXeep6w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1" data-original-style="box-sizing: border-box !important;margin: 0px;padding: 0px;outline: 0px;vertical-align: bottom;border-style: none;max-width: 100%;overflow-wrap: break-word !important;height: auto !important;line-height: 25.6px;font-size: 16px;visibility: visible !important;max-height: 20px !important;width: 20px !important;" data-index="9" src="https://cdn.jsdelivr.net/gh/zshipu/imagesv2@main/2024/downloadedImagebf5b7531f69bac90c37da41c.png" _width="20px" crossorigin="anonymous" alt="图片" data-fail="0"></p><p mp-original-font-size="17" mp-original-line-height="25.600000381469727"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzU1NjYxNDc2OQ==&mid=2247494973&idx=1&sn=3845f08876076eaafe1457a48b752f20&chksm=fbc0f823ccb77135921333d9cd41569f223cd85ffea3095a8ced1e711263f8698e0884a5cce0&scene=21#wechat_redirect" textvalue="牛逼啊!接私活必备的 N 个开源项目!赶快收藏吧" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1"><span mp-original-font-size="14" mp-original-line-height="25.600000381469727">牛逼啊!接私活必备的 N 个开源项目!赶快收藏吧</a></p>
限界上下文划分规则
一般来说,先考虑团队规模,来决定最终需要划分到多细粒度的BC,如果团队规模过小而BC过细,则对后期的运维、部署、上线都会造成很大的负担;
在确定好粒度后,可以对语义相关性、功能相关性-业务方向、功能相关性-非业务方向进行划分
按照以上的规则划分之后就得到了多个BC啦
一个BC代表一个微服务吗?
概念:微服务一般是指将高度相关功能的一个开发部署单元,有自己的技术自治性、技术选型、弹性扩缩容、发布上下频率等,说白了就是各自维护一个业务,然后多个业务组成一个系统,多个业务之间各自管理
关系:这里的BC其实就是一个领域或一个模块或一个业务,如果两个领域相关性很高,就可以包含多个BC,或者如果一个领域访问量非常大,则需要部署在一个微服务中以提高性能
四、领域驱动设计的四重边界
根据上图所示,我们通过四重来进行架构设计:
分而治之:DDD通过规划四重边界,把领域知识做了合理的固化和分层。业务有核心领域和支持域、业务域中又拆分成多个限界上下文(BC),一个BC中又根据领域知识核心与否进行分层,领域层中按照多个业务(子域)的强相关性进行聚合成一个子域。另外,搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。
【第一重边界】确定项目的愿景与目标,确定问题空间,确定核心子领域、通用子领域(多个子领域可以复用)、支撑子领域(额外功能,如数据统计、导出报表)
【第二重边界】解决方案空间里的限界上下文就是一道进程隔离层面的物理边界
【第三重边界】每个限界上下文内,使用分层架构划分为:接口层、领域层、应用层、基础设施层之间的最小隔离
【第四重边界】领域层里为了保证各个领域的完整性和一致性,引入聚合的设计作为隔离领域模型的最小单元
五、整洁分层架构
具体说明看图中备注,总的来说就是通过实现与接口分离,让domain层尽量独立,而不耦合与任何模块,这里面包含了领域模型的业务逻辑代码,但不会依赖于具体技术实现,可以很方便更换基础设施层,提供给第三方web调用service
六、六边形架构
主动适配:指来⾃于UI、命令⾏等输⼊型命令, controller就是⼀种端⼝,端⼝的具体实现就是应⽤逻
辑⾃身。因此端⼝和具体实现都在应⽤系统的内部。
被动适配:指访问存储设备,外部服务等。每种访问就是⼀种端⼝,具体实现是各个具体的中间件。因此端⼝在整个应⽤系统的⾥部,具体实现在系统的外部。扩展:接私活儿
每⼀种输⼊和输出都是⼀个端⼝,每个端⼝都有具体的实现逻辑,因此整个应⽤系统的架构就是⼀些列的端⼝+适配逻辑组成,架构图就是⼀个多边形形状。有⼏个端⼝需要根据应⽤系统的具体情况⽽定,只是六个端⼝⽐较形象⽽得名为六边形架构。
特点:
1. 外层依赖内层使得依赖更合理。端⼝就是接⼝,依赖接⼝编程。借此保证了应⽤和实现细节之间的隔离。
2. 可测试更好
七、洋葱架构
洋葱架构针对六边形架构更进⼀步把内层的业务逻辑分为了DDD概念的应⽤服务层、领域服务层和领域
模型层。
特点:
(1)围绕独⽴的领域模型构建应⽤
(2)内层定义接⼝,外层实现接⼝
(3)依赖的⽅向指向圆⼼(注意:洋葱架构提倡不破坏耦合⽅向的依赖都是合理的,外层可以依赖直接内层,也可以依赖更⾥⾯的层)
(4)所有的应⽤代码可以独⽴于基础设施编译和运⾏
八、总结
目前领域驱动设计是目前比较流行的一种架构设计,只需要按照领域驱动设计的四重边界进行架构设计,就能够很好的对各个领域解耦,对后期的业务垂直扩展、功能的水平扩展提供了良好的基础。
欢迎大家进行观点的探讨和碰撞,各抒己见。如果你有疑问,也可以找我沟通和交流。
最后给读者整理了一份BAT大厂面试真题,需要的可扫码回复“面试题”即可获取。
公众号后台回复 架构 或者 架构整洁 有惊喜礼包!
顶级架构师交流群
「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进架构师群,加我时注明**【**姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
猜你还想看
Spring Boot 配置 HTTPS 详细流程,还有谁不会?
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240627/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1DDD%E7%9A%84%E5%87%A0%E7%A7%8D%E5%85%B8%E5%9E%8B%E6%9E%B6%E6%9E%84%E4%BB%8B%E7%BB%8D%E5%9B%BE%E6%96%87%E8%AF%A6%E8%A7%A3--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com