领域驱动设计(DDD)微服务架构模式总结

part1. Domain Driven Design(Strategic Design,Tactical Design)

Top Down

focus on business or activityy domain

Ubiquitous Language:统一语言

Tactical Design Tools:战术性设计工具

Implementing Domain Driven Design(Event storming,DDD in code)

DDD总结:

Monoliths(大单体应用)

单体应用的优缺点:

part2.microservice architect patterns(微服务架构模式)

1.独享数据库(Database per microservice)

优点:

  • 数据由服务完全所有

  • 服务的开发团队之间耦合度降低

缺点:

  • 服务间的数据共享变得更有挑战性

  • 在应用范围内的保证ACID事务变的困难许多

  • 细心设计如何拆分单体数据库是一项极具挑战的任务

使用独享数据库的场景:

  • 在大型企业应用程序中

  • 在团队需要完全把控微服务以实现开发规模扩展和速度提升

不适合使用独享数据库的场景:

  • 在小规模应用中

  • 如果是单个团队开发所有微服务

可用技术demo: 所有SQL,NOSQL数据库都提供的逻辑分离(eg:单独的表、集合、结构、数据库)

2.事件源(Event Sourcing)(消息)

优点:

  • 为高可伸缩系统提供原子性操作

  • 自动记录实体变更历史,包括时序回溯功能

  • 松耦合和事件驱动的微服务

缺点:

  • 从事件存储中读取实体成为新挑战,通常需要额外的数据存储(CQRS模式)

  • 系统整体复杂度增加了,通常需要领域驱动设计

  • 系统需要处理事件重复(幂等)或丢失

  • 变更事件的结构成为新的挑战

使用事件源场景:

  • 使用关系数据库的、高可伸缩的事务型系统

  • 使用NOSQL数据库的事务型系统

  • 弹性高可伸缩微服务架构

  • 典型的消息驱动或事件驱动系统(电子商务、预定和预约系统)

不适合使用事件溯源的场景:

  • 使用SQL数据库的低可伸缩性事务型系统

  • 在服务可以同步交换数据(eg:通过API)的简单微服务架构中

可用技术demo: 事件存储:EventStoreDB, Apache kafka, Confluent Cloud, AWS kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, Mongodb, Cassandra, Amazon DynamoDB

框架:Lagom,Akka,spring,akkatecture,Axon,Eventuate

3.命令和查询职责分离(CQRS)

  • 简单模式:强化单一职责和分离关注点,从而实现简洁设计

  • CQRS高级模式:读写分离

优点:

  • 在事件驱动的微服务中数据读取速度更快

  • 数据的高可用性

  • 读写系统可独立扩展

缺点:

  • 读数据存储是弱一致性(最终一致性)

  • 整个系统的复杂性增加了,混乱的CQRS会显得危害整个项目

使用CQRS场景:

  • 在高可扩展的微服务架构中使用事件源

  • 在复杂领域模型中,读操作需要同时查询多个数据存储

  • 在读写操作负载差异明显的系统中

不适合使用CQRS的场景:

  • 在没必要存储大量事件的微服务架构中,用事件快照来计算实体状态是一个更好的选择

  • 在读写操作负载相近的系统中

可用技术demo:

写存储:EventStoreDB,Apache kafka, Confluent Cloud,AWS kinesis,Azure Event Hub, GCP Pub/Sub,Azure cosmos DB,mongodb,Cassandra,Amazon DynamoDB

读存储:es, Solr,Cloud Spanner,Amazon Aurora,Azure Cosmos DB,Neo4j

框架:Lagom,Akka,Spring,akkatecture,Axon,Eventuate

4.saga:实现分布式事务

saga使用于服务流程特别复杂长,如果本地事务失败,saga会执行一系列补偿事务来回滚前面本地事务的更改。

Saga事务协调管理主要有两种形式:

  1. 事件编排Choreography:分散协调,每个微服务生产并监听其他微服务的事件或消息然后决定是否执行XX动作

  2. 命令编排Orchestration:集中协调,由一个协调器告诉参与的微服务哪个本地事务需要执行

优点:

  • 为高可伸缩或松耦合的、事件驱动的微服务架构提供一致性事务

  • 为使用了不支持2pc的非关系数据库的微服务框架提供一致性事务

缺点:

  • 需要处理瞬时故障,并且提供幂等性

  • 难以调试,而且复杂性随着微服务数量增加而增加

使用saga场景:

  • 在使用事件源的高可伸缩、松耦合的微服务中

  • 在使用了分布式非关系数据库的系统中

不适合使用saga场景:

  • 使用关系数据库的低可伸缩性事务型系统

  • 在服务间存在循环依赖的系统中

可用技术demo:

Axon,Eventuate,Narayana

5.面向前端的后端(BFF):为前端定制了一个后端

优点:

  • 分离BFF之间的关注点,使得可以为具体的UI优化

  • 提供更高的安全性

  • 减少ui和下游微服务之间频繁的通信

缺点:

  • BFF之间代码重复

  • 大量的BFF用于其他用户界面(eg:智能电视、web、移动端、pc桌面版)

  • 需要仔细的设计和实现,BFF不应该包括任何业务逻辑,而应只包含特定客户端逻辑和行为

使用BFF的场景:

  • 如果应用程序有多个含不同api需求的ui

  • 出于安全需要,UI和下游微服务之间需要额外的层

  • 如果在UI开发中使用微前段

不适合BFF的场景:

  • 如果应用程序虽有多个UI,但使用的API相同

  • 如果核心微服务不是部署在DMZ网络中

可用技术demo:

任何后端框架(Node.js,spring,Django,Laravel,Flask,Play)

6.API网关

优点:

  • 在前端和后端服务之间提供松耦合

  • 减少客户端和微服务之间的调用次数

  • 通过SSL终端、身份验证和授权实现高安全性

  • 集中管理的横切关注点,eg: 日志记录和监视、节流、负载均衡

缺点:

  • 可能导致微服务架构中的单点故障

  • 额外的网络调用带来的延迟增加

  • 如果不进行扩展,容易成为整个企业应用的瓶颈

  • 额外哦维护和开发费用

使用API网关的场景:

  • 在复杂的微服务架构中,几乎是必备的

  • 在大型企业中,API网关是中心化安全性和横切关注点的必要工具

不适合使用API网关的场景:

  • 在安全和集中管理不是最优先要素的私人项目或小公司中

  • 如果微服务的数据相当少

可用技术demo:

Amazon API网关,Azure API网管,kong, Apigee,WSO2 API管理器

7.Strangler(扼杀者):单体向微服务过度的架构中使用 (Facade)

优点:

  • 安全的迁移单体应用程序到微服务

  • 可以并行的迁移已有功能和开发新功能

  • 迁移过程可以更好的把控节奏

缺点:

  • 在现有的单体应用服务和新的微服务之间共享数据存储变得具有挑战性

  • 添加Facade(API网关)将增加系统延迟

  • 端到端测试变得困难

使用Strangler的场景:

  • 将大型后端单体应用程序的增量迁移到微服务

不适合用Strangler的场景:

  • 如果后端单体应用很小,全量替换更好

  • 如果无法拦截客户端对遗留的单体应用程序的请求

可用技术demo:

API网关后端应用框架

8.断路器

优点:

  • 提高微服务架构的容错性

  • 阻止引发其他微服务的级联故障

缺点:

  • 需要复杂的异常处理

  • 日志和监控

  • 应该支持人工复位

使用断路器的场景:

  • 在微服务间使用同步通信的紧耦合的微服务架构中

  • 如果微服务依赖多个其他微服务

不适合使用断路器的场景:

  • 松耦合、事件驱动的微服务架构

  • 如果微服务不依赖其他微服务

可用技术demo:

API网关、服务网格、各种锻炼器库(Hystrix,Reselence4j,Polly)

9.外部化配置:代码与配置分离,不耦合

优点:

  • 生产配置不属于代码库,因而最小化了安全漏洞

  • 修改配置参数不需要重新构建应用程序

缺点:

  • 需要依赖一个支持外部化配置的框架

  • 何时需要使用外部化配置

  • 在验证概念的开发中

  • 任何重要的生产应用程序都能必须使用外部化配置

可用技术demo:

几乎所有企业级的现代框架都支持外部化配置,eg:nacos /阿波罗

10.消费端驱动的契约测试 :自动化测试

BDD

需求驱动的契约测试使用场景:

在大型企业业务应用程序中,通常由不同的团队开发不同服务;

不适合使用消费端驱动的契约测试场景:

  • 所有微服务由同一团队负责开发的小型简单的应用程序

  • 如果服务端微服务是相对稳定的,并且不处于活跃的开发状态

可用技术demo:

pack,postman,springcloud contract,swagger3

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

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

相关文章

阿里巴巴橙点同学达摩院认证证书

网址:https://orange-class.com/ 为竞争激烈的职业做好充分的准备,无需相关经验立即开始学习。 阿里达摩院组织背书认证。 内容包括八个职业方向,涉及AI、开发、营销、设计等不同岗位: 其中,AI的高级认证情况如下&…

收藏丨世界地形图(超高清)

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247668146&idx2&snbebd2f4921994ab05ed47efdebe8e706&chksmfa770e8fcd008799bf1d1cabd62edca7f60a5c7a1ef9c0bacf3bdc102bccf0f12d54d6c07c49&token1405091246&langzh_CN&scene21#we…

Ubuntu 22.04.4 LTS openresty(Nginx) 通过Lua+Redis 实现动态封禁IP

1 系统环境 testiZbp1g7fmjea77vsqc5hmmZ:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.4 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.4 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HOME…

星谷案例入选新华社国家高端智库报告,彰显国际影响力!

中关村科学城星谷(创新园)以其在商业航天领域的卓越创新能力和显著产业影响力,被新华社国家高端智库专题组认可,并入选《更好赋能中国繁荣世界——新质生产力的理论贡献和实践价值》智库报告,成为新质生产力的典型代表案例。 这是中关村科学城星谷(创新园)继登上《新闻联播》后…

卓越的 App UI 风格引领潮流

卓越的 App UI 风格引领潮流

RAG实操教程langchain+Milvus向量数据库创建你的本地知识库 二

Miluvs 向量数据库 关于 Milvui 可以参考我的前两篇文章 • 一篇文章带你学会向量数据库Milvus(一)[1]• 一篇文章带你学会向量数据库Milvus(二)[2] 下面我们安装 pymilvus 库 pip install --upgrade --quiet pymilvus如果你…

如何开启Claude 3的Artifacts功能以及如何注册Claude3

就很突然,Claude 3.5,它来了! Anthropic发布3.5系列第一个版本Claude 3.5 Sonnet。在多个关键指标中,GPT-4o几乎被吊打! 另外Claude 3.5 Sonnet是免费的,提供了跟gpt-4o一样的次数。更高的速度和次数&…

python循环写入新样本到csv文件,并解决中文乱码的问题

新样本循环写入csv中 def write_sample(self):# 创建一个包含所有字段的列表,它将作为CSV的一行fields [基地, 拉线, 正/负极车间, 罐体编号, 样本ID, 工步序号, 检测结果]row_data [self.base_id, self.line_id, self.workshop_id, self.device, self.filename[:…

微信公众号多域名回调系统V1.5 源码

这是一款基于ThinkPHP6.0开发的微信公众号多域名回调系统。本系统有如下功能: 微信公众号多域名回调功能:微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。网站后台支持回调域名白…

王者荣耀图鉴皮肤怎么来的

王者荣耀图鉴皮肤怎么来的 最近一个王者荣耀图鉴开源很火 这个项目里面有很多的图片和音效资源,最简单的方法就是利用爬虫技术爬取这些图片资源。 第一步环境准备 Pyhton3.12macos系统 第二步查看王者荣耀官网 这些图片资源最简单的来源就是王者荣耀官网网站…

【FPGA + Nvidia/算能GPU+AI】自动驾驶多核异构实现 16路车载摄像头实时AI分析解决方案

基于 Xilinx 公司ZYNQ Ultrascale MPSoC系列 FPGA 芯片设计,应用于无人驾驶、慢速特种车及数据采集车、车载仿真测试系统等自动驾驶领域 自动驾驶:16通道车载摄像头PCIE采集卡方案。 16 通道摄像头 最多支持 16 通道 GMSL1/2 摄像头输入 8MP 摄像头 最…

MyBatisplus使用报错--Invalid bound statement

报错如下 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.lotus.mybatis.mapper.UserMapper.selectListat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)at com.baomidou.mybatisplus.cor…

ModelScope联手OpenDataLab:直接调用7000+开源数据集,赋能AI模型加速研发

在人工智能的演进历程中&#xff0c;数据和模型的整合是推动技术发展的核心动力。随着AI技术的不断进步&#xff0c;整合各类关键资源&#xff0c;构建一个高效、协同的开发环境&#xff0c;已成为加速创新应用发展的关键。 基于这一理念&#xff0c;OpenDataLab浦数与ModelSc…

python基础篇(4):range语句

1 功能介绍 range语句的功能是获得一个数字序列&#xff08;可迭代类型的一种&#xff09; 2 语法 语法1&#xff1a; range(num) 获取一个从0开始&#xff0c;到num结束的数字序列&#xff08;不含num本身&#xff09; 如range(5)取得的数据是&#xff1a;[0, 1, 2, 3, 4…

在华为服务器上编译C++工程的若干错误以及排查方法和解决方法记录

目录 1 报错 2 查找错误原因 2.1 方法一&#xff1a;ldd命令 2.2 方法二&#xff1a;警告信息里面 3 解决错误 3.1 libpng16.so.16 和 libbrotlidec.so.1 问题 3.2 libdevmmap.so 和 libslog.so库问题 3.3 剩余错误 3.3.1 libacllite.so错误解决 3.3.2 libtaclstream…

通过自定义分配器解决 ZGC中的碎片问题

1.问题 ZGC 和其他垃圾收集器通常使用碰撞指针分配&#xff0c;这对于顺序分配很有效&#xff0c;但随着时间的推移会导致碎片化。当产生无法轻松重用的内存间隙时&#xff0c;就会发生碎片化&#xff0c;这需要昂贵的活动对象重新定位。这项研究的目标是通过使用基于空闲列表…

LCP 61. 气温变化趋势

题目 力扣城计划在两地设立「力扣嘉年华」的分会场&#xff0c;气象小组正在分析两地区的气温变化趋势&#xff0c;对于第 i ~ (i1) 天的气温变化趋势&#xff0c;将根据以下规则判断&#xff1a; 若第 i1 天的气温 高于 第 i 天&#xff0c;为 上升 趋势若第 i1 天的气温 等…

Flash页、扇区、块的区别

文章目录 前言玩转Flash的小知识一、页(Page)二、扇区(Sector)三、块(Block)总结存储基础知识 瑞萨芯片简介(片上资源分配)和工具链使用 前言 FLASH 存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速…

SpringBoot测试实践

测试按照粒度可分为3层&#xff1a; 单元测试&#xff1a;单元测试&#xff08;Unit Testing&#xff09;又称为模块测试 &#xff0c;是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中…

【自动驾驶】ROS小车系统、运动底盘的运动学分析和串口通信控制

文章目录 小车组成轮式运动底盘的组成轮式运动底盘的分类轮式机器人的控制方式感知传感器ROS决策主控ROS介绍ROS的坐标系ROS的单位机器人电气连接变压模块运动底盘的电气连接ROS主控与传感器的电气连接ROS主控和STM32控制器两种控制器的功能运动底盘基本组成电池电机控制器与驱…