07.领域驱动设计:掌握整洁架构、六边形架构以及3种常见微服务架构模型的对比和分析

本文主要是介绍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分层架构、整洁架构、六边形架构都是以领域模型为核心,实行分层架构,内部核心业务逻

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

这篇关于07.领域驱动设计:掌握整洁架构、六边形架构以及3种常见微服务架构模型的对比和分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

MySQL ORDER BY 语句常见用法、示例详解

《MySQLORDERBY语句常见用法、示例详解》ORDERBY是结构化查询语言(SQL)中的关键字,隶属于SELECT语句的子句结构,用于对查询结果集按指定列进行排序,本文给大家介绍MySQL... 目录mysql ORDER BY 语句详细说明1.基本语法2.排序方向详解3.多列排序4.常见用法示例5.