商品领域ddd_可落地的DDD(4)-如何利用DDD进行微服务的划分(2)

news/2024/7/24 5:06:36 标签: 商品领域ddd

摘要
在前面一篇介绍了如何通过DDD的思想,来调整单体服务内的工程结构,为微服务的拆分做准备。同时介绍了我们在进行微服务拆分的时候踩过的一些坑。 这篇介绍下我们最终的方案,不一定对,欢迎留言讨论。
微服务划分
问题分析
上篇介绍过我们一开始的服务划分标准

  1. 一个领域一个服务的规则去拆分,
  2. 同时为了保证领域的纯洁性,我们区分了领域服务,和前台服务。领域服务就是领域逻辑,不直接对前端暴露。前台服务组装各个领域服务,暴露给前端。
  3. 同时为了保持扩展,我们预留了一个微服务作为服务孵化器。对于领域不清晰的(比如大部分的新的业务),放在这个服务里面孵化,然后等领域足够大的时候再拆分出去。


实践后有些典型的问题也比较突出

  • 服务热点问题 我们是一个新的业务,在业务迭代的过程中,大部分新需求都是领域不清晰,不知道能不能迭代下去的。所以按照之前的标准,都往growth服务里面去写代码,这样导致几乎团队里面的所有的人都在开发这一个项目,失去了拆分微服务的意义。
  • 服务依赖太严重 无论写什么需求,都需要写多个应用,领域服务1个,前台如果有pc,需要在pc服务上开发,移动端要展示,要在mobile服务开发。服务之间的调用需要写rpc client接口,需要发版本,因为同时开发的人多,经常发生版本混乱,依赖问题。服务上线也很头疼,改一个小需求,需要部署多个服务。微服务一个很重要的点是去耦合,可独立部署。多了一层UI层作为微服务显然不是很合适。
  • 领域划分问题 一个领域一个服务,粒度太小,有些东西不知道放在哪个服务里面,比如用户收藏博客,是放在用户服务里面,还是放在博客领域呢。


三个比较突出的问题,反应出的共性问题就是

  • 服务边界不清晰
    微服务的边界不清晰,起因肯定是标准定义的不够准确
  • 服务之间依赖多了
    微服务的一个重要特征就是自治性,如果依赖的服务多了,那么我们就享受不到微服务带来的好处,而只能感受到微服务的坏处。

解决手法
为了解决以上问题,我们反思了下我们的划分标准,组内进行了深入的讨论。一致觉得是因为我们为了推行DDD,在没有深入思考的情况下,过早的进行了大面积的微服务拆分。导致了诸多的问题。虽然这么做在当时的情况下,是最优的解决方案,但是带来的问题也很突出。那什么时候才是进行微服务拆分的最好时机呢? 因为理论学习、认知始终都没有尽头,只有实践才能出真知。我们没有纠结在过去的错误之中,而是重新读取了DDD的理论。这一次有了不一样的思考。
DDD中有战略设计,划分领域,找出限界上下文,识别出核心域。然后有战术设计,对领域进行建模, 聚合根、实体、值对象、领域服务、领域事件等。战略设计通常就是指导思想,战术设计是具体打法。我们一开始认定要 先有指导思想,然后再有具体打法。现在发现我们错了,指导思想不是一蹴而就的,也不是不成不变的。在一开始没有标准时,它必须要来源于实际打法中。 同时需要在实践过程中不断总结,修正、完善指导思想。
于是我们又重新梳理了一遍我们的整体业务
前台功能
把我们所有端的前台功能都梳理一遍,画成图
业务架构全景
根据前台功能,进一步整理,抽象出业务架构全景
划分出上下文
根据业务架构全景,在核心域中建立出限界上下文,拆分微服务
非常抱歉了,涉及敏感信息,这里不能贴图,如果觉得太抽象不好理解,请参考DDD落地:业务分析师和架构师的完美结对
新的微服务划分标准
我们提出了一种新的微服务划分标准

  • 确定以限界上下文为微服务划分的标准
    限界上下文的划分很难,但是必须要做。限界上下文不是凭空造出来的,而是从一个实体关联关系、与业务人员沟通出来的。
  • 服务的演进是以限界上下文作为单元进行演进的
    之前我们拿一个微服务作为领域孵化器,其实就是放弃了对业务的整体认知,和对新需求的业务思考。 我们的新业务不是一个新产品,全部推倒重来的。大多时候它还是解决某类业务上的问题。只是采取的手段不一样罢了。 所以我们需要挖掘其本质,将它放到现有的上下文中。每个上下文一个微服务,对应一个开发owner,他负责这个领域内的事情。 这样每个服务都有新的领域孵化。

举例
以电商举例,如果只是一个创业公司,不可能都跟阿里巴巴一样的架构,上百个服务。但是解决的问题电商领域可以抽象出来。
限界上下文

a0a5a3784849f24ec7b0de2689036566.png


分为人、货、场、交易几个上下文。然后不断的孵化,哪一部分是你业务的核心域,然后不断的服务拆分,比如你也是一家做垂直电商的公司,这些基本的东西肯定不应该是你的核心域,只能是支撑域,要不然你的业务肯定发展不起来。
微服务的划分
从限界上下文中抽出微服务,一个微服务中包含了多个领域。
另外我们遗弃了之前的UI服务,所有微服务可以直接和前台交互,这样可以有效的减少服务的依赖。 只有当需要多个领域进行组合时,我们才写在一个新的【组合ui】服务里面

0d19d6b8a3ceac69aa28fcdcc2fe955d.png


另外限界上下文不是一层不变的,比如商品营销,是一个领域,业务简单时和商品的关联性比较大,放在商品域。当你需要同时对店铺做营销,对用户做营销,显然他不应该在商品上下文了,那么可以剥离出来,作为一个独立的限界上下文:营销上下文。


http://www.niftyadmin.cn/n/1563601.html

相关文章

使用Docker将制作好的镜像发布到Docker hub上

看该博客之前,相信你已经会玩docker了,接下来我们就发布一个springboot项目到dcokerhub吧! 一.新建一个springboot项目。 自己新建一个springboot项目即可。写一个控制类,并运行项目测试是否跑通。 我的运行无误。 然后把项目打包…

StreamTokenizer类的一些说明

博主笔记:最近用到这个StringTokenizer和StreamTokenizer两个类,感觉JDK的文档说的不怎么清楚,就在网上找了找相关文档,发现很多文章写得不好,这篇文章稍微清楚一点,但是也不是写得很好,先转载一…

mabatis查询时间格式_mybatis查询时间段sql语句(按照指定时间格式)

select * from test where DATE_FORMAT(now(), %Y-%m-%d) ]]>now() 表示当前日期。附:MySQL DATE_FORMAT() 函数DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。DATE_FORMAT(date,format) : date 参数是合法的日期。format 规定日期/时间的输出格式。可…

微信小程序是否有路由拦截_微信小程序之页面路由

路由方式简介对于路由的触发方式以及页面生命周期函数如下:页面跳转触发的生命周期,实际还存在bug,并不如官网所说的SwitchTab的跳转BUG情景:首页跳转到子页面后,然后子页面使用跳转首页解决办法:通过js来跳…

iCloud8_Code Listings

代码清单Code Listings 本附录提供了STEAppDelegate、STEMasterViewController、STEDetailViewController、STESimpleTextDocument类的接口和实现的代码清单。代码清单没有显示从文件模板生成的方法的实现。This appendix provides listings for the interfaces and implementa…

getset原子性 redis_[深入学习Redis]RedisAPI的原子性分析

在学习Redis的常用操作时,经常看到介绍说,Redis的set、get以及hset等等命令的执行都是原子性的,但是令自己百思不得其解的是,为什么这些操作是原子性的?原子性原子性是数据库的事务中的特性。在数据库事务的情景下&…

查看端口,关闭端口

cmd——回车,输入netstat-ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不起作用,就用ntsd命令tomcat端口占用解决办法如果之前端口没被占用&#xf…

用python删掉无用数据_python清除字符串中无用字符

将列表val_list中包含的非法字符去掉,illegal_char是非法字符列表def clear():illegal_char [ ,#,%,_,]tmp_list []val_list [aaaaaaaa A A A 1%dddd%111111 #111, bbbbbbbbb_ggg_g_g-bbLS##222222222222###-]for i in illegal_char:for j in val_list:val re.s…