摘要

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

微服务划分

问题分析

上篇介绍过我们一开始的服务划分标准

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

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

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

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

  • 服务边界不清晰

    微服务的边界不清晰,起因肯定是标准定义的不够准确

  • 服务之间依赖多了

    微服务的一个重要特征就是自治性,如果依赖的服务多了,那么我们就享受不到微服务带来的好处,而只能感受到微服务的坏处。

解决手法

为了解决以上问题,我们反思了下我们的划分标准,组内进行了深入的讨论。一致觉得是因为我们为了推行DDD,在没有深入思考的情况下,过早的进行了大面积的微服务拆分。导致了诸多的问题。虽然这么做在当时的情况下,是最优的解决方案,但是带来的问题也很突出。那什么时候才是进行微服务拆分的最好时机呢?
因为理论学习、认知始终都没有尽头,只有实践才能出真知。我们没有纠结在过去的错误之中,而是重新读取了DDD的理论。这一次有了不一样的思考。

DDD中有战略设计,划分领域,找出限界上下文,识别出核心域。然后有战术设计,对领域进行建模,
聚合根、实体、值对象、领域服务、领域事件等。战略设计通常就是指导思想,战术设计是具体打法。我们一开始认定要
先有指导思想,然后再有具体打法。现在发现我们错了,指导思想不是一蹴而就的,也不是不成不变的。在一开始没有标准时,它必须要来源于实际打法中。
同时需要在实践过程中不断总结,修正、完善指导思想。

于是我们又重新梳理了一遍我们的整体业务

前台功能

把我们所有端的前台功能都梳理一遍,画成图

业务架构全景

根据前台功能,进一步整理,抽象出业务架构全景

划分出上下文

根据业务架构全景,在核心域中建立出限界上下文,拆分微服务

非常抱歉了,涉及敏感信息,这里不能贴图,如果觉得太抽象不好理解,请参考DDD落地:业务分析师和架构师的完美结对

新的微服务划分标准

我们提出了一种新的微服务划分标准

  • 确定以限界上下文为微服务划分的标准

    限界上下文的划分很难,但是必须要做。限界上下文不是凭空造出来的,而是从一个实体关联关系、与业务人员沟通出来的。

  • 服务的演进是以限界上下文作为单元进行演进的

    之前我们拿一个微服务作为领域孵化器,其实就是放弃了对业务的整体认知,和对新需求的业务思考。
    我们的新业务不是一个新产品,全部推倒重来的。大多时候它还是解决某类业务上的问题。只是采取的手段不一样罢了。
    所以我们需要挖掘其本质,将它放到现有的上下文中。每个上下文一个微服务,对应一个开发owner,他负责这个领域内的事情。
    这样每个服务都有新的领域孵化。

举例

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

限界上下文

分为人、货、场、交易几个上下文。然后不断的孵化,哪一部分是你业务的核心域,然后不断的服务拆分,比如你也是一家做垂直电商的公司,这些基本的东西肯定不应该是你的核心域,只能是支撑域,要不然你的业务肯定发展不起来。

微服务的划分

从限界上下文中抽出微服务,一个微服务中包含了多个领域。

另外我们遗弃了之前的UI服务,所有微服务可以直接和前台交互,这样可以有效的减少服务的依赖。
只有当需要多个领域进行组合时,我们才写在一个新的【组合ui】服务里面

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

相关阅读

可落地的DDD(1)-目标讨论

可落地的DDD的(2)-为什么说MVC工程架构已经过时

可落地的DDD(3)-如何利用DDD进行微服务的划分

关注【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路

可落地的DDD(4)-如何利用DDD进行微服务的划分(2)的更多相关文章

  1. 可落地的DDD(3)-如何利用DDD进行微服务的划分

    摘要 前面两篇介绍了DDD的目标管理.DDD的工程结构调整.这篇讨论微服务的划分.微服务是目前后端比较流行的架构体系了,那么如何做好一个微服务的划分?一个微服务的粒度应该是多大呢?这篇主要介绍如何结合 ...

  2. 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务

    小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...

  3. 当中台遇上DDD,我们该如何设计微服务? - InfoQ https://www.infoq.cn/article/7QgXyp4Jh3-5Pk6LydWw

    当中台遇上DDD,我们该如何设计微服务? - InfoQ https://www.infoq.cn/article/7QgXyp4Jh3-5Pk6LydWw

  4. DDD兴起的原因以及与微服务的关系

    DDD为什么能火起来? 我们先不讨论DDD的定义, 先梳理一下DDD火起来的背景, 根据我学习的套路, 永远是为什么为先,再是解决什么问题,是什么东西, 最后如何使用.我们都知道这些年随着设备以及技术 ...

  5. DDD实战让中台和微服务的落地如虎添翼

    微服务到底怎么拆分和设计才算合理,拆多小才叫微服务?有没有好的方法来指导微服务和中台的设计呢? 深入DDD的核心知识体系与设计思想,带你掌握一套完整而系统的基于DDD的微服务拆分与设计方法,助力落地边 ...

  6. 微服务+DDD代码结构例子

    这是一个基本的微服务+DDD演示例子: 基于 Spring Boot 1.5.6 , Spring Cloud Edgware.SR4 Version 微服务 + DDD,个人觉得应该是首先是从微服务 ...

  7. 基于DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  8. 驱动领域DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  9. [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。

    目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...

随机推荐

  1. Solr缓存原理分析及配置优化

    一.缓存原理 缓存,带来急速性能体验! Solr提供了一系列的内置缓存来优化查询性能.Solr的缓存原理主要涉及以下4个方面: 1.缓存大小及缓存置换法 从缓存大小的角度来看,不能将缓存设置的太大,否 ...

  2. 小程序插件集成functional-page-navigator真机调试报错

    小程序集成插件 插件里面有functional-page-navigator标签 一."小程序开发版已过期,请重新扫码连接" 真机在调用插件的时候报错 "小程序开发版已过 ...

  3. selenium 框架

    结构如下: test_project|--logs|---pages |---register_page.py|      |---base_page.py|---test_case       |- ...

  4. python基本数据类型的时间复杂度

    1.list 内部实现是数组 2.dict 内部实现是hash函数+哈希桶.一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突. 3.set 内部实 ...

  5. msyql常用命令

    1.创建.删除数据库 create database dbname; drop database dbname; 2.选择某一个数据库 use dbname; 3.显示所有表 show tables; ...

  6. VS操作中遇到的问题及解决

    1.无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 2. /ZI ...

  7. SPA项目开发之登录注册

    CMD安装所需要的pom依赖 npm install element-ui -S npm install axios -S npm install qs -S npm install vue-axio ...

  8. ESA2GJK1DH1K升级篇: 远程升级准备工作: 安装Web服务器

    前言 大家可以安装Apache,Tomcat,nginx 等Web服务器软件,这篇文章安装 OpenResty 作为Web服务器软件,该软件安装在云端电脑,如果想 安装到自己本地电脑实现该功能,可使用 ...

  9. 联想笔记本上Ubuntu无线网卡问题

    可能有两个问题: 1.无无线网卡驱动 2.无线网卡驱动不能自动加载 问题1:无线网卡驱动 百度出网卡驱动iwlwifi-9000,如iwlwifi-9000-pu-b0-jf-b0-34.618819 ...

  10. 回溯法 | n皇后问题

    今早上看了一篇英语阅读之后,莫名有些空虚寂寞冷.拿出算法书,研读回溯法.我觉得n皇后问题完全可以用暴力方式,即先对n个数进行全排列,得到所有结果的下标组合,问题规模为n!. 全排列花了比较久的时间才编 ...