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

news2024/11/26 9:59:30

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.coloradmin.cn/o/1845615.html

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

相关文章

mysql model_path longblob 类型文件操作

在 MySQL 中,如果你有一个表包含一个 LONG BLOB 类型的字段(例如 model_path),你可以使用 SQL 查询来提取该字段中的二进制数据,并将其下载为文件。以下是一个完整的步骤来实现这个过程: 步骤1:…

虚拟3D沉浸式展会编辑平台降低了线上办展的门槛

在数字化浪潮的引领下,VR虚拟网上展会正逐渐成为企业展示品牌实力、吸引潜在客户的首选平台。我们与广交会携手走过三年多的时光,凭借优质的服务和丰富的经验,赢得了客户的广泛赞誉。 面对传统展会活动繁多、企业运营繁忙的挑战,许…

redis.conf 参数详解,方便进行性能优化配置

以下是redis.conf中一些常见参数的详细说明: daemonize:是否以后台进程运行,默认为no; pidfile:如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid;bind:绑定主…

微信小程序登录流程详情及Java代码

一、流程图 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 获取手机号,调用wx.getPhoneNumber() ,获取加密…

AI口语练习APP的开发流程

开发AI口语练习APP是一个持续的过程,需要多学科团队的紧密合作,包括产品经理、UI/UX设计师、前后端开发者、机器学习工程师、测试工程师和市场运营人员等。随着技术的发展和用户需求的变化,开发流程可能需要相应地进行调整和优化。AI口语练习…

【Python机器学习实战】 | 基于支持向量机(Support Vector Machine, SVM)进行分类和回归任务分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

zynq qspi启动、无SD卡、格式化分区emmc、调试全过程

1 背景 使用黑金开发板,全部开发流程避开使用SD卡调试,zynq开发过程中很多资料都是基于SD启动。这样就对新板卡调试带来了一定的困难,因为新板卡基本上没有设计SD卡。这里就一步一步实现qspi启动内核,格式化分区emmc,…

leetCode40组合总和(回溯)

题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次示例 : 输入: candidates [2,5,2,1,2], target 5, 输出: [ [1,2,2], [5] ]回溯一般模…

[package-view] RegisterGUI.java-自用

java GUI : frame---> panel --> components[button/输入框/标签] JFrame-->JPanel---> [JButton/JTextField/JLabel] /** This code sets up a registration window using Swing. * The window includes input fields for the users name, ID,* and password, …

vue3 自定义指令-积分埋点

自用笔记,内容可能不全 // package.json "sunshine-track": "^1.0.0-beta.2",// track index.jsimport Track from sunshine-trackconst options {projectKey: test-project, // 项目的keyuserId: digger, // 用户idreport: {url: http://exam…

uniapp app打开微信客服

按钮触发 uni.share({provider: "weixin",openCustomerServiceChat: true,customerUrl: https://work.weixin.qq.com/kfid/*************, //企业微信地址corpid: ww13edaa**********, //企业idsuccess: (res) > {console.log("success:" JSON.string…

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩? 缓存穿透 【针对大量非法访问的请求,缓存中没有,直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在 一样。 对于系…

【经验分享】Ubuntu24.04安装微信

【经验分享】Ubuntu24.04安装微信(linux官方2024universal版) 文章如下,22.04和24.04微信兼容 【经验分享】Ubuntu22.04安装微信(linux官方2024universal版) 实测Ubuntu24.04LTS版本可以兼容。

cenots 出现 curl 外网地址很慢,或者微信授权很慢

用 curl 访问链接,很慢才显示接口、或者微信授权很慢, 微信授权,很慢才授权成功,平均延时 5s 可能是 dns配置问题,直接修改 sudo vim /etc/resolv.conf 的 nameserver 改为 114.114.114.114 即可 其他…

锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测 NASA数据集,B0005号电池,选择前110个数据训练,后58个数据测试预测。程序包含去趋势线、差分、平稳化及AIC准则判定p和q。命令窗…

DSP28335课设:音乐流水灯的设计

本题目为音乐流水灯的设计,目的是熟练掌握DSP定时器的控制、中断系统的应用以及程序的编写调试。 1、让DSP发出不同的音乐音调; 2、存储一个简单音乐(自选); 3、音乐的音调对应不同的灯 4、启动开关按下时&…

C++Muduo网络库初探

Muduo初探 Muduo网络库简介 Muduo是由【陈硕】大佬个人开发的TCP网络编程库,基于Reactor模式,提供了高效的事件驱动网络编程框架,有助于快速搭建高性能的网络服务端。 什么是Reactor模式? I/O多路复用 在网络I/O中&#xff0…

eclipse中没有SERVER的解决办法(超详细)

将 Tomcat 和 Eclipse 相关联时,Eclipse有的版本发现 发现eclipse->【Window】->【Preferences】里没有【server】从而配置不了Runtime Environment。所以需要通过eclipse进行安装。 通过我个人的经验下面给出解决办法: 一、获取 Eclipse版本 点击…

性能测试并发量评估新思考:微服务压力测试并发估算

性能测试并发量评估新思考 相信很多人在第一次做压力测试的时候,对并发用户数的选择一直有很多的疑惑,那么行业内有一些比较通用的并发量的计算方法,但是这些方法在如今微服务的架构下多少会有一些不适合,下面的文章我们对这些问题…

JS【数组】交集、差集、补集、并集

var a [1,2,3,4,5] var b [2,4,6,8,10]var sa new Set(a); var sb new Set(b); // 交集 let intersect a.filter(x > sb.has(x)); // 差集 let minus a.filter(x > !sb.has(x)); // 补集 let complement [...a.filter(x > !sb.has(x)), ...b.filter(x > !sa…