11、中台-DDD-几种微服务架构模型对比分析

引言

在上一章中,我们深入探讨了DDD分层架构的基本概念和实现方法。这一章将重点介绍几种常用的微服务架构模型,包括洋葱架构、六边形架构,并对这两种架构模型与DDD分层架构进行对比分析。通过了解不同架构模型的优缺点,帮助我们更好地设计高内聚、低耦合的中台领域模型和微服务。

11.1 洋葱架构

洋葱架构(Onion Architecture)是由Jeffrey Palermo在2008年提出的一种架构模型。它的名称来源于其层次结构像洋葱片一样,从内到外依次是领域模型、领域服务、应用服务和最外层的用户界面及基础资源。洋葱架构的核心原则是依赖倒置原则,越往内依赖程度越低,代码级别越高,越是核心能力。外层代码只能依赖内层,内层对外层无感知。

11.1.1 洋葱架构的层次结构

洋葱架构分为多个层次,每一层都有明确的职责:

  1. 核心层(Core Layer):包括领域模型和领域服务,核心层是洋葱架构的中心,负责实现系统的核心业务逻辑和规则。领域模型包含实体(Entity)、值对象(Value Object)和聚合(Aggregate),而领域服务负责处理跨实体的业务逻辑。
  2. 应用层(Application Layer):应用层负责服务的组合和编排,实现业务逻辑。应用服务通过调用领域服务来处理用户请求,并将处理结果返回给用户。应用层的职责是协调用户接口层和领域层,不包含领域逻辑,只负责调用领域层的功能。
  3. 接口层(Interface Layer):接口层负责处理用户的输入和展示处理结果。通过API网关连接前端应用和后端微服务。用户接口层通过DTO和门面接口提供灵活的数据接口,满足不同前端应用的需求。
  4. 基础设施层(Infrastructure Layer):基础设施层提供数据持久化、消息传递和第三方集成等服务。包括数据库访问层、消息队列等。
11.1.2 洋葱架构的优缺点

优点

  • 高内聚低耦合:通过依赖倒置原则,各层之间的依赖关系得到了很好的管理,系统的内聚性得到了提高,而耦合度得到了降低。
  • 领域模型为核心:洋葱架构将领域模型放在核心位置,确保了业务逻辑的稳定性和独立性。
  • 测试友好:由于各层之间的依赖关系是通过接口实现的,测试时可以很方便地对各层进行隔离测试。

缺点

  • 复杂度增加:洋葱架构引入了多个层次和接口,可能会增加系统的复杂度,特别是对于小型项目来说,这种复杂度的增加可能并不必要。
  • 学习曲线陡峭:对于不熟悉洋葱架构的开发人员来说,学习和掌握这种架构需要一定的时间和精力。
11.2 六边形架构

六边形架构(Hexagonal Architecture),又名“端口适配器架构”,由Alistair Cockburn于2005年提出。六边形架构的核心理念是应用通过端口与外部进行交互,内部核心业务逻辑(应用程序和领域模型)与外部资源(包括应用、Web应用及数据库资源等)完全隔离,仅通过适配器进行交互。

11.2.1 六边形架构的层次结构

六边形架构分为内六边形和外六边形:

  1. 内六边形(Inner Hexagon):内六边形实现应用的核心业务逻辑,包括领域模型和领域服务。领域模型包括实体(Entity)、值对象(Value Object)和聚合(Aggregate),而领域服务负责处理跨实体的业务逻辑。
  2. 外六边形(Outer Hexagon):外六边形完成外部应用、驱动和基础资源的交互和访问,通过适配器实现协议转换,使得应用程序能够一致地被用户、程序、自动化测试和批处理脚本使用。外六边形包含用户接口、应用接口、数据库访问、外部服务等。
11.2.2 六边形架构的优缺点

优点

  • 隔离性好:六边形架构通过端口和适配器的设计,使得核心业务逻辑与外部资源得到了很好的隔离,提升了系统的可维护性和扩展性。
  • 适应性强:六边形架构通过适配器的设计,使得系统可以很容易地适应不同的外部资源和接口要求。
  • 测试友好:通过端口和适配器的设计,可以很方便地对系统进行隔离测试,提高了系统的测试性。

缺点

  • 复杂度增加:六边形架构引入了多个层次和接口,可能会增加系统的复杂度,特别是对于小型项目来说,这种复杂度的增加可能并不必要。
  • 学习曲线陡峭:对于不熟悉六边形架构的开发人员来说,学习和掌握这种架构需要一定的时间和精力。
11.3 DDD分层架构

DDD分层架构(Layered Architecture with Domain-Driven Design)是一种通过分层设计来处理复杂业务逻辑的方法论。其核心思想是通过明确各层的职责和边界,来实现系统的高内聚、低耦合。DDD分层架构的目标是创建一个可维护、可扩展且能够灵活应对业务变化的系统。

11.3.1 DDD分层架构的层次结构

DDD分层架构通常包括四层:

  1. 用户接口层(User Interface Layer):负责处理用户的输入和展示处理结果。通过API网关连接前端应用和后端微服务。用户接口层通过DTO和门面接口提供灵活的数据接口,满足不同前端应用的需求。
  2. 应用层(Application Layer):负责服务的组合和编排,实现业务逻辑。应用服务通过调用领域层的功能来处理用户请求,并将处理结果返回给用户。应用层的职责是协调用户接口层和领域层,不包含领域逻辑,只负责调用领域层的功能。
  3. 领域层(Domain Layer):包含领域模型和领域服务,是系统的核心,负责实现核心业务逻辑。领域模型包括实体(Entity)、值对象(Value Object)和聚合(Aggregate),而领域服务负责处理跨实体的业务逻辑。
  4. 基础设施层(Infrastructure Layer):提供数据持久化、消息传递和第三方集成等服务。包括数据库访问层、消息队列等。
11.3.2 DDD分层架构的优缺点

优点

  • 高内聚低耦合:通过分层设计,各层之间的依赖关系得到了很好的管理,系统的内聚性得到了提高,而耦合度得到了降低。
  • 领域模型为核心:DDD分层架构将领域模型放在核心位置,确保了业务逻辑的稳定性和独立性。
  • 测试友好:由于各层之间的依赖关系是通过接口实现的,测试时可以很方便地对各层进行隔离测试。

缺点

  • 复杂度增加:DDD分层架构引入了多个层次和接口,可能会增加系统的复杂度,特别是对于小型项目来说,这种复杂度的增加可能并不必要。
  • 学习曲线陡峭:对于不熟悉DDD分层架构的开发人员来说,学习和掌握这种架构需要一定的时间和精力。
11.4 三种微服务架构模型的对比和分析

虽然DDD分层架构、洋葱架构和六边形架构在表现形式上存在很大差异,但它们的核心设计思想是一致的,都是为了实现核心业务逻辑和技术实现细节的分离和解耦。下表展示了这三种架构模型的对比和分析。

架构模型核心思想层次划分优点缺点
洋葱架构依赖倒置原则领域模型、领域服务、应用服务、用户界面及基础资源高内聚低耦合,领域模型为核心,测试友好复杂度增加,学习曲线陡峭

|
| 六边形架构 | 端口与适配器 | 内六边形(核心业务逻辑)、外六边形(用户接口、应用接口、数据库访问、外部服务) | 隔离性好,适应性强,测试友好 | 复杂度增加,学习曲线陡峭 |
| DDD分层架构 | 分层设计 | 用户接口层、应用层、领域层、基础设施层 | 高内聚低耦合,领域模型为核心,测试友好 | 复杂度增加,学习曲线陡峭 |

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

通过对DDD分层架构、洋葱架构和六边形架构的分析,可以总结出中台建模和微服务设计的几个要点:

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

中台建设的关键在于构建稳定的领域模型,确保业务逻辑的高度内聚和职责单一,提升应用的稳定性。领域模型应聚焦于核心业务逻辑,减少对前端需求的依赖,以提高代码质量和复用率。

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

微服务设计应有明确的分层,各层各司其职,建立松耦合的层间关系。领域层应保持纯洁,避免与领域无关的应用逻辑污染领域模型。应用层则负责服务的组合和编排,避免领域模型的逻辑复杂化。

11.5.3 应用逻辑与基础资源的解耦

在微服务设计中,需要通过仓储模式和依赖倒置设计方法,将业务逻辑与基础资源逻辑解耦,减少基础设施变更对业务逻辑的影响,提升系统的可维护性和扩展性。

11.6 案例分析:某电商平台的架构设计

为了更好地理解上述架构模型在实际项目中的应用,以下以一个电商平台为例,进行详细的案例分析。

11.6.1 需求分析

一个典型的电商平台需要处理以下业务需求:

  • 用户管理:用户注册、登录、信息管理等。
  • 商品管理:商品的增删改查、分类管理、库存管理等。
  • 订单管理:订单创建、支付、配送、订单状态管理等。
  • 促销管理:优惠券、折扣活动等。
11.6.2 系统架构设计

根据以上需求,可以设计一个基于DDD分层架构、洋葱架构或六边形架构的电商系统。以下是基于DDD分层架构的系统架构设计示例:

+--------------------+
|  用户接口层        |
+--------------------+
|  应用层            |
+--------------------+
|  领域层            |
+--------------------+
|  基础设施层        |
+--------------------+
11.6.3 各层职责与实现

用户接口层:负责处理用户的注册、登录、浏览商品、下单等操作。可以使用前端框架(如React、Vue)实现。

应用层:负责协调用户接口层和领域层,处理用户请求并返回结果。包括用户服务、商品服务、订单服务等。

public class OrderApplicationService {private final OrderRepository orderRepository;private final PaymentService paymentService;public OrderApplicationService(OrderRepository orderRepository, PaymentService paymentService) {this.orderRepository = orderRepository;this.paymentService = paymentService;}public void placeOrder(OrderDTO orderDTO) {Order order = new Order(orderDTO);orderRepository.save(order);paymentService.processPayment(order.getPaymentDetails());}public OrderDTO getOrder(String orderId) {Order order = orderRepository.findById(orderId);return new OrderDTO(order);}
}

领域层:包含用户、商品、订单等领域模型及其业务逻辑。通过实体、值对象、聚合等模型表示业务逻辑。

public class Order {private OrderId id;private List<OrderItem> items;private OrderStatus status;public Order(OrderId id, List<OrderItem> items) {this.id = id;this.items = items;this.status = OrderStatus.CREATED;}public void addItem(OrderItem item) {items.add(item);}public void removeItem(OrderItem item) {items.remove(item);}public void place() {if (items.isEmpty()) {throw new IllegalStateException("Cannot place an order with no items.");}this.status = OrderStatus.PLACED;}// getters and other methods
}

基础设施层:提供数据持久化、消息传递等服务。包括数据库访问层、消息队列等。

public class JpaOrderRepository implements OrderRepository {private final EntityManager entityManager;public JpaOrderRepository(EntityManager entityManager) {this.entityManager = entityManager;}@Overridepublic void save(Order order) {entityManager.persist(order);}@Overridepublic Order findById(OrderId id) {return entityManager.find(Order.class, id);}
}
11.6.4 应用CQRS和事件驱动架构

在电商系统中,可以结合CQRS和事件驱动架构,实现读写操作的分离和事件处理的解耦。

CQRS:将订单的写操作和读操作分离,通过命令总线处理写操作,通过查询总线处理读操作。

事件驱动架构:在订单创建、支付完成、订单状态变更等关键操作时,发布领域事件,通过事件总线传递给订阅者,实现各服务之间的异步解耦。

// 订单创建事件
public class OrderCreatedEvent {private String orderId;private String userId;private LocalDateTime createTime;// 构造函数、getter和setter方法
}// 发布订单创建事件
public void placeOrder(OrderDTO orderDTO) {Order order = new Order(orderDTO);orderRepository.save(order);OrderCreatedEvent event = new OrderCreatedEvent(order.getId(), order.getUserId(), LocalDateTime.now());eventBus.publish(event);
}// 处理订单创建事件
public class OrderCreatedEventHandler {@Subscribepublic void handle(OrderCreatedEvent event) {// 处理订单创建后的业务逻辑}
}
11.7 本章小结

本章介绍了洋葱架构和六边形架构,并对这两种架构模型与DDD分层架构进行了对比分析。通过对比分析,可以看出这三种架构模型在核心设计思想上的一致性,它们都致力于实现核心业务逻辑和技术实现细节的分离和解耦。合理应用这些架构模型,可以帮助我们设计出高内聚、低耦合的中台领域模型和微服务,从而提升系统的可维护性和扩展性。

通过对三种架构模型的深入理解和实践应用,我们可以更好地设计和构建复杂的分布式系统,更加灵活地应对快速变化的业务需求,提升系统的可维护性和扩展性。

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

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

相关文章

C++复合数据类型:指针类型、引用类型、指针和引用之间的关系

复合数据类型 (1)指针 A.What&#xff08;什么是指针&#xff09; 用于存放对象地址的复合数据类型 B.Which&#xff08;有哪些指针&#xff09; 空指针&#xff1a; int *p nullptr; int *p 0;//&#xff08;不指向任何对象&#xff09;void *&#xff1a; void *&…

fastermaker-boot代码生成器

fastermaker-boot 是基于Spring Boot3 、Vue3 的一个代码简洁、结构清晰、开发高效、模块可扩展的单体项目的基础开发框架&#xff0c;包含代码生成器模块&#xff0c;适合初级开发者特别是大学生学习研究使用&#xff0c;也是中小型系统快速开发的利器。 开发技术: JDK 17、Sp…

liunx清理服务器内存和日志

1、查看服务器磁盘占用情况 # 查看磁盘占用大小 df -h 2、删除data文件夹下面的日志 3、查看每个服务下面的日志输出文件&#xff0c;过大就先停掉服务再删除out文件再重启服务 4、先进入想删除输入日志的服务文件夹下&#xff0c;查看服务进程&#xff0c;杀掉进程&#xff…

DW03D是一款用于锂离子/聚合物电池保护的高集成度解决方案。DW03D包含内部功率MOSFET、高精度电压检测电路和延迟电路

一般概述 DW03D产品是单节锂离子/锂聚合物可充电电池组保护的高集成度解决方案。DW03D包括了先进的功率MOSFET&#xff0c;高精度的电压检测电路和延时电路。 DW03D具有非常小的TSS08-8的封装,这使得该器件非常适合应用于空间限制得非常小的可充电电池组应用。…

【备战秋招】——算法题目训练和总结day3

【备战秋招】——算法题目训练和总结day3&#x1f60e; 前言&#x1f64c;BC149简写单词题解思路分析代码分享&#xff1a; dd爱框框题解思路分析代码分享&#xff1a; 除2&#xff01;题解思路分析代码分享&#xff1a; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff…

Gradle 介绍

Gradle 定义 Gradle 是一个现代化的构建自动化工具&#xff0c;用于管理软件项目的构建过程和依赖关系。它通过一种灵活且强大的 DSL&#xff08;领域特定语言&#xff09;语法来描述项目的构建逻辑和任务&#xff0c;可以用于构建几乎任何类型的软件项目&#xff0c;从简单的应…

【Java数据结构】初识线性表之一:顺序表

使用Java简单实现一个顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 线性表大致包含如下的一些方法&#xff1a; public class MyArrayList { private int[] array; pri…

怎么将mkv视频格式转为mp4?这四种转换方法你肯定要试试!

怎么将mkv视频格式转为mp4&#xff1f;你是否曾被MKV格式的魅力深深吸引&#xff0c;仿佛踏入了一个充满奇幻色彩的多媒体秘境&#xff0c;那里&#xff0c;音频如溪流潺潺&#xff0c;视频似画卷铺展&#xff0c;字幕则如同夜空中最亮的星&#xff0c;三者交织成一场视听盛宴&…

【彻底禁用Windows系统的自动更新,让电脑使用更顺心!】

文章底部关注公众号&#xff1a;电脑维修小马 回复关键词即可获取软件及注册表&#xff1a;禁用更新 功能简介 自动更新是Windows系统的一项重要功能&#xff0c;旨在保持操作系统的安全性和最新状态。然而&#xff0c;对于许多用户来说&#xff0c;自动更新并不总是那么受欢迎…

ospf-lsa

区域间路由计算 OSPF 单区域带来问题 1. OSPF 网络规模扩大时&#xff0c;每个设备 LSDB 中的 LSA 数据变多&#xff0c;以及进行 SPF 计算时更加复杂&#xff0c; 增加设备的负担和性能损耗 2. 网络拓扑或者路由信息发生变化&#xff0c;网络中所有的设备需要更新…

linux:vi命令

vi * -p打开多个文件进行切换 .文件间切换 Ctrl6 //两文件间的切换 :bn //下一个文件 :bp //上一个文件 :ls //列出打开的文件&#xff0c;带编号 :b1~n //切换至第n个文件 对于用(v)split在多个窗格中打开的文件&#xff0c;这种方法只会在当前窗格中切换不同的文件Ctrl P&a…

c#验证输入语句是否带有sql入侵的方法

为了在C# WinForms中验证用户输入的数据是否包含SQL注入攻击语句&#xff0c;可以使用多种方法来检测和防止SQL注入。以下是几种常见的方法&#xff1a; 1. 使用参数化查询 参数化查询是防止SQL注入的最佳实践&#xff0c;它通过将用户输入作为参数传递给SQL查询&#xff0c;…

渔人杯——RE

贪吃蛇的秘密 修改代码后&#xff0c;报了一个错 # uncompyle6 version 3.9.1 # Python bytecode version base 3.7.0 (3394) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: snake1.py…

2023 N1CTF-n1canary

文章目录 参考n1canary模板类和模板函数make_unique和unique_ptrstd::unique_ptr示例&#xff1a; std::make_unique示例&#xff1a; 结合使用示例 operator->getrandom逆向源码思路exp 参考 https://nese.team/posts/n1ctf2023/ n1canary 模板类和模板函数 template &…

TCP协议的三次握手和四次挥手(面试)

三次握手 首先可以简单的回答&#xff1a; 1、第一次握手&#xff1a;客户端给服务器发送一个 SYN 报文。 2、第二次握手&#xff1a;服务器收到 SYN 报文之后&#xff0c;会应答一个 SYNACK 报文。 3、第三次握手&#xff1a;客户端收到 SYNACK 报文之后&#xf…

内存巨头SK海力士正深化与TSMC/NVIDIA合作关系,开发下一代HBM

据BusinessKorea报道&#xff0c;内存巨头SK海力士正深化与台积电(TSMC)及英伟达(NVIDIA)的合作关系&#xff0c;并计划在9月的台湾半导体展(Semicon Taiwan)上宣布更紧密的伙伴关系。 SK海力士与台积电的合作历史已久。2022年&#xff0c;台积电在其北美技术研讨会上宣布成立O…

GRE详解:概念、架构、原理、搭建过程、常用命令与实战案例

我们将深入探讨如何在 Linux 上设置 GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;。本文将涵盖 GRE 的定义、架构、原理、应用场景、常见命令体系&#xff0c;并通过详细的实战模拟展示如何在 Linux 系统上实际操作。希望通过这篇文章&a…

FlyDeliver践行社会责任,推动绿色物流发展

近日, 在追求商业成功的同时,FlyDeliver(FD配送)始终不忘践行社会责任。公司积极响应国家环保与可持续发展的号召,致力于推动绿色物流的发展。FlyDeliver(FD配送)在配送过程中积极采用低碳环保的运输方式,减少对环境的影响。同时,公司还积极参与各类公益活动,为社会献上爱心与力…

a-table(Ant Design Vue) 滚动到指定行位置

在使用 a-table 组件时&#xff0c;如果你想滚动到指定的行位置&#xff0c;可以通过访问内部的表格元素并调整其 scrollTop 属性来实现。以下是一个基于 Vue 和 Ant Design Vue 的例子&#xff0c;演示如何滚动到指定行位置&#xff1a; <template><a-table :column…

脉脉高聘:面对薪资福利减少,超40%职场人自动缩短工时

近日&#xff0c;脉脉高聘人才智库发布《2024职场生存洞察》&#xff08;下称《洞察》&#xff09;。 数据显示&#xff0c;2024上半年&#xff0c;新经济行业求职压力居高不下&#xff0c;人才供需比达到1.97&#xff0c;相当于2个人竞争1个岗位。求职压力也让职场人心态趋于…