领域驱动与微服务落地实战-领域划分和建模

领域驱动与微服务落地实战-领域划分和建模

领域划分-战略设计

软件研发好比行军作战,领域划分则属于战略设计,影响整体大局。
现代软件研发大部分都是迭代研发,整体的领域划分也会随着迭代调整,是一个演变过程,贯穿整个研发周期。
如何做领域划分,有以下几个原则

水平划分

水平划分是基于业务层级,受应用架构的影响,一般会分 接入层(网关层),服务层,基础层。
水平层级的依赖一般是单向的,即上层依赖下层。

接入层(网关层)

直接提供给外网访问数据,一般对接app或者h5,处理鉴权等。

服务层

提供具体业务服务能力,一般不对外,只提供soa接口,业务变更频繁,迭代快

基础层

具体业务服务依赖的一些通用服务,例如统一账户服务等,业务相对稳定,迭代慢

垂直划分

垂直划分,是基于一个水平层级能,基于细分业务领域拆分,例如原来商品和商户在一个业务服务,后面随着
业务发展,拆成2个独立的垂直业务服务。垂直划分的服务依赖可以是双向,最终在同一个水平层级内不同的垂直服务的
依赖关系会发展成网状,这个会增大服务治理的难度。

非功能性拆分

非功能性拆分,一般有to B/to C拆分,实时/离线拆分

to B/to C 拆分

常见于cqrs风格架构,b/c两边的性能要求不一致,迭代频率不一致,稳定性保障不一致等导致切分服务

离线/实时 拆分

离线/实时场景下,大部分采用的技术栈不一样,语言不一样,虽然多语言应用在微服务里也是可行的,但为了简化研发和维护成本,一般还是拆分。

如何做领域划分

这个是一个没有标准答案的问题,仁者见仁,智者见智。以上几个原则是做划分时的一个主要参考。划分也不是一锤子买卖,
所有的抽象都是建立在已知用例上,业务会变,会新增用例,当新增用例无法套到现有的领域划分里面,就需要调整领域划分。

领域建模-战术设计

领域划分解决了战略设计问题,那么领域建模则是具体的战术设计。领域建模是面向对象分析的方法论,
它可以利用面向对象的特性(封装、多态,继承)有效地化解复杂性。区别于传统的面向数据模型建模(er图),
领域建模是以对象模型为中心,建模过程就是面向对象分析过程,具体的建模过程,建议使用uml来辅助建模,常见的
uml建模图有以下几种

用例图

用例图是基于场景的模型,描述了人员使用该软件系统做了什么,是需求功能的直观抽象

类图

类图描述了领域模型核心属性和功能,并体现了面向对象的特性(继承,封装,多态)

流程图

流程图描述了业务流程的节点,和相关流转

时序图

时序图细化某个用例的具体实现,体现在该场景下不同应用节点之间的交互时序

架构图

体现服务应用之间的层级,业务边界,依赖关系,支撑领域划分

附录书籍

  • 《UML面向对象分析与设计》
  • 《领域驱动设计:软件核心复杂性应对之道》