微服务设计模式

微服务可以对您的企业产生积极影响。因此,有必要了解如何处理微服务架构(MSA)和一些微服务设计模式,以及微服务架构的一般目标或原则。以下是微服务架构方法中需要考虑的四个目标 [1]。

降低成本:  MSA 将降低设计、实施和维护 IT 服务的总体成本。
提高发布速度: MSA 将提高服务从构思到部署的速度。
提高弹性:  MSA 将提高我们服务网络的弹性。
启用可见性: MSA 支持提高您的服务和网络的可见性。
你需要了解微服务架构构建的原则是什么

可扩展性
可用性
弹性
灵活性
独立、自治
去中心化治理
故障隔离
自动配置
通过 DevOps 持续交付
在实施您的解决方案或系统时,遵守上述原则会带来一些挑战和问题。这些问题对于许多解决方案来说都很常见。这些可以通过使用正确且匹配的设计模式来克服。微服务有多种设计模式,可分为五种模式。每个都包含许多模式。


分解模式
按业务能力进行分解微服务就是使服务松散耦合并应用单一责任原则。它按业务能力分解。定义与业务能力对应的服务。业务能力是业务架构建模中的一个概念[2]。这是企业为了创造价值而做的事情。一个业务能力往往对应一个业务对象,例如

订单管理负责订单
客户管理对客户负责
按子域分解
使用业务功能分解应用程序可能是一个好的开始,但是您会遇到所谓的“上帝类”,它们不容易分解。这些类在多种服务中是通用的。定义与领域驱动设计 (DDD) 子域相对应的服务。DDD 将应用程序的问题空间(业务)称为域。一个域由多个子域组成。每个子域对应于业务的不同部分。子域可以分类如下:

核心 ——业务的关键差异化因素和应用程序最有价值的部分
支持 ——与业务相关,但不是差异化因素;可以在内部或外包实施
通用 ——不特定于业务,最好使用现成的软件来实现
订单管理的子域包括:

产品目录服务
库存管理服务
订单管理服务
交付管理服务
按事务分解/两阶段提交 (2pc) 模式
这种模式可以分解事务上的服务。那么系统中就会出现多笔交易。分布式事务的重要参与者之一是事务协调器[3]。分布式事务包括两个步骤:

准备阶段 ——在此阶段,事务的所有参与者准备提交并通知协调者他们已准备好完成事务
提交或回滚阶段 ——在此阶段,事务协调器向所有参与者发出提交或回滚命令
2PC 的问题是,与单个微服务的运行时间相比,它相当慢。协调微服务之间的事务,即使它们位于同一网络上,也会确实降低系统速度;所以这种方法通常不用于高负载场景。

绞杀者图案
您经历的前三种设计模式是分解 Greenfield 应用程序,但您所做的 80% 的工作是处理 Brownfield 应用程序,这些应用程序是大型的整体应用程序(遗留代码库)。Strangler 模式可以解决问题。这将创建两个独立的应用程序,它们并排存在于同一 URI 空间中。随着时间的推移,新重构的应用程序会“扼杀”或取代原始应用程序,直到最后,您可以关闭单体应用程序。Strangler 应用步骤进行改造、共存、消除[4]:

转型 ——用现代方法创建一个并行的新站点。
共存 — 将现有站点暂时保留在原处。从现有站点重定向到新站点,以便逐步实现该功能。
消除 — 从现有站点中删除旧功能。
舱壁图案
这种模式将应用程序的元素隔离到池中,这样,如果其中一个失败,其他元素将继续运行。这种图案被称为舱壁,因为它类似于船体的分段隔板。根据消费者负载和可用性要求,将服务实例划分为不同的组。此设计有助于隔离故障,并允许您即使在故障期间也能维持某些使用者的服务功能。

边车模式
这会将应用程序的组件部署到单独的处理器容器中以提供隔离和封装。此模式还可以使应用程序由异构组件和技术组成。这种图案被命名为“Sidecar”,因为它类似于附加在摩托车上的“Sidecar”。在该模式中,边车附加到父应用程序并为应用程序提供支持功能。sidecar 还与父应用程序共享相同的生命周期,与父应用程序一起创建和退出。sidecar 模式有时称为 sidekick 模式,是我们在帖子中展示的最后一个分解模式。

集成模式
API 网关模式 当应用程序分解为更小的微服务时,需要解决一些问题

不同渠道对多个微服务有多次调用。
需要处理不同类型的协议。
不同的消费者可能需要不同格式的响应。
API 网关有助于解决微服务实现带来的许多问题,而不仅限于上述问题。

API 网关是任何微服务调用的单一入口点。
它可以作为代理服务将请求路由到相关的微服务。
它可以聚合结果并发回给消费者。
该解决方案可以为每种特定类型的客户端创建细粒度的 API。
它还可以转换协议请求和响应。
它还可以减轻微服务的身份验证/授权责任。
聚合器模式
当将业务功能分解为几个较小的逻辑代码片段时,有必要考虑如何协作每个服务返回的数据。这个责任不能留给消费者。

聚合器模式有助于解决这个问题。它讨论了我们如何聚合来自不同服务的数据,然后将最终响应发送给消费者。这可以通过两种方式完成[6]:

组合微服务将调用所有必需的微服务、整合数据并在发送回之前转换数据。
API 网关还可以将请求划分为多个微服务,并在将数据发送给消费者之前聚合数据。
如果要应用任何业务逻辑,建议选择组合微服务。否则,API Gateway 就是既定的解决方案。代理模式 API 网关只是通过 API 网关公开微服务。在本例中,API网关具有三个API模块:

Mobile API,实现FTGO移动客户端的API。
浏览器 API,它为浏览器中运行的 JavaScript 应用程序实现 API。
公共API,为第三方开发者实现API。
网关路由模式
API网关负责请求路由。API网关通过将请求路由到相应的服务来实现一些API操作。当 API 网关收到请求时,它会查阅路由映射,该映射指定将请求路由到哪个服务。例如,路由映射可以将 HTTP 方法和路径映射到服务的 HTTP URL。此功能与 NGINX 等 Web 服务器提供的反向代理功能相同。

链式微服务模式
对于单个服务或微服务,会有多个依赖关系,例如:销售微服务具有依赖产品微服务和订单微服务。链式微服务设计模式将帮助您根据您的请求提供综合结果。

微服务收到的请求:1,然后正在与微服务-2 通信,并且可能正在与微服务-3 通信。所有这些服务都是同步调用。

分支模式
微服务可能需要从多个源(包括其他微服务)获取数据。分支微服务模式是聚合器和链设计模式的混合,允许同时处理两个或多个微服务的请求/响应。被调用的微服务可以是微服务链。分支模式还可用于根据您的业务需求调用不同的微服务链或单个链。

客户端 UI 组合模式
当通过分解业务能力/子域来开发服务时,负责用户体验的服务必须从多个微服务中拉取数据。在单体世界中,过去只有一次从 UI 到后端服务的调用来检索所有数据并刷新/提交 UI 页面。然而,现在情况将不一样了。对于微服务,UI 必须设计为具有屏幕/页面的多个部分/区域的骨架。每个部分都会调用单个后端微服务来提取数据。像 AngularJS 和 ReactJS 这样的框架可以帮助轻松做到这一点。这些屏幕称为单页应用程序 (SPA)。每个团队都开发一个客户端 UI 组件,例如 AngularJS 指令,用于实现其服务的页面/屏幕区域。UI 团队负责通过组合多个特定于服务的 UI 组件来实现构建页面/屏幕的页面骨架。

数据库模式
定义微服务的数据库架构我们需要考虑以下几点。

服务必须是松散耦合的。它们可以独立开发、部署和扩展。
业务事务可以强制执行跨越多个服务的不变量。
某些业务事务需要查询多个服务拥有的数据。
有时必须复制和共享数据库才能扩展。
不同的服务有不同的数据存储要求。
每个服务的数据库
为了解决上述问题,必须设计一个微服务一个数据库;它必须仅对该服务是私有的。它只能由微服务 API 访问。其他服务无法直接访问它。例如,对于关系数据库,我们可以使用每服务私有表、每服务模式或每服务数据库服务器。

每个服务共享数据库
我们已经讨论过每个服务一个数据库对于微服务来说是理想的选择。这是微服务的反模式。但如果应用程序是一个整体并试图闯入微服务,那么非规范化就不那么容易了。在后期阶段,我们可以转向每服务数据库模式。每个服务共享数据库并不理想,但这是上述场景的可行解决方案。大多数人认为这是微服务的反模式,但对于棕地应用程序来说,这是将应用程序分解为更小的逻辑部分的良好开端。这不适用于绿地应用。

命令查询职责分离 (CQRS)
一旦我们实现了每服务数据库,就需要查询,这需要多个服务的联合数据。这是不可能的。CQRS 建议将应用程序分为两部分——命令端和查询端。

命令端处理创建、更新和删除请求。
查询端通过使用物化视图来处理查询部分。
事件源模式通常与其一起使用来为任何数据更改创建事件。物化视图通过订阅事件流来保持更新。事件溯源 大多数应用程序都使用数据,典型的方法是应用程序维护当前状态。例如,在传统的创建、读取、更新和删除(CRUD)模型中,典型的数据过程是从存储中读取数据。它包含锁定数据的限制,通常使用事务。

事件溯源模式


事件溯源模式 [8] 定义了一种处理由一系列事件驱动的数据操作的方法,每个事件都记录在仅附加存储中。应用程序代码将一系列事件发送到事件存储,这些事件强制描述数据上发生的每个操作,并在事件存储中保存它们。每个事件代表一组数据更改(例如AddedItemToOrder)。事件保存在充当记录系统的事件存储中。事件存储发布的事件的典型用途是在应用程序中的操作更改实体时维护实体的物化视图,以及与外部系统集成。例如,系统可以维护用于填充 UI 部分的所有客户订单的物化视图。当应用程序添加新订单、添加或删除订单上的商品以及添加运输信息时,可以处理描述这些更改的事件并将其用于更新物化视图。该图显示了该模式的概述。

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

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

相关文章

jvm-垃圾收集器

serial serial old ParNew CMS parallel scavanbe parallel old g1 串行收集器组合 Serial Serial Old 开启选项:-XX:SerialGC 串行收集器是最基本、发展时间最长、久经考验的垃圾收集器,也是client模式下的默认收集器配置。 串行收集器采用单线程stop…

训练 CNN 对 CIFAR-10 数据中的图像进行分类-keras实现

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

csapp-linklab之第4阶段“输出学号”实验报告(switch跳转表)

实验内容 修改phase4.o相应节中的内容,使其与main.o链接后运行能够输出自己的学号: $ gcc -o linkbomb main.o phase4.o $ ./linkbomb $学号 实验提示 掌握switch语句的机器语言表示及其跳转表的实现。 找出跳转表 反汇编phase4.o,看看里…

分治法之二分查找

思路: 确定查找范围:开始时,将整个有序数组作为查找范围。比较中间元素:计算查找范围的中间元素的索引 mid,并将其与目标值进行比较。 如果中间元素等于目标值,则查找成功,返回中间元素的索引。如果中间元素…

el-table实现动态表头

1.1el-table渲染 <el-tableref"refreshTable":data"tableData"highlight-current-row><el-table-columnfixedwidth"170px"label"测点"align"center"prop"测站名称"/><el-table-column label"…

Android 横竖屏切换 窗口全屏

Android 横竖屏切换 窗口全屏 窗口设置为全屏 废话不多说直接上代码 首先在AndroidManifest的Activity下设置screenOrientation和configChanges - android:configChanges"orientation|screenSize"- android:screenOrientation"fullSensor"一个是设置屏幕取…

SpringBoot入门教程

Spring Boot 是由Spring框架团队推出的一款用来简化Spring应用程序创建和开发过程的框架&#xff0c;它基于Spring框架&#xff0c;使用约定优于配置&#xff0c;大大简化了Spring应用程序的配置和开发过程。在很多企业中&#xff0c;Spring Boot 已经被广泛应用&#xff0c;成…

浅谈安科瑞可编程电测仪表在老挝某项目的应用

摘要&#xff1a;本文介绍了安科瑞多功能电能表在老挝某项目的应用。AMC系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract&#xff1a;This article introduces the application of the multi-function energy …

Arrays.asList(T... a)导致的事故

&#x1f4da;项目场景: 修改数据时&#xff0c;允许将非必填字段清空。 ⛔问题描述: 由于使用的是Mybatis-Plus&#xff0c;只能使用LambdaUpdateWrapper或UpdateWrapper通过set(column,val)来将字段清空&#xff1b;因为字段太多导致大量set放在一个方法&#xff0c;不符合…

深度学习今年来经典模型优缺点总结,包括卷积、循环卷积、Transformer、LSTM、GANs等

文章目录 1、卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;1.1 优点1.2 缺点1.3 应用场景1.4 网络图 2、循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNNs&#xff09;2.1 优点2.2 缺点2.3 应用场景2.4 网络图 3、长短…

L1-010:比较大小

题目描述 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8输出样例: 2->4->8 程序代码 #include<stdio.h&…

基于YOLOv8深度学习的安全帽目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Git——使用Git进行程序开发

主要介绍个人开发提交记录的主要流程&#xff0c;包括以下内容&#xff1a; 索引- 提交的暂存区。查看工作的状态和内部变更。如何读取用于描述变更的已扩展统一diff格式。支持查询和交互的提交&#xff0c;修改提交。创建、显示和选择&#xff08;切换&#xff09;分支。切换…

面试:如何故意减慢网站速度?

面试问题&#xff1a;假设你为你的客户建立了一个网站。但他没有定期支付费用。现在你想放慢他的网站速度&#xff0c;但又不想让他立即发现。你会怎么做&#xff1f; 我&#xff1a;用较慢的算法和其他与编码相关的选项替换代码中使用的算法。 面试问题&#xff1a;问在这种情…

婴儿专用洗衣机有必要买吗?宝宝洗衣机洗衣服

我们都知道刚出生的宝宝抵抗力较弱&#xff0c;很容易因为细菌感染然后生病&#xff0c;宝宝接触最多的就是衣服&#xff0c;我们在手洗的过程很难把衣服上的细菌清洗掉&#xff0c;而使用我们传统的洗衣机很容易造成细菌的第二次感染&#xff0c;很容易将宝宝的抵抗力弄得越来…

如何通过linux调用企业微信发送告警消息

一、前期准备 1、企业微信具备管理企业权限。 2、服务器有公网IP或者可以将本机端口通过net映射到公网。 二、通过脚本向企业微信发送消息 1、创建sh脚本用来发送消息。 vim 2.sh 注意&#xff1a;脚本中xxxx信息需要在企业微信管理后台获取。 #!/bin/bash # 设置企业…

2023年计网408

第33题 33.在下图所示的分组交换网络中&#xff0c;主机H1和H2通过路由器互连&#xff0c;2段链路的带宽均为100Mbps、 时延带宽积(即单向传播时延带宽)均为1000bits。若 H1向 H2发送1个大小为 1MB的文件&#xff0c;分组长度为1000B&#xff0c;则从H1开始发送时刻起到H2收到…

MySQL 学习笔记(刷题篇)

SQL进阶挑战 聚合分组查询 SQL123 select tag, difficulty, round((sum(score) - max(score) - min(score) ) / (count(score) - 2) ,1) as clip_avg_score from examination_info as ei, exam_record as er where ei.exam_id er.exam_id and ei.tag SQL and ei.diffi…

代码随想录刷题题Day2

刷题的第二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day2 任务 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵 II 1 有序数组的平方&#xff08;重点&#xff1a;双指针…

将项目放到gitee上

参考 将IDEA中的项目上传到Gitee仓库中_哔哩哔哩_bilibili 如果cmd运行ssh不行的话&#xff0c;要换成git bash 如果初始化后的命令用不了&#xff0c;直接用idea项放右键&#xff0c;用git工具操作