01.领域驱动设计:微服务设计为什么要选择DDD学习总结

news2024/12/23 22:31:03

目录

1、前言

2、软件架构模式的演进

3、微服务设计和拆分的困境

4、为什么 DDD适合微服务

5、DDD与微服务的关系

6、总结


1、前言

我们知道,微服务设计过程中往往会面临边界如何划定的问题,不同的人会根据自己对微服务的理

解而拆分出不同的微服务,于是大家各执一词,谁也说服不了谁,都觉得自己很有道理。

那在实际落地过程中,见过不少项目在面临这种微服务设计困惑时,是靠拍脑袋硬完成的,上线后

运维的压力就可想而知了。那是否有合适的理论或设计方法来指导微服务设计呢?有的,就是

领域驱动设计(DDD)

2、软件架构模式的演进

我们知道,这些年来随着设备和新技术的发展,软件的架构模式发生了很大的变化。

软件架构模式大体来说经历了从单机、集中式到分布式微服务架构三个阶段的演进。随着分布式技

术的快速兴起,我们已经进入到了微服务架构时代

我们先来分析一下,软件架构模式演进的三个阶段。

第一阶段是单机架构

采用面向过程的设计方法,系统包括客户端 UI 层和数据库两层,采用 C/S 架构模式,整个系统围

绕数据库驱动设计和开发,并且总是从设计数据库和字段开始。

第二阶段是集中式架构

采用面向对象的设计方法,系统包括业务接入层、业务逻辑层和数据库层,采用经典的三层架构,

也有部分应用采用传统的 SOA 架构。这种架构容易使系统变得臃肿,可扩展性和弹性伸缩性差。

第三阶段是分布式微服务架构

随着微服务架构理念的提出,集中式架构正向分布式微服务架构演进。微服务架构可以很好地实现

应用之间的解耦,解决单体应用扩展性和弹性伸缩能力不足的问题。

我们知道,在单机和集中式架构时代系统分析、设计和开发往往是独立、分阶段割裂进行的

比如,在系统建设过程中,我们经常会看到这样的情形:A 负责提出需求,B 负责需求分析,C 负

责系统设计,D负责代码实现,这样的流程很长,经手的人也很多,很容易导致信息丢失。最后,

就很容易导致需求、设计与代码实现的不一致,往往到了软件上线后,我们才发现很多功能并不是

自己想要的,或者做出来的功能跟自己提出的需求偏差太大。

而且在单机和集中式架构这两种模式下,软件无法快速响应需求和业务的迅速变化,最终错失发展

良机。此时,分布式微服务的出现就有点恰逢其时的意思了。

3、微服务设计和拆分的困境

那进入微服务架构时代以后,微服务确实也解决了原来采用集中式架构的单体应用的很多问题,比

扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。

但在看到这些好处的同时,微服务实践过程中也产生了不少的争论和疑惑:微服务的粒度应该多大

呀?微服务到底应该如何拆分和设计呢?微服务的边界应该在哪里?

可以说,很久以来都没有一套系统的理论和方法可以指导微服务的拆分,包括微服务架构模式的提

出者 Martin Fowler 在提出微服务架构的时候,也没有告诉我们究竟应该如何拆分微服务。

于是,在这段较长的时间里,就有不少人对微服务的理解产生了一些曲解。有人认为:“微服务很

简单,不过就是把原来一个单体包拆分为多个部署包,或者将原来的单体应用架构替换为一套支持

微服务架构的技术框架,就算是微服务了。” 还有人说:“微服务嘛,就是要微要小,拆得越小效

果越好。”

但我想这两年,你在技术圈中一定听说过一些项目因为前期微服务拆分过度,导致项目复杂度过

高,无法上线和运维。

综合来看,我认为微服务拆分困境产生的根本原因就是不知道业务或者微服务的边界到底在什么地

。换句话说,确定了业务边界和应用边界,这个困境也就迎刃而解了。

那如何确定,是否有相关理论或知识体系支持呢?在回答这些问题之前,我们先来了解一下领域驱

动设计与微服务的前世今生。

2004 年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design–Tackling

Complexity in the Heart of Software)这本书,从此领域驱动设计(DomainDriven Design,简称

DDD)诞生。DDD核心思想是通过领域驱动设计方法定义领域模型从而确定业务和应用边界,

保证业务模型与代码模型的一致性

但 DDD提出后在软件开发领域一直都是“雷声大,雨点小”!直到 Martin Fowler 提出微服务架构,

DDD才真正迎来了自己的时代。

有些熟悉 DDD设计方法的软件工程师在进行微服务设计时,发现可以利用 DDD设计方法来建立领

域模型,划分领域边界,再根据这些领域边界从业务视角来划分微服务边界。而按照 DDD方法设

计出的微服务的业务和应用边界都非常合理,可以很好地实现微服务内部和外部的“高内聚、低耦

”。于是越来越多的人开始把 DDD作为微服务设计的指导思想。

现在,很多大型互联网企业已经将 DDD设计方法作为微服务的主流设计方法了。DDD也从过去“雷

声大,雨点小”,开始真正火爆起来。

4、为什么 DDD适合微服务

DDD 是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建

领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD不是架构,而是一

架构设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边

界,可以很容易地实现架构演进。

DDD包括战略设计战术设计两部分。

战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,

限界上下文可以作为微服务设计的参考边界。

战术设计从技术视角出发侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、

实体、值对象、领域服务、应用服务和资源库代码逻辑的设计和实现。

我们来看看 DDD是如何进行战略设计的。

DDD战略设计会建立领域模型,领域模型可以用于指导微服务的设计和拆分事件风暴是建立领

域模型的主要方法,它是一个从发散到收敛的过程。它通常采用用例分析、场景分析和用户旅程分

,尽可能全面不遗漏地分解业务领域,并梳理领域对象之间的关系,这是一个发散的过程。事件

风暴过程会产生很多的实体、命令、事件等领域对象,我们将这些领域对象从不同的维度进行聚

类,形成如聚合、限界上下文等边界,建立领域模型,这就是一个收敛的过程。

我们可以用三步来划定领域模型和微服务的边界。

第一步:在事件风暴中梳理业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素梳理

出领域实体等领域对象。

第二步:根据领域实体之间的业务关联性,将业务紧密相关的实体进行组合形成聚合,同时确定聚

合中的聚合根、值对象和实体。在这个图里,聚合之间的边界是第一层边界,它们在同一个微服务

实例中运行,这个边界是逻辑边界,所以用虚线表示。

第三步:根据业务及语义边界等因素,将一个或者多个聚合划定在一个限界上下文内,形成领域模

。在这个图里,限界上下文之间的边界是第二层边界,这一层边界可能就是未来微服务的边界,

不同限界上下文内的领域逻辑被隔离在不同的微服务实例中运行,物理上相互隔离,所以是物理边

界,边界之间用实线来表示。

有了这两层边界,微服务的设计就不是什么难事了。

战略设计中我们建立了领域模型,划定了业务领域的边界,建立了通用语言和限界上下文,确定

了领域模型中各个领域对象的关系。到这儿,业务端领域模型的设计工作基本就完成了,这个过程

同时也基本确定了应用端的微服务边界。

在从业务模型向微服务落地的过程中,也就是从战略设计向战术设计的实施过程中,我们会将领域

模型中的领域对象与代码模型中的代码对象建立映射关系,将业务架构和系统架构进行绑定。当我

们去响应业务变化调整业务架构和领域模型时,系统架构也会同时发生调整,并同步建立新的映射

关系。

5、DDD与微服务的关系

有了上面的讲解,现在我们再次总结下 DDD与微服务的关系。

DDD是一种架构设计方法,微服务是一种架构风格,两者从本质上都是为了追求高响应力,而从

业务视角去分离应用系统建设复杂度的手段。两者都强调从业务出发,其核心要义是强调根据业务

发展,合理划分领域边界,持续调整现有架构,优化现有代码,以保持架构和代码的生命力,也就

是我们常说的演进式架构。

DDD主要关注:从业务领域视角划分领域边界,构建通用语言进行高效沟通,通过业务抽象,建

立领域模型,维持业务和代码的逻辑一致性。

微服务主要关注:运行时的进程间通信、容错和故障隔离,实现去中心化数据管理和去中心化服务

治理,关注微服务的独立开发、测试、构建和部署

6、总结

今天我们主要学习微服务设计和拆分的难题。通过DDD战略设计可以建立领域模型,划定领域边

界,解决微服务设计过程中,边界难以划定的难题。如果你的业务焦点在领域和领域逻辑,那么你

就可以选择DDD作为微服务的设计方法!

更关键的一点是,DDD不仅可以用于微服务设计,还可以很好地应用于企业中台的设计。

如果你的企业正在做中台转型,DDD将会是一把利器,它可以帮你建立一个非常好的企业级中台

业务模型。有关这点你还会在后面的文章中见到详解。

除此之外,DDD战术设计对设计和开发人员的要求相对较高,实现起来相对复杂。不同企业的研

发管理能力和个人开发水平可能会存在差异。尤其对于传统企业而言,在战术设计落地的过程中,

可能会存在一定挑战和困难,我建议你和你的公司如果有这方面的想法,就一定要谨慎评估自己的

能力,选择最合适的方法落地DDD。

总体来说,DDD可以给你带来以下收获

  1. DDD是一套完整而系统的设计方法,它能带给你从战略设计到战术设计的标准设计过程,使得你的设计思路能够更加清晰,设计过程更加规范。

  2. DDD善于处理与领域相关的拥有高复杂度业务的产品开发,通过它可以建立一个核心而稳定的领域模型,有利于领域知识的传递与传承。

  3. DDD强调团队与领域专家的合作,能够帮助你的团队建立一个沟通良好的氛围,构建一致的架构体系。

  4. DDD的设计思想、原则与模式有助于提高你的架构设计能力

  5. 无论是在新项目中设计微服务,还是将系统从单体架构演进到微服务,都可以遵循DDD的架构原则

  6. DDD不仅适用于微服务,也适用于传统的单体应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解读IP风险画像标签:深度洞察网络安全

在当今数字化的世界中,网络安全成为企业和个人关注的焦点。IP风险画像标签作为网络安全的利器,扮演着深度洞察网络风险的角色。本文将深入解读IP风险画像标签,揭示其在网络安全领域的重要性和功能。 1. IP风险画像标签是什么? I…

Kubernetes/k8s之安全机制:

k8s当中的安全机制 核心是分布式集群管理工具,容器编排,安全机制核心是:API SERVER作为整个集群内部通信的中介,也是外部控制的入口,所有的安全机制都是围绕api server开设计的。 请求api资源 1、认证 2、鉴权 3、准入机制 三…

Java设计模式-装饰器模式(10)

大家好,我是馆长!今天开始我们讲的是结构型模式中的装饰器模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。。 装饰器模式(Decorator Pattern) 定义 装饰(Decorator)模式…

npm安装卡住问题(最新版)

npm安装卡住问题(最新版) 背景: ​ 最近这两天用npm安装一些包的时候,发现一直卡住: 报错: idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了,我一想,是不是源头的问题,还真是…

软考复习之UML设计篇

UML统一建模语言 构件图:描述系统的物理结构,它可以用来显示程序代码如何分解成模块 部署图:描述系统中硬件和软件的物理结构,它描述构成系统架构的软件构件,处理器和设备 用例图:描述系统与外部系统及用…

链表--104. 二叉树的最大深度/medium 理解度A

104. 二叉树的最大深度 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,n…

谷粒商城配置虚拟机

一、创建虚拟机 之前有在VM里面建一个ubuntu的虚拟机,准备拿来直接用,网络设置为NAT模式,查看我的虚拟机是虚拟机:192.168.248.128 主机: 192.168.2.12。可以互相ping通。 二、linux安装docker Docker docker是虚拟…

OpenTCS IDEA 全流程搭建和运行指南

OpenTCS IDEA 全流程搭建和运行指南 JDK安装下载JDK版本 openTCS源码下载IDEA 打开运行查看下载源码中gradle版本号下载gradle 二进制文件配置IDEA Gradle本地仓库IDEA打开openTCS项目运行顺序 JDK安装 下载JDK版本 JDK网址 注意: 请下载官方文档标准的java13JDK o…

C语言零基础入门第2天《 visual studio下载安装教程和搭建开发环境及踩坑指南》(保姆级图文教程)

visual studio下载安装教程和搭建开发环境 1、 项目实战效果图2、简单了解一下目前主流的开发环境3、 visual studio下载地址4、 visual studio安装教程5、 配置visual studio环境变量 6、如何新建一个C项目7、新建第一个C程序8、用代码测试创建的项目是否可用8、如何成功让代码…

vue解决:Parsing error: No Babel config file detected for

解决babel配置问题 报错信息如下: Parsing error: No Babel config file detected for C:\Users\yjj\Desktop\大学\大二\学习\vue_ bags \slot_ study\src\App. vue. Either disable config file checking withrequireConfigFile: false, or configure Babel so tha…

《游戏-01_3D-开发》之—人物动画控制器

创建变量, 创建线, 连接, 选中线会变为蓝色,新增变量, 设置线, 双击子层进入子层, 创建变量, 双击SkillPanel 拖拽好之后返回上一层, 依次连接, 设置线&#…

凭服务出圈的海底捞,竟然在这件事上也很卷

1月9日,法大大与企业绿色发展研究院联合发布了《2023年签约减碳与低碳办公白皮书》(点击阅读及下载:法大大推出“签约减碳”年度账单,引领低碳办公新风潮),该白皮书基于《低碳办公评价》标准倡导的创新减碳…

图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解前言EfficientNet_V2讲解自适应正则化的渐进学习(Progressive Learning with adaptive Regul…

《如何画好架构图》学习笔记

看了一堂《如何画好架构图》的公开课,结合网上的资料与经验做一些思考总结。文中的例子和图片大多是从课程中摘录的。 1. 4R架构定义 4R架构定义其实是软件架构定义经过归纳提炼后的简称。 软件架构定义:软件架构是指软件系统的顶层(Rank&am…

Vue好看的组件库:Element

文章目录 1、什么是Element2、Element快速入门3、Element布局3.1、 Layout 局部3.2、容器布局 1、什么是Element Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页 Element 提供了很多组件(组成网页的部件…

2024-01-24(ElasticSearch)

1.mysql和elasticsearch的架构: 2.IK分词器利于分中文词汇。 底层是有一个中文字典,这个字典中的中文词汇也是可以拓展的和禁用某些词。 3.mapping常见属性: type:数据类型 index:是否索引 analyzer:分…

记录一下uniapp 集成腾讯im特别卡(已解决)

uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几…

构筑服务「护城河」,汽车品牌如何从 0 到 1 搭建语音质检体系

「质检」一词对于汽车行业并不陌生。商品生产商采用一定检验测试手段和检查方法测定产品的质量特性,从而判断产品的质量标准。 随着消费需求的多样化,越来越多的品牌开始重视商品背后的服务。尤其对于汽车这种高客单价的耐消品领域,商品带来的…

第12章_集合框架(Collection接口,Iterator接口,List,Set,Map,Collections工具类)

文章目录 第12章_集合框架本章专题与脉络1. 集合框架概述1.1 生活中的容器1.2 数组的特点与弊端1.3 Java集合框架体系1.4 集合的使用场景 2. Collection接口及方法2.1 添加2.2 判断2.3 删除2.4 其它 3. Iterator(迭代器)接口3.1 Iterator接口3.2 迭代器的执行原理3.3 foreach循…

JavaEE之多线程编程:4. 线程安全(重点!!!)

文章目录 一、观察线程不安全二、线程安全的概念三、线程不安全的原因1. 关于线程不安全的解释1. 抢占式执行2. 修改共享数据3. 原子性4. 可见性5. 指令重排序问题 四、解决之前的线程不安全的问题五、synchronized 关键字(两个线程同时修改一个变量)1. …