18 | 知识点串讲:基于DDD的微服务设计实例
18 | 知识点串讲:基于DDD的微服务设计实例
讲述:欧创新
时长21:20大小14.63M
项目基本信息
战略设计
1. 产品愿景
2. 场景分析
3. 领域建模
4. 微服务的拆分
战术设计
1. 分析微服务领域对象
2. 设计微服务代码结构
后续的工作
1. 详细设计
2. 代码开发和测试
总结
思考题
赞 38
提建议
精选留言(91)
- movesan2020-05-23从第一课看到这里,终于有了一些领域建模的一些理解,希望可以慢慢的打开这扇门。 战略设计阶段: 此阶段主要是依赖于事件风暴(可理解为基于事件流程的头脑风暴),来呈现出产品的发展方向以及核心流程和场景,并文档化。 1.产品要解决的问题,以及从用户角度归纳出典型业务场景,落实文档 -----> 产品愿景、场景分析 2.找出上一步总结出的关键名词,作为各个场景的实体 -----> 领域建模:找出领域对象 3.根据上一步总结出实体,总结出之间的关系(聚合根、值对象、普通实体),划分出聚合 -----> 领域建模:定义聚合 4.以上一步归纳出的聚合为单位,根据业务场景将聚合分组,得到限界上下文(也就是所属的领域) ----->领域建模:定义界限上下文 感觉在第 1 步落实文档后,后面的 2,3,4 领域建模阶段都要不断的参照第 1 步总结出的业务流程场景来进行拆解与合并; 产品愿景、场景分析 两个阶段是从宏观到微观的过程,而 领域建模阶段是从微观到宏观的过程,也就是自底向上的思想。整体就像是总分、分总的过程。 战术设计阶段: 有了战略设计阶段的结果,反而战术设计阶段相对清晰一些。 1.按照 DDD 四层模型建包 2.确定聚合中的对象关系 3.通过战略设计阶段文档中的命令、事件来编排充血模型的领域对象,构建应用服务与领域服务 以上是初识领域驱动设计自己的一些理解,感觉如果战略设计阶段清晰完整,后面的战术设计阶段(代码落实阶段)会相对更容易一些。展开
作者回复: 理解的很好。
30 - 盲僧2019-11-25新哥,把代码放到git上给兄弟们个地址吧
作者回复: 我需要时间整理一下哈,等好了再共享。
共 3 条评论24 - Aries2019-12-30命令和事件那块感觉有些模糊,比如下单是命令还是事件呢? 按照我们的系统设计,下单则是事件。
作者回复: 下单是命令,订单已下单是事件。
共 4 条评论15 - iMARS2020-10-12请教老师一个问题,在上述考勤系统中,在人员实体和组织关系实体之间,如何抉择人员是聚合根,而组织关系不是?或者说判断聚合根的依据是什么?谢谢
作者回复: 判断一个实体是否是聚合根,你可以结合以下内容进行分析。是否有独立的生命周期?是否有全局唯一 ID ?是否可以创建或修改其他对象?是否有专门的模块来管理这个实体等。 聚合根管理了聚合内所有实体和值对象的生命周期,我们通过聚合根就可以获取到聚合内所有实体和值对象等领域对象。一般来说,如果聚合根被删除了,那么被它引用的实体和值对象也就不会存在了。 这个场景是以人员关系管理为主,所以人员就成为了聚合根,而组织关系只是描述人员之间的关系,所以成为实体,被人员聚合根引用。
共 2 条评论13 - zj2019-12-01我觉得老师可以讲一下CQRS,毕竟微服务好多都是要查询的哈哈
作者回复: CQRS其实就是读写分离,主要解决DDD的复杂查询问题。一般是写库和读库分离,但是实效性不容易保证。其实你也可以在同一个库,用领域或者应用查询服务来完成复杂查询的。
共 3 条评论8 - Alex zhang2019-11-25老师,代码有github链接吗
作者回复: 本来没准备放代码的哈,我后面花时间整理一下吧。
共 3 条评论6 - 风2020-11-10老师这篇文章对DDD的理解效果非常高,实际的案例分析过程有一种Ddd不再是飘在空中,有点落地的感觉了,谢谢老师👨🏫,真的很用心
作者回复: 感谢,掌握了DDD的设计思想和过程,相信微服务的拆分和设计不再是难事。
5 - 古腪2020-05-29有个场景希望老师帮分析下,一个是用户可以有多个角色,一个角色有多个用户,并且有多个权限,一个是权限可能配置多个角色,这种情况要怎么设计聚合咧?
作者回复: 你看这样设计合适不?用户、角色和权限是三个不同的聚合,其实这三个聚合最关键的是用户聚合。角色和权限实际上属于配置类聚合。我们在完成用户的权限或者角色配置后,可以将角色和权限聚合相关的数据复制到用户聚合,作为用户聚合根的值对象。只要能够找到用户,就可以获取角色和权限的基本数据。
共 3 条评论4 - Tan2019-12-24产品愿景可以不安上面的来吗? 我的理解就是 1、产品是为谁服务 2、解决了什么问题 3、给产品确定名称 4、给产品定义功能 5、竞品分析 6、本产品的优势展开
作者回复: 可以的啊,这只是一种手段。只要你们统一团队语言和目标,找到产品的核心价值点,多种方法都可以。
3 - Keith2021-04-18关于场景分析中的第一个场景的"请假人登录系统:从权限微服务获取请假人信息和权限数据,完成登录认证。", 这"权限微服务"哪里来, 业务场景还没确定怎么可能知道有哪些微服务, 而且用户也感知不到这些技术细节共 2 条评论2
- 大飞2020-09-30新哥,问个有点奇怪的问题,在设计过程中,对于一些复杂的流程细节没考虑到位,或者忽略了某个细节流程,而导致在程序落地过程中,发现原有的建模不够严谨,对于这种场景,有什么补救措施吗,或者如何避免这一问题的发生?
作者回复: 这个可能需要分一下几类情况来处理。 1、如果是聚合内实体的业务逻辑没考虑到,只需要修改对应实体内的属性或者方法即可。 2、如何是聚合内实体之间的关系没考虑到,调整或新增领域服务,或者聚合根的方法即可。 3、如果是在同一个限界上下文内的聚合之间的关系没考虑到,在应用层的应用服务中调整或新增即可。 4、如果是聚合划分到了错误的限界上下文内,整体将聚合内所有对象和代码调整到合适的限界上下文即可,并重新建立新的限界上下文内聚合之间的关系。
2 - JKing2020-05-06应用层我理解其实就是BFF
作者回复: BFF是位于微服务之上,它的主要职责是负责微服务之间的服务协调和编排。而应用服务主要处理微服务内的服务组合和编排,它可以组合和编排领域服务。在小型项目里,它也可以编排其它微服务的应用服务。 在设计时我们应尽可能地将可复用的服务能力往下层沉淀,在实现能力复用的同时,还可以避免跨中心的服务调用。 BFF像齿轮一样,来适配前端应用与微服务之间的步调。它通过Facade服务适配不同的前端,通过服务组合和编排,组织和协调不同的微服务。 BFF微服务可根据需求和流程变化,与前端应用版本协同发布,避免中台微服务为适配前端需求的变化,而频繁地修改和发布版本,从而保证微服务版本和核心领域逻辑的稳定。
2 - zj2019-11-26推广活动为一个聚合,直播推广为一个聚合,但是这两个聚合之间又是有联系的,比如直播推广可以参与推广活动。那这样这个命令到底属于哪个聚合呢?还是说将推广活动作为一个值对象呢
作者回复: 聚合内有实体吧,看看这些实体跟那个聚合根关联紧密,生命周期归聚合根管理,就放在跟聚合根在一起的聚合内,如果别的聚合要用,有两种方案,第一种是通过聚合根引用实体。第二种方案,在另外的聚合内将这个实体设计为值对象或者实体,值对象或实体的数据来源于另外的那个聚合的实体。
2 - Sylo Tsui2021-11-18需要DDD项目事例的,可以参考下开源项目SpringBootAdmin: https://github.com/codecentric/spring-boot-admin/tree/2.2.x 的 spring-boot-admin-server模块。当时看到还是深受裨益的。1
- Geek_8dfa3e2021-01-30中台和应用的边界怎么定义?应用会有实体对象吗?哪些实体对象会落中台,哪些落应用
作者回复: 我写的这篇文章里面有他们关系的详细介绍:https://xie.infoq.cn/article/cc8ab87bda888d0dfa686fc91
1 - Jie2020-06-13窗外37度,空调房内看得酣畅淋漓,之前的知识都串起来了!
作者回复: 很好哈。
1 - 小之2020-05-25老师你好,我看这边直接从限界上下文入手了,这边为什么没有聊子域划分问题呢,子域和限界上下文的区别一直是个老大难问题,一个在问题空间,一个在解决方案空间,我们日常怎么取舍呢
作者回复: 业务领域的子域划分其实是一种比较粗的领域边界的划分阶段,它不考虑子域内的领域对象以及对象之间的关系和层次结构。子域的划分往往可以按照业务流程或者功能模块的边界进行粗分,其目的就是为了逐步缩小业务边界,让你能够在一个相对较小的空间内,比较舒适的用事件风暴来梳理业务场景,构建领域模型。 关于子域与限界上下文的关系。其实你可以这样理解,有时候业务领域太大,不方便开展事件风暴,那我们就先把领域分解成若干个大小合适的子域,然后在这些子域内开展事件风暴,划分限界上下文完成领域建模。 限界上下文本质上也是子域,只不过它更多的考虑这些领域对象的语义边界。限界上下文的划分体现的是一种更为详细的设计过程,这个过程划分了业务的上下文语义边界,完成了领域模型,明确了领域对象以及领域对象之间的依赖关系等。
共 2 条评论2 - alex2019-12-10有没有一个基于 DDD 设计实现的实际可用的开源项目可以分享下
作者回复: 正在准备,好了会通知大家的。
1 - 霹雳大仙pp2019-12-02审批规则值对象有查询审批规则方法?这里不是很明白。 不应该通过领域服务或者聚合根来做查询吗?这里的值对象是充血模型? 望老师回复。
作者回复: 审批规则有两个,一个是审批规则的配置数据,独立存在。另一个是保存在请假单上的审批规则,它根据请假基本信息匹配审批规则配置数据后获得,只要请假基础数据不变,你就不需要在每次提交审批的时候去查询审批规则的配置数据。依附于请假单的这个审批规则是值对象。
共 3 条评论1 - MaLu2019-11-25这篇实例,将之前的铺垫进行的应用,很有参考与启发,我已珍藏为行动指南。
作者回复: 照着样例来试着做几个,慢慢就能体会到DDD的设计精要了。
1