大家好,我是大头,职高毕业,现在大厂资深开发,前上市公司架构师,管理过10人团队!
我将持续分享成体系的知识以及我自身的转码经验、面试经验、架构技术分享、AI技术分享等!
愿景是带领更多人完成破局、打破信息差!我自身知道走到现在是如何艰难,因此让以后的人少走弯路!
无论你是统本CS专业出身、专科出身、还是我和一样职高毕业等。都可以跟着我学习,一起成长!一起涨工资挣钱!
关注我一起挣大钱!文末有惊喜哦!
关注我发送“MySQL知识图谱”领取完整的MySQL学习路线。
发送“电子书”即可领取价值上千的电子书资源。
发送“大厂内推”即可获取京东、美团等大厂内推信息,祝你获得高薪职位。
发送“AI”即可领取AI学习资料。
什么是领域驱动设计DDD
领域驱动设计(Domain-Driven Design,简称DDD)是由美国软件专家埃里克・埃文斯(Eric Evans)在2004年提出的软件设计方法论,旨在解决复杂软件系统开发过程中业务逻辑与技术实现之间的矛盾,提升软件系统的可维护性、可扩展性和灵活性。
说人话就是:
- What: 它是一种设计思想、一种指导原则。
- When: 设计微服务的时候,或者说,不知道怎么拆分微服务的时候。
- Why:为什么要用它,上面其实说了,不知道怎么拆分微服务的时候,可以用它来指导你如何拆分微服务。
- How:这个后面讲。
很多人都说,DDD是用来处理复杂
业务逻辑的,那多复杂
才算复杂
业务呢?
这个问题,其实和微服务什么时候用
是一个问题。
所有的技术都不是银弹
。都有适合它的使用场景。
拿微服务来说,你一个小公司,就两三个开发,硬要上微服务,拆好几个服务出来,有什么意义
吗?
是提升性能了?
是增加开发效率了?
都不是,你会发现拆分完以后,程序反而三高
了。
- 高复杂度:程序变得更加复杂了。
- 高维护成本:程序的维护成本增加了、当有需求需要修改的时候、开发效率反而降低了。
- 高运维成本:原来一台机器就满足了,你拆的服务多了,一台机器不够了。要么加机器性能要么加机器数量。
所以,适合
很重要。
俗话说的好,见人说人话,见鬼说鬼话。技术也一样。
基本概念
- 实体:使用充血模型实现的实体,既有属性、也有方法。
- 值对象:只有属性的类。
- 聚合根:一个特殊的实体,聚合的入口。
- 聚合:聚合是一个概念、也可以理解成一个模块。聚合内包含了聚合根、实体、值对象。
- 限界上下文:分割领域的边界、也是分割微服务的边界,通过这个边界明确这个接口属于哪个领域,也就是属于哪个微服务。每个领域有每个领域的上下文。
- 领域:领域也就是我们的领域模型,也可以是一个微服务。
- 子领域:一个领域可以分成多个子领域。这个就是粒度的问题了。
- 领域事件:领域之间通信的方法。通过这个来调用其他的微服务。
还有一些核心领域、支撑领域、通用领域等,都是领域的一种,作用不同而已。
领域
一个领域
里面包含了多个子领域
,如图所示。
一个子领域
里面包含了多个聚合
,每个聚合里又有一个聚合根
作为入口,还有若干个实体
和值对象
。
那领域到底是什么?子领域又是什么?我们该如何划分领域?
如果大家看过仙侠小说、电视剧等,应该听过一些词,比如神之领域
、绝对领域
、恶魔的领地
、领主
等等。
我们可以简单的把领域
理解成领地、封地、画地为牢。
皇上将方圆百里的地分给你了,让你当这片封地的领主,那么这方圆百里就是你的领域了
那服务的领域是什么样子的呢?
同样的,我们把完整的服务想象成中国的领域,然后划分成各个省份。子领域就是每个省份下面的市区,再有子领域就是市区下面的县。
关于子领域也有一些划分,比如
- 核心领域:核心领域是业务的核心竞争力所在,直接体现业务的独特价值。领域中的核心业务,核心竞争力,领域的重点。比如湖北省这个领域,他的核心子领域就是
武汉市
。 - 通用领域:通用领域是指那些在多个业务中都可以复用的领域,通常不包含业务特有的逻辑。一个领域中通用的能力,可以放到通用领域。比如湖北省这个领域,他的通用领域就有
交通
。因为不管是哪个市,下面都会用到交通,交通还可以划分为地铁、公交、高铁、火车等。 - 支撑领域:既不属于核心领域、也不是通用领域。但是又必不可少的领域。为核心领域提供支持的领域,虽然重要但不直接体现业务的核心价值。
核心领域
特征:
- 对业务成功至关重要。
- 具有高复杂性和高价值。
- 通常需要投入最多的资源和精力。
- 一个领域中的核心,业务的重点发展对象。
为什么现在很多人开始使用DDD?无外乎是因为DDD更加契合业务,可以随着业务形态的改变,来带动代码的改变。
比如一个电商公司,一开始是以产品质量作为卖点,那么他们的核心领域
就是产品质量领域
。或者说商品领域
。而商品领域再进行划分子领域,他们的核心子领域就是质量领域
。
而另外一家公司虽然也是电商公司,但是主要依靠广告业务赚钱,那么他们的核心领域
就是广告领域
。
同样的,核心领域是会变化的,比如第一家公司一开始的产品卖点是质量过硬。后来做大了以后主要依靠流量
的增涨来扩大收益,那么核心领域就会变为流量领域
。
在演进到后面,可能如何为用户推荐合适的商品来促成交易就变成了业务重点,那么这个时候的核心领域
就是推荐算法领域
了。
具体哪个领域是核心领域,需要大家一起讨论、深入了解公司的业务。
这样才能决定出核心领域。
通用领域
特征:
- 低复杂性,易于复用。
- 通常可以通过第三方工具或框架实现。
- 不需要大量定制开发。
通用领域顾名思义,就是提供一些通用能力的领域,比如发送消息、权限认证等等。
这个根据公司的业务来看的。
比如一些公司需要签合同使用电子签章
,那么这也算是一个通用的功能,可以是一个通用领域。
再比如常用的限流功能
。也可以是一个通用领域。
支撑领域
特征:
- 中等复杂性和中等价值。
- 主要用于辅助核心领域的实现。
- 可以通过一定程度的定制开发满足需求。
- 支撑领域既不属于核心领域
支撑领域和通用领域不同的点就在于它和业务有一些关系。
比如,对于电商公司来说,核心可能是商品领域,那么为商品领域提供支撑的业务领域就是订单领域
、库存领域
、物流领域
等。
如何划分不同的领域
- 关注业务价值
- 优先识别对业务成功最重要的部分,这通常是核心领域。
- 核心领域的设计和实现需要投入最多的资源。
- 关注领域的独立性
- 每个领域应尽量独立,避免领域之间的强耦合。
- 独立性强的领域更容易划分为限界上下文(Bounded Context)。
- 关注领域的复用性
- 通用领域应尽量复用现有的工具或框架,避免重复开发。
- 支撑领域可以适当定制,但不应过度复杂化。
- 动态调整
- 领域划分并非一成不变,随着业务发展和需求变化,领域的类型可能需要重新评估和调整。
领域的划分是前期的重要工作,只有领域划分好了,后续的路才好走,如果领域划分的不对,那么后续还需要重构,就会比较浪费时间。
一般来说,领域划分都是首先通过事件风暴
来进行的,参与整个事件暴风的人包括领域专家、业务专家、研发、架构师、产品等等。
须知人力有尽时,一个人的想法终归是有限的,只有集思广益,才是长久之道。大家在事件风暴之中应该畅所欲言、没有上下级的关系,如此方可,要不然很多人摄于上级的压迫,不敢说话,或是说了以后被上级否定,这样的话是不利于事件风暴进行的。
在事件风暴之中应该鼓励
大家发言,不要去盲目的否定,更不要搞什么一言堂。
通过事件风暴我们可以识别出领域、子领域,还有聚合、事件等。
接下来我们就需要判断哪些是核心领域,哪些是通用领域,哪些是支撑领域。
有些人可能会问,为什么要划分出核心领域、支撑领域、通用领域呢?
这是因为大家的精力有限,要把大部分的精力投入到最重要的事情上去,也就是放到核心领域的建设上面。至于通用领域和支撑领域,如果人手不够也可以通过外包解决。
毕竟,核心领域才是最重要的领域。
上面也说过了,公司的不同时期,关注的业务重点不同,那么核心领域也会变化。
同样的,哪怕都是电商公司,他们的核心领域也不一定一样,一切都要看具体的业务。
而我们的重点就是要放在核心领域的建设上面。
总结
我们主要介绍了领域的概念,包括如何划分,还有核心领域、通用领域以及支撑领域等。还介绍了一些DDD的基本概念。
领域的核心思想就是两点
- 将我们的业务自顶向下的进行细分,逐步的拆解。
- 划分出不同的领域,将我们有限的精力投入到最重要的事情当中。
文末福利
关注我发送“MySQL知识图谱”领取完整的MySQL学习路线。
发送“电子书”即可领取价值上千的电子书资源。
发送“大厂内推”即可获取京东、美团等大厂内推信息,祝你获得高薪职位。
发送“AI”即可领取AI学习资料。
部分电子书如图所示。