DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)
文章目录
- 引言
- 1. 概述
- 2. 领域驱动设计(DDD)分层架构模型
- 2.1 DDD的核心概念
- 2.2 DDD架构分层解析
- 3. 整洁架构:洋葱架构与依赖倒置
- 3.1 整洁架构的核心思想
- 3.2 整洁架构的层次结构
- 4. 六边形架构:解耦核心业务与外部系统
- 4.1 六边形架构的设计理念
- 4.2 六边形架构的适用场景
- 5. 三种架构模型的对比与适用场景
- 5.1 架构模型的核心对比
- 6. 微服务架构设计中的分层与解耦
- 6.1 微服务的分层设计
- 6.2 领域模型与应用层的分离
- 6.3 资源解耦与适配策略
- 7. 中台架构与微服务架构的融合
- 7.1 中台架构的核心思想
- 7.2 微服务与中台架构的结合
- 项目级微服务
- 企业级中台微服务
- 8. 最佳实践:如何实现高内聚低耦合的微服务
- 8.1 业务逻辑与外部依赖的解耦
- 8.2 微服务之间的通信与集成
- 8.3 服务的独立性与可扩展性
- 9. 小结

引言
在当今的技术架构中,微服务架构已成为构建大规模分布式系统的主流方式。相较于传统的单体架构,微服务架构以其灵活、可扩展、高可用和高容错的特点,帮助企业应对快速变化的业务需求。然而,微服务架构并非万能,它对系统的设计和开发提出了新的挑战,特别是如何正确理解和运用微服务架构模型,确保系统能够高效、稳定地运行。
接下来我们将对几种常见的微服务架构模型进行详细分析,包括领域驱动设计(DDD)分层架构、整洁架构、六边形架构(端口-适配器架构),探讨如何利用这些架构模型设计高内聚低耦合的微服务架构。
1. 概述
微服务架构(Microservices Architecture)是一种将单一应用程序拆解为多个小型服务的架构风格。每个微服务实现一个业务功能,独立部署和独立扩展,这种方式极大地提升了系统的灵活性、可维护性和可扩展性。微服务架构的核心优势包括:
- 松耦合:每个微服务都可以独立演化,修改一个微服务不会影响到其他服务。
- 独立部署:每个微服务可以独立部署,减少了系统升级时的风险。
- 技术栈多样性:不同的微服务可以采用不同的技术栈,选择最适合的工具和框架。
- 高可扩展性:通过服务拆分,可以根据业务需要独立扩展某个服务,避免了单体应用的性能瓶颈。
然而,微服务架构也面临着挑战。特别是在系统复杂性大幅提升时,如何保证微服务之间的协调、服务的可靠性以及如何正确划分服务边界成为了微服务架构设计中的关键问题。微服务架构的成功不仅仅取决于服务的拆分,还取决于如何设计合适的架构模型和分层策略。
2. 领域驱动设计(DDD)分层架构模型
领域驱动设计(Domain-Driven Design, DDD)是一种以领域模型为核心的架构设计理念,旨在通过深入理解业务领域,实现系统设计和开发的高效协同。DDD倡导将业务领域模型作为核心,围绕领域模型进行系统的设计与实现。

2.1 DDD的核心概念
DDD的核心概念包括:
- 领域(Domain):是指应用程序所要处理的实际问题空间,包含了所有与业务相关的概念和规则。
- 限界上下文(Bounded Context):将系统划分为多个子领域,每个子领域内部的模型和规则都是独立的。
- 领域模型(Domain Model):领域模型是领域中关键概念的抽象,用于表示业务实体及其之间的关系和行为。
2.2 DDD架构分层解析
DDD的分层架构包括:
- 领域层(Domain Layer):负责核心业务逻辑的实现,包括领域模型和领域服务。领域层是系统的核心,承载着系统的业务规则。
- 应用层(Application Layer):负责处理用户请求,调用领域层的功能,完成业务流程。应用层并不包含业务逻辑,而是通过领域层来实现业务功能。
- 接口层(Interface Layer):负责与外部系统(如UI、外部API等)的交互。接口层通过应用层向用户或外部系统提供服务。
- 基础设施层(Infrastructure Layer):提供数据存储、消息队列等底层资源的支持。基础设施层实现与外部系统的集成。
通过这种分层,DDD确保了系统的业务逻辑与外部依赖的解耦,使得业务模型能够独立演化,不受外部系统变动的影响。
3. 整洁架构:洋葱架构与依赖倒置
整洁架构(Clean Architecture)由Robert C. Martin提出,其核心思想是将系统的核心业务逻辑与外部技术细节进行隔离。整洁架构强调分层设计,并通过依赖倒置原则(Dependency Inversion Principle)来实现各层之间的解耦。

3.1 整洁架构的核心思想
整洁架构的核心思想是将应用划分为多个层次,每个层次负责不同的职责。其结构类似于洋葱,每一层都像洋葱的外皮一样包裹着内层,外层依赖于内层,而内层则完全不依赖于外层。
- 核心层:包括领域模型、领域服务和应用服务,这些层次实现了核心的业务逻辑。
- 外部层:包括用户接口、数据库、缓存、消息队列等,这些层负责与外部世界的交互。
3.2 整洁架构的层次结构
整洁架构的典型层次结构如下:
- 核心层(Core Layer):包含领域模型、领域服务、应用服务等,它们定义了应用的核心业务逻辑。
- 接口层(Interface Layer):定义了系统与外部交互的接口,如UI层、API层等。
- 基础设施层(Infrastructure Layer):负责数据库、文件系统、缓存等基础设施的实现。
- 外部适配层(External Adapter Layer):通过适配器连接不同的外部系统和服务。
整洁架构的关键是通过依赖倒置原则,使得核心业务逻辑和外部技术细节解耦,从而提高了系统的可维护性和可扩展性。
4. 六边形架构:解耦核心业务与外部系统
六边形架构(Hexagonal Architecture),也被称为端口-适配器架构(Ports and Adapters Architecture),旨在通过端口和适配器的方式解耦核心业务与外部系统。六边形架构的关键是将应用的核心业务逻辑放在“内六边形”中,外部世界通过“端口”和“适配器”与应用进行交互。

4.1 六边形架构的设计理念
六边形架构的核心设计理念是应用的核心业务逻辑与外部世界的交互通过端口和适配器进行隔离。这意味着,外部的API、数据库、用户接口等都与核心业务逻辑解耦,系统可以灵活适配不同的外部需求。
六边形架构将系统划分为两层:
- 内六边形(Core Logic):包含应用的核心业务逻辑。该层不依赖
于外部系统,任何变化都不会直接影响到核心逻辑。
- 外六边形(External Adapters):通过适配器连接外部系统和应用的核心逻辑。适配器负责转换外部请求为应用能够处理的形式。
4.2 六边形架构的适用场景
六边形架构特别适用于以下场景:
- 复杂业务逻辑:当系统中存在复杂的业务逻辑时,六边形架构能够帮助我们将业务逻辑与外部依赖解耦,确保业务的稳定性。
- 多样化的外部系统集成:当系统需要与多个外部系统(如数据库、第三方服务、消息队列等)集成时,六边形架构能够通过适配器将这些集成方式抽象化。
5. 三种架构模型的对比与适用场景

5.1 架构模型的核心对比
| 特性 | DDD分层架构 | 整洁架构 | 六边形架构 |
|---|---|---|---|
| 核心理念 | 聚焦领域模型,分层设计 | 核心业务逻辑独立,解耦技术细节 | 通过端口和适配器解耦核心逻辑与外部系统 |
| 分层 | 领域层、应用层、接口层 | 核心层、接口层、基础设施层 | 内六边形(核心业务)和外六边形(适配器) |
| 外部依赖解耦 | 限界上下文划分,避免跨界限依赖 | 依赖倒置,核心逻辑不依赖外部 | 通过端口与适配器解耦外部依赖 |
| 适用场景 | 复杂领域模型、大型企业应用 | 需要独立部署和扩展的系统 | 需要灵活适配多种外部系统的场景 |
6. 微服务架构设计中的分层与解耦
6.1 微服务的分层设计
微服务架构设计中的分层结构通常包括以下几层:
- 表示层(API层):负责与用户或外部系统交互,暴露服务接口。
- 服务层(业务层):处理业务逻辑,协调不同微服务之间的交互。
- 领域层:负责领域模型的实现和核心业务逻辑的处理。
- 数据层:负责数据存储和持久化。
6.2 领域模型与应用层的分离
领域模型是系统的核心,它应与应用层分离。应用层负责协调不同微服务的调用,而领域模型则专注于业务逻辑的实现。
6.3 资源解耦与适配策略
通过引入适配器和防腐层(Anti-Corruption Layer),可以确保新系统和旧系统之间的解耦,避免旧系统的技术细节影响新系统的业务逻辑。
7. 中台架构与微服务架构的融合
中台本质上是领域的子域,它可能是核心域,也可能是通用域或支撑域。通常大家认为阿里的中台对应 DDD 的通用域,将通用的公共能力沉淀为中台,对外提供通用共享服务。
7.1 中台架构的核心思想
中台架构的核心思想是将企业的共性能力提炼成中台服务,提供给不同业务线使用。通过中台,企业能够实现资源共享、能力复用,从而提升整体运营效率。
7.2 微服务与中台架构的结合
微服务架构与中台架构相结合,可以有效解决大规模企业中各个业务单元之间的协作问题。微服务架构可以为每个业务单元提供独立的服务,中台则提供公共服务和资源管理,从而减少重复开发和维护成本。
项目级微服务

项目级微服务的内部遵循分层架构模型就可以了。领域模型的核心逻辑在领域层实现,服务的组合和编排在应用层实现,通过 API 网关为前台应用提供服务,实现前后端分离。但项目级的微服务可能会调用其它微服务,比如某个项目级微服务 B 调用认证微服务 A,完成登录和权限认证。
通常项目级微服务之间的集成,发生在微服务的应用层,由应用服务调用其它微服务发布在API 网关上的应用服务。图中微服务 B 中红色框内的应用服务 B,它除了可以组合和编排自己的领域服务外,还可以组合和编排外部微服务的应用服务。它只要将编排后的服务发布到 API 网关供前端调用,这样前端就可以直接访问自己的微服务了。
企业级中台微服务
企业级的业务流程往往是多个中台微服务一起协作完成的,那跨中台的微服务如何实现集成呢?企业级中台微服务的集成不能像项目级微服务一样,在某一个微服务内完成跨微服务的服务组合和编排。我们可以在中台微服务之上增加一层,你看下面这张图,增加的这一层就位于红色框内,它的主要职能就是处理跨中台微服务的服务组合和编排,以及微服务之间的协调,它还可以完成前端不同渠道应用的适配。

不妨借用 BFF(服务于前端的后端,Backend for Frontends)这个词,暂且称它为BFF 微服务。BFF 微服务与其它微服务存在较大的差异,就是它没有领域模型,因此这个微服务内也不会有领域层。BFF 微服务可以承担应用层和用户接口层的主要职能,完成各个中台微服务的服务组合和编排,可以适配不同前端和渠道的要求.
8. 最佳实践:如何实现高内聚低耦合的微服务
8.1 业务逻辑与外部依赖的解耦
要实现高内聚低耦合,首先要保证业务逻辑的独立性。通过DDD、整洁架构或六边形架构的应用,可以确保核心业务逻辑不受外部系统变化的影响。
8.2 微服务之间的通信与集成
微服务之间的通信方式有同步和异步两种,常见的协议有RESTful API、gRPC等。选择合适的通信方式可以减少服务之间的耦合,提高系统的性能。
8.3 服务的独立性与可扩展性
服务的独立性是微服务架构成功的关键。每个微服务应能够独立部署、独立扩展,同时保证服务之间的协作不被影响。
9. 小结
DDD 分层架构、整洁架构、六边形架构都是以领域模型为核心,实行分层架构,内部核心业务逻辑与外部应用、资源隔离并解耦 .
如何在微服务架构中实现高内聚低耦合,如何通过架构模型的合理设计提高系统的灵活性和可维护性,将是技术团队面临的主要挑战。

相关文章:
DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)
文章目录 引言1. 概述2. 领域驱动设计(DDD)分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构:洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构:解耦核心业务与外部系统4.1 六边形架…...
数据结构与算法之二叉树: LeetCode LCP 10. 二叉树任务调度 (Ts版)
二叉树任务调度 https://leetcode.cn/problems/er-cha-shu-ren-wu-diao-du/description/ 描述 任务调度优化是计算机性能优化的关键任务之一。在任务众多时,不同的调度策略可能会得到不同的总体执行时间,因此寻求一个最优的调度方案是非常有必要的 通…...
在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入
现有AWS EMR集群上运行PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库也需要导入S3上的文件到表。现在要用AWS KMS有客户端密钥加密S3上的文件,同时允许PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库…...
玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...
如何进行API版本控制?
一、URI路径版本控制(Path Versioning) 通过在API的URL路径中包含版本号来实现。例如: /api/v1/products /api/v2/products 这种方法最为直观,用户可以根据URL判断版本。它的优点是简单易懂,容易实现。但如果接口变动频繁,可能会导致大量的路径不同版本的接口需要维护…...
计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补
A. 输出 a b c abc abc 即可。 void slove () {int a, b, c;cin >> a >> b >> c;cout << (a b c) << endl; }B. C. 如果 ∑ i 1 n a i S \sum_{i1}^{n}a_iS ∑i1naiS 那么存在所有人说的都是真话的可能。 否则,我们…...
Ruby 类和对象
Ruby 类和对象 引言 在软件开发中,类和对象是面向对象编程(OOP)的核心概念。Ruby 作为一种动态、解释型编程语言,也以简洁的方式支持面向对象编程。本文将深入探讨 Ruby 中的类和对象,包括它们的定义、创建、使用以及一些高级特性。 类与对象的定义 类 在 Ruby 中,类…...
【自学笔记】JavaWeb的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JavaWeb知识点一、基础概念二、项目结构三、Tomcat服务器四、数据库连接(JDBC)五、前端技术六、高级技术 总结 以下是JavaWeb知识点的MD格式…...
OpenCV:闭运算
目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:开运算-CSDN博客 1. 简述…...
智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程
智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN k8s搭建教程 首先下载代码文件 git clone https://github.com/xiaoxiaoranxxx/POT-ZHIYUN.git cd POT-ZHIYUN编译镜像 代码相关文件在github https://github.com/x…...
万物皆有联系:驼鸟和布什
布什?一块布十块钱吗?不是,大家都知道,美国有两个总统,叫老布什和小布什,因为两个布什总统(父子俩),大家就这么叫来着,目的是为了好区分。 布什总统的布什&a…...
nodejs:js-mdict 的下载、安装、测试、build
js-mdict 项目的目录结构:js-mdict 项目教程 js-mdict 下载地址: js-mdict-master.zip 先解压到 D:\Source\ js-mdict 6.0.2 用了 ts (TypeScript) 和 Jest,增加了应用开发的难度,因为先要了解 ts 和 Jest。 参阅:测试与开发&a…...
< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机
原因: < OS 有关 > 阿里云:轻量应用服务器 的使用 :从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作: 查看进程&#x…...
sqlzoo答案4:SELECT within SELECT Tutorial
sql练习:SELECT within SELECT Tutorial - SQLZoo world表: namecontinentareapopulationgdpAfghanistanAsia6522302550010020343000000AlbaniaEurope28748283174112960000000AlgeriaAfrica238174137100000188681000000AndorraEurope46878115371200000…...
Ubuntu全面卸载mysql
如果你已经看到whereis mysql输出了与MySQL相关的路径,说明MySQL仍然存在于系统中。要卸载MySQL,可以按照以下步骤操作,确保完全删除所有相关的文件和配置: 1. 停止MySQL服务 首先,停止MySQL服务: sudo …...
SOME/IP--协议英文原文讲解3
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…...
350.两个数组的交集 ②
目录 题目过程解法 题目 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑…...
药店药品销售管理系统的设计与实现
标题:药店药品销售管理系统的设计与实现 内容:1.摘要 摘要:本文介绍了药店药品销售管理系统的设计与实现。该系统旨在提高药店的运营效率和管理水平,通过信息化手段实现药品销售、库存管理、财务管理等功能。本文详细阐述了系统的需求分析、设计思路、技…...
汽车蓝牙钥匙定位仿真小程序
此需求来自于粉丝的真实需求,假期没事,牛刀小试。 一、项目背景 如今,智能车钥匙和移动端定位技术已经相当普及。为了探索蓝牙 Beacon 在短距离定位场景下的可行性,我们搭建了一个简易原型:利用 UniApp 在移动端采集蓝牙信标的 RSSI(信号强度),通过三边定位算法估算钥…...
unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景,仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…...
四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)
四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用) 文章目录 四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)1. 有序集合 Zset(sorted set)2. zset 有序…...
S4 HANA税码科目确定(OB40)
本文主要介绍在S4 HANA OP中税码科目确定(OB40)相关设置。具体请参照如下内容: 税码科目确定(OB40) 在以上界面维护“Transaction Key”的记账码。 在以上界面进一步维护“Transaction Key”确定科目的规则。 Chart of Account:用于明确该规则适用于什么科目表。 …...
DeepSeek的崛起与OpenAI的守擂:AI大模型时代的竞争新格局
DeepSeek的崛起与OpenAI的守擂:AI大模型时代的竞争新格局 近年来,全球生成式AI领域风起云涌,中国初创公司DeepSeek(深度求索)凭借一系列创新动作异军突起,引发行业热议。从发布对标GPT-4的MoE模型到开源轻量…...
CSDN的历史
CSDN(中国开发者网络,China Software Developer Network)是中国最具影响力的IT技术社区之一,其历史可追溯至1999年。以下是其发展历程和关键节点: --- **一、创立背景(1999年)** - **创始人**:蒋涛(国内知名技术人,曾参与金山软件早期开发)。 - **初衷**:为国内程…...
vim的特殊模式-可视化模式
可视化模式:按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例: (vim可视化模式的进阶使用:vim可视化模式的进阶操作-CSDN博客)...
鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)_鸿蒙arkui tab 切换动画
PageTransitionExit({type?: RouteType,duration?: number,curve?: Curve | string,delay?: number}) 在HarmonyOS中,PageTransitionEnter和PageTransitionExit是用于控制页面切换动画的参数。它们分别表示页面进入和退出时的动画。1. type(动画类型…...
UE5制作视差图
双目深度估计开源数据集很多都是用UE制作的,那么我们自己能否通过UE制作自己想要的场景的数据集呢。最近花了点时间研究了一下,分享给需要的小伙伴。 主要使用的是UnrealCV插件,UnrealCV是一个开源项目,旨在帮助计算机视觉研究人…...
根据每月流量和市场份额排名前20 的AI工具列表
ChatGPT:由Open AI研发,是一款对话式大型语言模型。它能够理解自然语言输入,生成连贯且符合逻辑的回复。可用于文本创作,如撰写文章、故事、诗歌;还能解答各种领域的知识问题,提供翻译、代码解释等服务&…...
前端学习-事件委托(三十)
目录 前言 课前思考 for循环注册事件 语法 事件委托 1.事件委托的好处是什么? 2.事件委托是委托给了谁,父元素还是子元素 3.如何找到真正触发的元素 示例代码 总结 前言 才子佳人,自是白衣卿相 课前思考 1.如果同时给多个元素注册事件&…...
