当前位置: 首页 > news >正文

微服务模式:业务服务模式

无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图以概念性的方式强调这些区别,通过重新审视每种架构中内置的一些核心设计模式和原则。

那么,让我们从“六边形架构”(Hexagonal Architecture)开始,以及它与企业应用业务逻辑的关系。

六边形架构

任何企业应用中的业务服务理论上都在其核心使用了六边形架构

edb68e82c15f466119e7a60d34f91eb6.png

六边形架构/端口和适配器架构是一种用于软件架构设计的架构模式。它旨在创建松散耦合的应用组件,可以通过端口和适配器与其软件环境轻松连接。(维基百科)

图01 — 六边形架构

如图01所示,“业务服务逻辑”是六边形架构的核心。

领域模型模式

传统的过程式事务脚本模式通常是实现“简单业务逻辑”的一种很好的方式。

事务脚本模式:将业务逻辑组织成一组每个类型请求一个的过程性事务脚本。 但是,当实现“复杂业务逻辑”时,应考虑使用领域模型模式*,*基本上是使用面向对象设计(OOD)。

领域模型模式:将业务逻辑组织成一个对象模型,其中包含具有状态和行为的类[1]。

领域驱动设计(DDD)

然而,领域模型模式在典型的单体应用后端上效果良好,但在微服务应用中有一定局限性,这基本上由领域驱动设计(DDD)所覆盖。

DDD是对OOD的细化,它是一种开发复杂后端业务逻辑的方法。 使用DDD时,每个服务都有其自己的领域模型,避免了整个应用程序的统一领域模型的问题。

战略模式与战术模式

DDD提出了多种战略模式和战术模式。

其中两个关键的战略模式是子域(Subdomains)和有界上下文(Bounded Contexts)。这些模式通常有助于在应用程序中分解业务逻辑。

根据Vaughn Vernon的《实现领域驱动设计》一书[5],子域存在于问题空间,有界上下文存在于解决方案空间。 换句话说,有界上下文帮助您管理应用程序中的复杂性,而子域则有助于组织和管理业务域的不同方面。 在实践中,有界上下文通常与一个子域对齐,但也可能在单个子域内有多个有界上下文,或者有一个跨越多个子域的有界上下文。 在每个有界上下文中,我们可以建立专门负责各自领域的团队来进行管理。这些团队负责构建给定领域的构件、需求、规范和服务。 战术模式基本上是您在服务中定义的领域模型的构建块。其中一些战术设计模式是实体(Entity)、值对象(Value Object)、工厂(Factory)、仓库(Repository)、服务(Service)和聚合(Aggregate)。 在本文中,我们将更深入地研究聚合模式及其在典型微服务设计中的用途。

聚合模式

聚合模式:将一个领域模型组织为一组聚合,每个聚合都是一个可以视为单元的对象图[1] 传统的领域模型是一个类和它们之间的关系的集合。在这个模型中,所有类和关系都是相互关联的,相对较难找到每个业务对象的边界,这是复杂微服务设计的关键要求。DDD中的聚合模式可以帮助您解决这个问题。 在聚合模式中,根据定义,将领域模型结构化为一组聚合使其边界显式并更易于理解。

图02 — 具有聚合的领域模型

每个聚合都有一个根实体(聚合根),可能有一个或多个值对象。

但这并不意味着一个聚合只能有一个实体。您可以在一个聚合中有多个实

体。但最佳实践是在一个聚合内有最少数量的实体,以提高每个事务的可扩展性。

聚合根是主要实体,它保存对领域模型中其他聚合的引用,并且是唯一一个可以用于直接查找的聚合中的实体。在聚合中的组件(例如值对象)将彼此间有对象引用。在图02中,您将看到这一点,每个引用的聚合主键ID都存储在主要聚合中,即聚合01。这允许在领域模型内部实现更松散耦合的架构。

聚合通常是从数据库完整加载(以避免任何延迟加载)。即使在它被删除的同时,聚合也会将其边界内的所有对象从数据库中移除。除此之外,将它们存储在像MongoDB这样的NoSQL数据库中更加简单。

简而言之,应用DDD聚合模式将:

1.将服务中的领域模型模块化。2.消除服务之间的对象引用(在DDD中,不同聚合中的类之间的引用是基于主键值而不是对象引用)。3.事务只能创建或更新单个聚合。这允许应用程序使用Saga模式更新多个聚合(我在之前的博客文章中详细讨论了Saga模式)。

聚合与Saga模式

Saga编排了一系列(微)服务中的本地事务,以保持数据一致性。每个本地事务都与一个映射的聚合相关联(参见图03)。

7762d34dc936dab2a8fffe0a38bf1430.png

图03 — 连接聚合模式和Saga模式

聚合与有界上下文

在技术理论上,有关“有界上下文”和“聚合”之间的区别有一些误解。因此,了解它们之间的区别及其与微服务的关联至关重要。

如前所述,微服务可以通过“有界上下文”或“领域”来解释。每个“有界上下文”将有一个或多个“聚合”。

ddb4d305abeaa070ac6b3ffae158aa04.png

因此,在实践中,微服务不应小于一个聚合,也不应大于一个有界上下文。

图04 — 有界上下文与聚合

领域事件模式

在概念上,当聚合被创建和更新时,它们会发布领域事件。聚合知道其状态何时发生变化,因此知道要发布的事件。

这些领域事件最终作为消息发布到消息代理(例如Kafka)。

领域事件模式:当聚合被创建并且经历某些其他重要变化时,发布领域事件[1]。

事件风暴

有几种策略可以识别领域事件。其中一种流行的策略是事件风暴,可以通过一种研讨会形式的安排来执行,以了解具有许多事件的复杂领域。这种研讨会的最终结果是一个以事件为中心的领域模型,其中包含聚合和事件。

相关文章:

微服务模式:业务服务模式

无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图以概念性的方式强调这些区别&#xff0c…...

idea中创建请求基本操作

文章目录 说明效果创建GET请求没有参数带有参数带有环境变量带有动态参数 说明 首先通过###三个井号键来分开每个请求体,然后请求url和header参数是紧紧挨着的,请求参数不管是POST的body传参还是GET的parameter传参,都是要换行的,…...

springboot整合log4j2

1.排除springboot本身日志 2.添加log4j2 maven没有父项目 就必须指定version!! 3.配置application.yml文件 打印sql级别为debug 4.配置log4j2.xmllogging.configclasspath:log4j2.xml logging.level.com.zhkj.shoppingdebug #mybatis-plus.mapper-locations classpath*:/mapp…...

Linux输出内容到指定文件

1. 记录终端输出至文本文件 1.1 解决方案1:利用>和>>命令 区别: > 是把输出转向到指定的文件。注意:如文件已存在的话会重新写入,文件原内容不会保留。 >> 是把输出附加到文件的后面,文件原内容会…...

mysql主从同步怎么跳过错误

今天介绍两种mysql主从同步跳过错误的方法: 一、两种方法介绍 1、跳过指定数量的事务: mysql>slave stop; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1 #跳过一个事务 mysql>slave start2、修改mysql的配置文件,通过slav…...

【论文阅读】DEPIMPACT:反向传播系统依赖对攻击调查的影响(USENIX-2022)

Fang P, Gao P, Liu C, et al. Back-Propagating System Dependency Impact for Attack Investigation[C]//31st USENIX Security Symposium (USENIX Security 22). 2022: 2461-2478. 攻击调查、关键边、入口点 开源:GitHub - usenixsub/DepImpact 目录 1. 摘要2. 引…...

Nginx 功能及配置详解

一、Nginx概述 Nginx是一款高性能的HTTP和反向代理服务器,也是一款IMAP/POP3/SMTP代理服务器。Nginx被广泛应用于服务端的Web开发,主要用于提供高效、稳定的网页访问服务。Nginx的主要特点包括:高并发连接处理能力、稳定性高、配置灵活和功能…...

CSS 瀑布流效果效果

示例 <!DOCTYPE html> <html lang="cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>瀑布流效果</title><style>…...

Python 进阶(一):PyCharm 下载、安装和使用

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、下载 PyCharm二、安装 PyCharm三、创建项目四、界面汉化五、实用技巧5.1、使用快捷…...

微信小程序使用ECharts的示例详解

目录 安装 ECharts 组件使用 ECharts 组件图表延迟加载 echarts-for-weixin 是 ECharts 官方维护的一个开源项目&#xff0c;提供了一个微信小程序组件&#xff08;Component&#xff09;&#xff0c;我们可以通过这个组件在微信小程序中使用 ECharts 绘制图表。 echarts-fo…...

微信小程序生成二维码(weapp-qrcode)可添加logo

插件 npm 地址&#xff1a;https://www.npmjs.com/package/weapp-qrcode 插件 GitHub 地址&#xff1a;https://github.com/yingye/weapp-qrcode/tree/master 一、引入 1、根据 GitHub 指引将 weapp-qrcode 放到本地 uitl 文件夹下&#xff1b; 2、创建 canvas <canvas c…...

【云原生】Docker容器资源限制(CPU/内存/磁盘)

目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容…...

内核链表在用户程序中的移植和使用

基础知识 struct list_head {struct list_head *next, *prev; }; 初始化&#xff1a; #define LIST_HEAD_INIT(name) { (name)->next (name); (name)->prev (name);} 相比于下面这样初始化&#xff0c;前面初始化的好处是&#xff0c;处理链表的时候&#xff0c;不…...

使用C#基于ComPDFKit SDK快速构建PDF阅读器

在当今世界&#xff0c;Windows 应用程序对我们的工作至关重要。随着处理 PDF 文档的需求不断增加&#xff0c;将 ComPDFKit PDF 查看和编辑功能集成到您的 Windows 应用程序或系统中&#xff0c;可以极大地为您的用户带来美妙的体验。 在本博客中&#xff0c;我们将首先探索集…...

el-tabel导出excel表格

1、安装插件 npm install file-saver --save npm install xlsx --save 2、引入插件 import FileSaver from "file-saver"; import * as XLSX from xlsx; 3、在tabel中添加ref属性和导出方法 4、添加方法 exportExcel (excelName) {try {const $e this.$refs[repo…...

双击start.bat文件闪退,运行报错“unable to access jarfile”

问题&#xff1a;电脑运行“start.bat”文件&#xff0c;无反应&#xff0c;闪退&#xff0c;管理员身份运行报错“unable to access jarfile” 解决思路&#xff1a; 1、由于该项目运行需要jdk环境&#xff0c;检查jdk版本需要是1.8.0_251版本 通过在 cmd 命令行输入java -v…...

大数据Flink(五十一):Flink的引入和Flink的简介

文章目录 Flink的引入和Flink的简介 一、Flink的引入 1、第1代——Hadoop MapReduce...

c语言的数据类型 -- 与GPT对话

1 c语言的数据类型 在C语言中,数据类型用于定义变量的类型和存储数据的方式。C语言支持多种数据类型,包括基本数据类型和派生数据类型。以下是C语言中常见的数据类型: 基本数据类型(Primary Data Types): int: 整数类型,通常表示带符号的整数。char: 字符类型,用于存储…...

Truffle 进行智能合约测试

其他依赖 node.js、 由于是利用npm进行&#xff0c;所以先设置国内镜像源。去网上搜 1.安装truffle npm install truffle -gtruffle --version 安装完其他项目依赖&#xff0c;能够产生一下效果 2.项目创建 创建test文件夹 mkdir test进入test cd test初始化项目 truffle …...

vb+access库存管理系统设计与实现

第一章库存信息管理系统的基本问题 1.1 库存信息管理系统的简介 本系统是为了提高腾达公司自动化办公的水平、经过详细的调查分析初步制定了腾达公司库存信息管理系统。基于WINDOWS 98 平台,使用Microsoft Access97, 在Visual Basic 6.0编程环境下开发的库存信息管理系统。该…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...