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的分层架构包括:

  1. 领域层(Domain Layer):负责核心业务逻辑的实现,包括领域模型和领域服务。领域层是系统的核心,承载着系统的业务规则。
  2. 应用层(Application Layer):负责处理用户请求,调用领域层的功能,完成业务流程。应用层并不包含业务逻辑,而是通过领域层来实现业务功能。
  3. 接口层(Interface Layer):负责与外部系统(如UI、外部API等)的交互。接口层通过应用层向用户或外部系统提供服务。
  4. 基础设施层(Infrastructure Layer):提供数据存储、消息队列等底层资源的支持。基础设施层实现与外部系统的集成。

通过这种分层,DDD确保了系统的业务逻辑与外部依赖的解耦,使得业务模型能够独立演化,不受外部系统变动的影响。


3. 整洁架构:洋葱架构与依赖倒置

整洁架构(Clean Architecture)由Robert C. Martin提出,其核心思想是将系统的核心业务逻辑与外部技术细节进行隔离。整洁架构强调分层设计,并通过依赖倒置原则(Dependency Inversion Principle)来实现各层之间的解耦。

在这里插入图片描述

3.1 整洁架构的核心思想

整洁架构的核心思想是将应用划分为多个层次,每个层次负责不同的职责。其结构类似于洋葱,每一层都像洋葱的外皮一样包裹着内层,外层依赖于内层,而内层则完全不依赖于外层。

  • 核心层:包括领域模型、领域服务和应用服务,这些层次实现了核心的业务逻辑。
  • 外部层:包括用户接口、数据库、缓存、消息队列等,这些层负责与外部世界的交互。

3.2 整洁架构的层次结构

整洁架构的典型层次结构如下:

  1. 核心层(Core Layer):包含领域模型、领域服务、应用服务等,它们定义了应用的核心业务逻辑。
  2. 接口层(Interface Layer):定义了系统与外部交互的接口,如UI层、API层等。
  3. 基础设施层(Infrastructure Layer):负责数据库、文件系统、缓存等基础设施的实现。
  4. 外部适配层(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 微服务的分层设计

微服务架构设计中的分层结构通常包括以下几层:

  1. 表示层(API层):负责与用户或外部系统交互,暴露服务接口。
  2. 服务层(业务层):处理业务逻辑,协调不同微服务之间的交互。
  3. 领域层:负责领域模型的实现和核心业务逻辑的处理。
  4. 数据层:负责数据存储和持久化。

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 分层架构、整洁架构、六边形架构都是以领域模型为核心,实行分层架构,内部核心业务逻辑与外部应用、资源隔离并解耦 .

如何在微服务架构中实现高内聚低耦合,如何通过架构模型的合理设计提高系统的灵活性和可维护性,将是技术团队面临的主要挑战。

在这里插入图片描述

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

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

相关文章

【大模型LLM面试合集】大语言模型架构_llama系列模型

llama系列模型 1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月,Meta(原Facebook)推出了LLaMA大模型,使用了1.4T token进行训练,虽然最大模型只有65B&…

深入探索Vue 3组合式API

深入探索Vue 3组合式API 深入探索Vue 3组合式API一、组合式API诞生背景1.1 Options API的局限性1.2 设计目标二、核心概念解析2.1 setup() 函数:组合式API的基石2.2 响应式系统:重新定义数据驱动2.3 生命周期:全新的接入方式2.4 响应式原理探…

微调llama3问题解决-RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment

问题说明之一 具体问题如下: RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero.我使用的这套是根据…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter1-什么是 JavaScript

一、什么是 JavaScript 虽然 JavaScript 和 ECMAScript(发音为“ek-ma-script”) 基本上是同义词,但 JavaScript 远远不限于 ECMA-262 所定义的那样。没错,完整的 JavaScript 实现包含以下几个部分。 核心(ECMAScript&…

2. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--.NET Aspire 概览

在当今快速发展的软件开发领域,构建高效、可靠且易于维护的云原生应用程序已成为开发者和企业的核心需求。.NET Aspire 作为一款专为云原生应用设计的开发框架,旨在简化分布式系统的构建和管理,提供了一整套工具、模板和集成包,帮…

49【服务器介绍】

服务器和你的电脑可以说是一模一样的,只不过用途不一样,叫法就不一样了 物理服务器和云服务器的区别 整台设备眼睛能够看得到的,我们一般称之为物理服务器。所以物理服务器是比较贵的,不是每一个开发者都能够消费得起的。 …

Redis代金卷(优惠卷)秒杀案例-单应用版

优惠卷表:优惠卷基本信息,优惠金额,使用规则 包含普通优惠卷和特价优惠卷(秒杀卷) 优惠卷的库存表:优惠卷的库存,开始抢购时间,结束抢购时间.只有特价优惠卷(秒杀卷)才需要填写这些信息 优惠卷订单表 卷的表里已经有一条普通优惠卷记录 下面首先新增一条秒杀优惠卷记录 { &quo…

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示

DeepSeek蒸馏模型:轻量化AI的演进与突破

目录 引言 一、知识蒸馏的技术逻辑与DeepSeek的实践 1.1 知识蒸馏的核心思想 1.2 DeepSeek的蒸馏架构设计 二、DeepSeek蒸馏模型的性能优势 2.1 效率与成本的革命性提升 2.2 性能保留的突破 2.3 场景适应性的扩展 三、应用场景与落地实践 3.1 智能客服系统的升级 3.2…

物联网领域的MQTT协议,优势和应用场景

MQTT(Message Queuing Telemetry Transport)作为轻量级发布/订阅协议,凭借其低带宽消耗、低功耗与高扩展性,已成为物联网通信的事实标准。其核心优势包括:基于TCP/IP的异步通信机制、支持QoS(服务质量&…

基于“蘑菇书”的强化学习知识点(五):条件期望

条件期望 摘要一、条件期望的定义二、条件期望的关键性质三、条件期望的直观理解四、条件期望的应用场景五、简单例子离散情况连续情况 摘要 本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL! 对应蘑菇书Eas…

Node.js与嵌入式开发:打破界限的创新结合

文章目录 一、Node.js的本质与核心优势1.1 什么是Node.js?1.2 嵌入式开发的范式转变 二、Node.js与嵌入式结合的四大技术路径2.1 硬件交互层2.2 物联网协议栈2.3 边缘计算架构2.4 轻量化运行时方案 三、实战案例:智能农业监测系统3.1 硬件配置3.2 软件架…

Shell 中的 Globbing:原理、使用方法与实现解析(中英双语)

Shell 中的 Globbing:原理、使用方法与实现解析 在 Unix Shell(如 Bash、Zsh)中,globbing 是指 文件名模式匹配(filename pattern matching),它允许用户使用特殊的通配符(wildcards…

7 与mint库对象互转宏(macros.rs)

macros.rs代码定义了一个Rust宏mint_vec,它用于在启用mint特性时,为特定的向量类型实现与mint库中对应类型的相互转换。mint库是一个提供基本数学类型(如点、向量、矩阵等)的Rust库,旨在与多个图形和数学库兼容。这个宏…

P3078[USACO13MAR] Poker Hands S

P3078[USACO13MAR] Poker Hands S https://www.luogu.com.cn/problem/P3078 前言 学习差分后写的第一道题,直接给我干懵逼,题解都看不懂……吃了个晚饭后开窍写出来了,遂成此篇。 题目 翻译版本 Bessie 和她的朋友们正在玩一种独特的扑克游…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式(重点)1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

Redis基础(二)——通用命令与五大基本数据类型

目录 一、Redis数据结构基本介绍 二、Redis通用命令 1.查看通用命令 2.KEYS:查看符合模板的所有key 3.DEL:删除指定的Key 4.lEXISTS:判断key是否存在 5.lEXPIRE:给一个key设置有效期,有效期到期时该key会被自…

Ajax:重塑Web交互体验的人性化探索

在数字化时代,网页的交互性和响应速度已成为衡量用户体验的关键指标。Ajax(Asynchronous JavaScript and XML),作为前端与后端沟通的桥梁,凭借其异步通信的能力,极大地提升了网页的动态性和用户友好度&…

ComfyUI工作流 参考图像生成人像手办(SDXL版)

文章目录 参考图像生成人像手办SD模型Node节点工作流程效果展示开发与应用参考图像生成人像手办 此工作流旨在实现将图像生成高精度的3D手办风格效果,通过深度学习技术完成从图像处理、模型加载、提示词优化到图像生成和超分辨率处理的一系列操作。整个流程以SDXL模型为核心,…

c语言 程序计算圆的面积(Program to find area of a circle)

给定圆的半径,求该圆的面积。 可以使用以下公式简单地计算圆的面积。 其中 r 是圆的半径,它可能是浮点数,因为饼图的值为 3.14 方法:使用给定的半径,使用上述公式找到面积:(pi * r * r&#…