微服务模式:业务服务模式
无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图以概念性的方式强调这些区别,通过重新审视每种架构中内置的一些核心设计模式和原则。
那么,让我们从“六边形架构”(Hexagonal Architecture)开始,以及它与企业应用业务逻辑的关系。
六边形架构
任何企业应用中的业务服务理论上都在其核心使用了六边形架构
六边形架构/端口和适配器架构是一种用于软件架构设计的架构模式。它旨在创建松散耦合的应用组件,可以通过端口和适配器与其软件环境轻松连接。(维基百科)
图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)。
图03 — 连接聚合模式和Saga模式
聚合与有界上下文
在技术理论上,有关“有界上下文”和“聚合”之间的区别有一些误解。因此,了解它们之间的区别及其与微服务的关联至关重要。
如前所述,微服务可以通过“有界上下文”或“领域”来解释。每个“有界上下文”将有一个或多个“聚合”。
因此,在实践中,微服务不应小于一个聚合,也不应大于一个有界上下文。
图04 — 有界上下文与聚合
领域事件模式
在概念上,当聚合被创建和更新时,它们会发布领域事件。聚合知道其状态何时发生变化,因此知道要发布的事件。
这些领域事件最终作为消息发布到消息代理(例如Kafka)。
领域事件模式:当聚合被创建并且经历某些其他重要变化时,发布领域事件[1]。
事件风暴
有几种策略可以识别领域事件。其中一种流行的策略是事件风暴,可以通过一种研讨会形式的安排来执行,以了解具有许多事件的复杂领域。这种研讨会的最终结果是一个以事件为中心的领域模型,其中包含聚合和事件。
相关文章:
微服务模式:业务服务模式
无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图以概念性的方式强调这些区别,…...
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 下载、安装和使用
❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、下载 PyCharm二、安装 PyCharm三、创建项目四、界面汉化五、实用技巧5.1、使用快捷…...
微信小程序使用ECharts的示例详解
目录 安装 ECharts 组件使用 ECharts 组件图表延迟加载 echarts-for-weixin 是 ECharts 官方维护的一个开源项目,提供了一个微信小程序组件(Component),我们可以通过这个组件在微信小程序中使用 ECharts 绘制图表。 echarts-fo…...
微信小程序生成二维码(weapp-qrcode)可添加logo
插件 npm 地址:https://www.npmjs.com/package/weapp-qrcode 插件 GitHub 地址:https://github.com/yingye/weapp-qrcode/tree/master 一、引入 1、根据 GitHub 指引将 weapp-qrcode 放到本地 uitl 文件夹下; 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; }; 初始化: #define LIST_HEAD_INIT(name) { (name)->next (name); (name)->prev (name);} 相比于下面这样初始化,前面初始化的好处是,处理链表的时候,不…...
使用C#基于ComPDFKit SDK快速构建PDF阅读器
在当今世界,Windows 应用程序对我们的工作至关重要。随着处理 PDF 文档的需求不断增加,将 ComPDFKit PDF 查看和编辑功能集成到您的 Windows 应用程序或系统中,可以极大地为您的用户带来美妙的体验。 在本博客中,我们将首先探索集…...
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”
问题:电脑运行“start.bat”文件,无反应,闪退,管理员身份运行报错“unable to access jarfile” 解决思路: 1、由于该项目运行需要jdk环境,检查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进行,所以先设置国内镜像源。去网上搜 1.安装truffle npm install truffle -gtruffle --version 安装完其他项目依赖,能够产生一下效果 2.项目创建 创建test文件夹 mkdir test进入test cd test初始化项目 truffle …...
vb+access库存管理系统设计与实现
第一章库存信息管理系统的基本问题 1.1 库存信息管理系统的简介 本系统是为了提高腾达公司自动化办公的水平、经过详细的调查分析初步制定了腾达公司库存信息管理系统。基于WINDOWS 98 平台,使用Microsoft Access97, 在Visual Basic 6.0编程环境下开发的库存信息管理系统。该…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
