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

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序