07.领域驱动设计:了解3种常见微服务架构模型的对比和分析

目录

1、概述

2、整洁架构

3、六边形架构

4、三种微服务架构模型的对比和分析

5、从三种架构模型看中台和微服务设计

5.1 中台建设要聚焦领域模型

5.2 微服务要有合理的架构分层

5.2.1 项目级微服务

5.2.2 企业级中台微服务

5.3 应用和资源的解耦与适配

6、总结


1、概述

DDD分层架构、整洁架构、六边形架构这三种架构模型放到一起,对比分析,看看如何利用好它

们,帮助我们设计出高内聚低耦合的中台以及微服务架构。

2、整洁架构

整洁架构又名“洋葱架构”。整洁架构的层就像洋葱片一样,它体现了分层的设计思想。

在整洁架构里,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务

和最外围的容易变化的内容,比如用户界面和基础设施

整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,

越是核心能力

外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。

领域模型实现领域内核心业务逻辑,它封装了企业级的业务规则。领域模型的主体是实体,一个实

体可以是一个带方法的对象,也可以是一个数据结构和方法集合。

应用服务实现与用户操作相关的服务组合与编排,它包含了应用特有的业务流程规则,封装和实现

了系统所有用例。

最外层主要提供适配的能力,适配能力分为主动适配和被动适配。主动适配主要实现外部用户、网

页、批处理和自动化测试等对内层业务逻辑访问适配。被动适配主要是实现核心业务逻辑对基础资

源访问的适配,比如数据库、缓存、文件系统和消息中间件等。

红圈内的领域模型、领域服务和应用服务,一起组成软件核心业务能力

3、六边形架构

六边形架构又名“端口适配器架构”。

六边形架构的核心理念是:应用是通过端口与外部进行交互的。这也是微服务架构下API网关盛行

的主要原因吧。

也就是说,在下图的六边形架构中,红圈内的核心业务逻辑(应用程序和领域模型)与外部资源

(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互它解决了业务逻

辑与用户界面的代码交错问题,很好地实现了前后端分离。六边形架构各层的依赖关系与整洁架构

一样,都是由外向内依赖。

六边形架构将系统分为内六边形和外六边形两层,这两层的职能划分如下:

红圈内的六边形,实现应用的核心业务逻辑

外六边形完成外部应用、驱动和基础资源等的交互和访问,对前端应用以API主动适配的方式提供

服务,对基础资源以依赖倒置被动适配的方式实现资源访问。

六边形架构的一个端口可能对应多个外部系统,不同的外部系统也可能会使用不同的适配器,由适

配器负责协议转换。这就使得应用程序能够以一致的方式被用户、程序、自动化测试和批处理脚本

使用。

4、三种微服务架构模型的对比和分析

这三种架构模型的设计思想正是微服务架构高内聚低耦合原则的完美体现,而它们身上闪耀的正是

领域模型为中心的设计思想。

按照这种功能的差异,我们在这三种架构中划分了应用层和领域层,来承担不同的业务逻辑。

领域层实现面向领域模型,实现领域模型的核心业务逻辑,属于原子模型,它需要保持领域模型和

业务逻辑的稳定,对外提供稳定的细粒度的领域服务,所以它处于架构的核心位置。

应用层实现面向用户操作相关的用例和流程,对外提供粗粒度的API服务

可以说,这三种架构都考虑了前端需求的变与领域模型的不变。

总体来说,不管前端如何变化,在企业没有大的变革的情况下,核心领域逻辑基本不会大变,所以

领域模型相对稳定,而用例和流程则会随着外部应用需求而随时调整。把握好这个规律,我们就知

道该如何设计应用层和领域层了。

架构模型通过分层的方式来控制需求变化从外到里对系统的影响,从外向里受需求影响逐步减小。

这样设计的好处很明显了,就是可以保证领域层的核心业务逻辑不会因为外部需求和流程的变动而

调整,对于建立前台灵活、中台稳固的架构很有帮助。

中台和微服务设计的关键:领域模型和微服务的合理分层设计

5、从三种架构模型看中台和微服务设计

中台本质上是领域的子域,它可能是核心域,也可能是通用域或支撑域。通常大家认为阿里的中台

对应DDD的通用域,将通用的公共能力沉淀为中台,对外提供通用共享服务。

中台作为子域还可以继续分解为子子域,在子域分解到合适大小,通过事件风暴划分限界上下文以

后,就可以定义微服务了,微服务用来实现中台的能力。表面上看,DDD、中台、微服务这三者

之间似乎没什么关联,实际上它们的关系是非常紧密的,组合在一起可以作为一个理论体系用于你

的中台和微服务设计

5.1 中台建设要聚焦领域模型

中台需要站在全企业的高度,考虑能力的共享和复用

中台设计时,我们需要建立中台内所有限界上下文的领域模型,DDD 建模过程中会考虑架构演进

和功能的重新组合。领域模型建立的过程会对业务和应用进行清晰的逻辑和物理边界(微服务)划

分。领域模型的结果会影响到后续的系统模型、架构模型和代码模型,最终影响到微服务的拆分和

项目落地。

因此,在中台设计中我们首先要聚焦领域模型,将它放在核心位置

5.2 微服务要有合理的架构分层

微服务设计要有分层的设计思想,让各层各司其职,建立松耦合的层间关系。

不要把与领域无关的逻辑放在领域层实现,保证领域层的纯洁和领域逻辑的稳定,避免污染领域模

型。也不要把领域模型的业务逻辑放在应用层,这样会导致应用层过于庞大,最终领域模型会失

焦。如果实在无法避免,我们可以

引入防腐层,进行新老系统的适配和转换,过渡期完成后,可以直接将防腐层代码抛弃。

有的微服务可以与前端应用集成,一起完成特定的业务,这是项目级微服务。而有的则是某个职责

单一的中台微服务,企业级的业务流程需要将多个这样的微服务组合起来才能完成,这是企业级中

台微服务两类微服务由于复杂度不一样,集成方式也会有差异。

5.2.1 项目级微服务

项目级微服务的内部,遵循分层架构模型就可以了。

领域模型的核心逻辑在领域层实现,服务的组合和编排在应用层实现,通过API网关为前台应用提

供服务,实现前后端分离。但项目级的微服务,可能会调用其它微服务。通常项目级微服务之间的

集成,发生在微服务的应用层,由应用服务调用其它微服务发布在API网关上的应用服务。

它除了可以组合和编排自己的领域服务外,还可以组合和编排外部微服务的应用服务。它只要将编

排后的服务发布到API网关供前端调用,这样前端就可以直接访问自己的微服务了。

5.2.2 企业级中台微服务

企业级的业务流程,往往是多个中台微服务一起协作完成的。

企业级中台微服务的集成不能像项目级微服务一样,在某一个微服务内完成跨微服务的服务组合和

编排。

我们可以在中台微服务之上增加一层,增加的这一层它的主要职能就是处理跨中台微服务的服务组

合和编排,以及微服务之间的协调,它还可以完成前端不同渠道应用的适配。如果再将它的业务范

围扩大一些,我可以将它做成一个面向不同行业和渠道的服务平台。

我们借用BFF(服务于前端的后端,Backend for Frontends)这个词,暂且称它为BFF 微服务

BFF微服务与其它微服务存在较大的差异,就是它没有领域模型,因此这个微服务内也不会有领域

。BFF微服务可以承担应用层和用户接口层的主要职能,完成各个中台微服务的服务组合和编

排,可以适配不同前端和渠道的要求。

5.3 应用和资源的解耦与适配

传统以数据为中心的设计模式,应用会对数据库、缓存、文件系统等基础资源产生严重依赖

正是由于它们之间的这种强依赖的关系,我们一旦更换基础资源就会对应用产生很大的影响,因此

需要为应用和资源解耦。

在微服务架构中,应用层、领域层和基础层解耦是通过仓储模式,采用依赖倒置的设计方法来实现

的。在应用设计中,我们会同步考虑和基础资源的代码适配,那么一旦基础设施资源出现变更(比

如换数据库),就可以屏蔽资源变更对业务代码的影响,切断业务逻辑对基础资源的依赖,最终降

低资源变更对应用的影响。

6、总结

DDD分层架构、整洁架构、六边形架构都是以领域模型为核心,实行分层架构,内部核心业务逻

辑与外部应用、资源隔离并解耦。请务必记好这个设计思想,今后会有大用处。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言-动态内存申请

一、动态分配内存的概述 在数组一章中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 。为了解决…

一、创建Vue3项目

1. 下载 node.js 下载地址:https://nodejs.org/zh-cn 优先选择 16 版本; node -v || node -version 可以检查本地 node.js 版本 2. 设置淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 设置淘宝镜像源 npm config get registry 查看当前镜像…

常见的网络安全威胁和防护方法

随着数字化转型和新兴技术在各行业广泛应用,网络安全威胁对现代企业的业务运营和生产活动也产生了日益深远的影响。常见的网络安全威胁通常有以下几种: 1. 钓鱼攻击 攻击者伪装成合法的实体(如银行、电子邮件提供商、社交媒体平台等&#xf…

解析PDF二维码:数字时代文件管理的创新之道

随着数字时代的来临,文件管理方式正经历着翻天覆地的变革。在这个变革的浪潮中,PDF二维码作为一种创新的技术手段,正逐渐引起人们的关注。本文将深入探讨PDF二维码的概念、应用领域以及在文件管理中的前景。 一、PDF二维码的概念 PDF二维码…

mcu专用看门狗复位芯片(如MAX706)

mcu专用看门狗复位芯片(如MAX706) 为什么要使用电压复位芯片RESET引脚WDO引脚MR引脚WDI引脚 国产替代型号应用电路1 推荐电路(用一个跳线帽使能/关闭看门狗功能,调试MCU时防止看门狗芯片随便触发复位功能),…

Linux操作系统概述

操作系统(Operating System)的定义 操作系统,是指直接管理系统硬件和资源(如 CPU、内存和存储空间)的软件。 操作系统的基本功能 ①统一管理计算机资源:处理器资源,IO设备资源,存储…

Flutter的安装与环境配置

一、下载安装Futter: 1、Flutter中文文档: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK: Flutter中文文档 里面有,下载完成之后找个文件夹解压出来,最好不要将 Flu…

MybatisPlus应用参数类型不一致导致索引失效

业务场景介绍 在电商项目中,有一个商品表【t_goods】和一个商品sku表【t_goods_sku】,具体表结构如下所示: CREATE TABLE t_goods (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键id,brand_id varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_…

Java链表(2)

🐵本篇文章将对双向链表进行讲解,模拟实现双向链表的常用方法 一、什么是双向链表 双向链表在指针域上相较于单链表,每一个节点多了一个指向前驱节点的引用prev以及多了指向最后一个节点的引用last: 二、双向链表的模拟实现 首先…

Python实现时间序列分析AR定阶自回归模型(ar_select_order算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中,AR定阶自回归模型(AR order selection)是指确定自回…

GPT栏目:yarn 安装

GPT栏目:yarn 安装 一、前言 在跟GPT交互的时候,发现最近gpt4给出的答案率有了比较明显的提高,简单记录一下,我用gpt4拿到的答案吧。 本人已按照这个步骤成功 二、具体步骤 要安装 yarn,你可以按照以下步骤进行操作…

Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1,Nginx动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化

1.Ubuntu 22.04.1 LTS 编译安装 nginx-1.22.1 1.1安装依赖 sudo apt install libgd-dev 1.2下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 1.3解压nginx tar -zvxf nginx-1.22.1.tar.gz 1.4编译安装 cd nginx-1.22.1 编译并指定安装位置,执行安装…

Vue学习笔记之生命周期函数

生命周期示意图如下所示: beforeCreate:组件初始化之前触发该事件created:组件初始化完毕触发该事件beforeMount:Vue应用对象挂载DOM结点之前触发该事件mounted:DOM结点挂载成功之后触发该事件beforeUpdate&#xff1a…

欧拉计划第816题:求大量点的最短距离

本次来解决欧拉计划的第816题: 解: 第一步:最原始的算法 先从简单的情况开始,即原题里的14个点的情况 import mathdef gen_points(n):s = [0] * (2*n)s[0] = 290797for i in range(1, 2*n):s[i] = (s[i - 1] * s[i - 1]) % 50515093p = [(s[2 * i], s[2 * i + 1]) for…

分布式ID是什么,以美团Leaf为例改造融入自己项目【第十一期】

前言 在日常开发中,主键id应用是非常广泛的,但是当涉及到分布式系统的时候,往往需要使用到分布式id,每一个服务里面一套生成规则的不易管理,容易引发冲突。我的IM聊天系统中使用分布式id来生成消息唯一键,为后面幂等做…

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s,统计的是关机后从按下 power 按键到显示锁屏的时间,当对openharmony的系统进行了裁剪子系统,系统app,禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

12V-80V车灯芯片都有哪些?-H5028L

电动车车灯芯片的工作原理可以简要概括为以下几点: 光源:电动车车灯通常使用LED(Light Emitting Diode)作为光源。LED是一种半导体器件,当电流通过LED时,它会发光。 驱动电路:车灯芯片中包含驱…

百度智能小程序开发平台:SEO关键词推广优化 带完整的搭建教程

移动互联网的普及,小程序成为了众多企业和开发者关注的焦点。百度智能小程序开发平台为开发者提供了一站式的解决方案,帮助企业快速搭建并推广自己的小程序。本文将重点介绍百度智能小程序开发平台的SEO关键词推广优化功能,并带完整的搭建教程…

保护医疗数据不受威胁:MPLS专线在医疗网络安全中的角色

随着数字技术的快速发展,医疗行业正在经历一场革命。从电子健康记录到远程医疗服务,数字化不仅提高了效率,也带来了前所未有的挑战--尤其是关于数据安全和隐私保护的挑战。在这样的背景下,如何确保敏感的医疗数据安全传输&#xf…

github添加 SSH 密钥

1 打开终端 输入 ssh-keygen -t rsa -b 4096 -C "github邮箱地址"如果不需要密码可以一路回车 出现这个页面就是生存成功了 open ~/.ssh // 打开.ssh 找到id_rsa.pub复制出内容新建ssh密钥输入内容,保存即可
最新文章