高弹性架构的微服务设计模式

news2024/12/24 22:16:51

长期以来,开发人员一直使用单片架构,而且长期以来,这种架构一直有效。不幸的是,这些架构使用的部件较少,但体积较大,这意味着如果一个部件发生故障,它们更有可能整体失效。通常,这些应用程序以单一进程运行,这只会加剧问题。

微服务通过让每个微服务作为单独的进程运行来解决这些特定问题。如果一个齿轮坏了,并不一定意味着整个机器停止运行。此外,诊断和修复较小、高度内聚的服务中的缺陷通常比较大的单片服务更容易。

微服务设计模式提供了经过验证的基本构建块,可帮助编写微服务代码。通过在开发过程中利用模式,您可以节省时间并确保更高的准确性,而不是从头开始为微服务应用编写代码。在本文中,我们将全面概述您需要了解的微服务设计模式以及何时应用它们。

使用微服务设计模式的主要好处

微服务设计模式提供了几个主要优点,包括:

  1. 可扩展性:微服务允许将应用程序分解为更小的独立服务,每个服务负责特定的功能或特性。这种模块化架构使各个服务能够根据需求独立扩展,从而提高整体系统的可扩展性和资源利用率。
  2. 灵活性和敏捷性:微服务通过分离应用程序的不同部分来提高灵活性和敏捷性。每项服务都可以独立开发、部署和更新,使团队能够自主工作并更频繁地发布新功能。这种灵活性可以加快上市时间并更轻松地适应不断变化的业务需求。
  3. 弹性和故障隔离:微服务通过将故障隔离到特定服务来提高系统弹性和故障隔离。如果一项服务遇到问题或故障,它不一定会影响整个应用程序。这种隔离可最大限度地减少停机时间并提高系统可靠性,确保应用程序保持可用和响应。
  4. 技术多样性:微服务允许使用最适合其特定需求的技术堆栈来构建每项服务,从而实现技术多样性。这种灵活性使团队能够为每项服务选择正确的工具和技术,从而优化性能、开发速度和维护。
  5. 改进的开发和部署流程:微服务通过将复杂的应用程序分解为更小、更易于管理的组件来简化开发和部署流程。这种模块化架构简化了测试、调试和维护任务,使开发团队更容易协作和迭代软件更新。
  6. 可扩展性和成本效益:微服务使组织能够通过仅将资源分配给需要它们的服务来更有效地扩展其应用程序。这种精细的资源分配方法有助于优化成本并确保有效利用资源,尤其是在根据使用情况对资源进行计费的云环境中。
  7. 增强容错能力:微服务架构具有更好的容错能力,因为服务可以设计为优雅地降级或独立失败,而不会影响整个系统。这确保了即使在发生故障或中断的情况下,关键功能仍然可用。
  8. 更易于维护和更新:微服务简化了维护和更新,允许对单个服务进行更改而不会影响整个应用程序。这降低了意外副作用的风险,并使必要时更容易回滚更改,从而提高了整体系统的稳定性和可靠性。

让我们继续寻找不同的微服务设计模式。

每个服务对应一个数据库模式

数据库是微服务架构中最重要的组件之一,但开发人员在构建服务时忽略每个服务模式的数据库并不罕见。数据库组织会影响应用程序的效率和复杂性。开发人员在确定应用程序的组织架构时可以使用的最常见选项是:

每个服务都有专用数据库

专用于一个服务的数据库不能被其他服务访问。这是从整个端到端业务角度来看更容易扩展和理解的原因之一。

想象一下您的数据库具有不同需求或访问要求的场景。一项服务拥有的数据可能主要是关系型数据,而第二项服务可能更适合使用 NoSQL 解决方案,第三项服务可能需要矢量数据库。在这种情况下,为每个数据库使用专用服务可以帮助您更轻松地管理它们。

这种结构还可以减少耦合,因为一个服务无法将自己绑定到另一个服务的表。服务被迫通过已发布的接口进行通信。缺点是专用数据库需要针对通信失败事件的故障保护机制。

所有服务共享一个数据库

单一共享数据库不是微服务架构的标准,但仍然值得一提。这里的问题是,使用单一共享数据库的微服务会失去开发人员所依赖的许多关键优势,包括可扩展性、稳健性和独立性。

不过,在某些情况下,共享物理数据库可能是合适的。但是,当所有服务共享一个数据库时,在其中强制执行逻辑边界非常重要。例如,每个服务都应该拥有自己的架构,并且应该限制读/写访问,以确保服务不能随意访问不属于它们的地方。

Saga 模式

Saga 是一系列本地事务。在微服务应用程序中,Saga 模式可以帮助在分布式事务期间保持数据一致性。

Saga 模式是其他设计模式的替代解决方案,通过提供回滚机会来允许多个事务。

一种常见的情况是电子商务应用程序允许客户使用信用购买产品。数据可能存储在两个不同的数据库中:一个用于订单,一个用于客户。购买金额不能超过信用额度。为了实现 Saga 模式,开发人员可以在两种常见方法之间进行选择。

1. 编舞

使用编排方法,服务将执行交易,然后发布事件。在某些情况下,其他服务将响应这些已发布的事件并根据其编码指令执行任务。根据预设,这些次要任务可能会也可能不会发布事件。在上面的示例中,您可以使用编排方法,以便每个本地电子商务交易都会发布一个事件,从而触发信用服务中的本地交易。

2. 编排

编排方法将使用对象来编排事件,从而执行事务并发布事件,触发其他服务通过完成其任务来做出响应。编排器会告诉参与者要执行哪些本地事务。

Saga 是一种复杂的设计模式,需要很高的技能才能成功实施。但是,正确实施的好处是可以保持多个服务之间的数据一致性,而无需紧密耦合。

API 网关模式

对于具有多个客户端的大型应用程序,实现 API 网关模式是一个引人注目的选择。最大的好处之一是它使客户端无需了解服务是如何分区的。但是,不同的团队会因为不同的原因而重视 API 网关模式。其中一个可能的原因是,它通过充当客户端应用程序和服务之间的反向代理,为微服务组授予单一入口点。另一个原因是客户端不需要知道服务是如何分区的,并且服务边界可以独立发展,因为客户端对它们一无所知。

客户端也不需要知道如何查找或与众多不断变化的服务进行通信。您还可以为特定类型的客户端创建网关(例如,为前端创建后端),这可以改善人体工程学并减少获取数据所需的往返次数。此外,API 网关模式可以处理身份验证、SSL 终止和缓存等关键任务,从而使您的应用更安全、更易于使用。

另一个优点是,该模式使客户端无需了解服务是如何分区的。在继续介绍下一个模式之前,还有一个好处需要介绍:安全性。该模式提高安全性的主要方法是减少攻击面。通过提供单一入口点,API 端点不会直接暴露给客户端,并且可以有效地实现授权和 SSL。

开发人员可以使用此设计模式将内部微服务与客户端应用分离,以便利用部分失败的请求。这确保整个请求不会因为单个微服务无响应而失败。为此,编码的 API 网关利用缓存提供空响应或返回有效的错误代码。

断路器设计模式

此模式通常应用于同步通信的服务之间。当服务表现出高延迟或完全无响应时,开发人员可能会决定使用断路器。这里的实用性是,当单个微服务无响应时,可以防止跨多个系统发生故障。因此,调用不会堆积并占用系统资源,这可能会导致应用程序内出现严重延迟,甚至一系列服务故障。

在断路器设计中将此模式作为函数实现需要调用一个对象来监控故障情况。当检测到故障情况时,断路器将跳闸。一旦跳闸,对断路器的所有调用都将导致错误并被定向到其他服务。或者,调用可能导致检索默认错误消息。

开发人员应该了解断路器模式函数的三种状态。这些是:

  1. 打开: 当故障次数超过阈值时,断路器模式将打开。处于此状态时,微服务会向调用发出错误,而不会执行所需的功能。
  2. 关闭: 断路器关闭时,它处于默认状态,所有调用都会得到正常响应。这是开发人员希望断路器微服务保持的理想状态 — 当然,在理想情况下是这样。
  3. 半开: 断路器在检查潜在问题时,会保持半开状态。有些呼叫可能会得到正常响应,但有些则可能不会。这取决于断路器最初切换到此状态的原因。

命令查询责任分离(CQRS)

如果开发人员想要解决数据争用风险等传统数据库问题,他们可能会使用命令查询责任分离 (CQRS) 设计模式。当应用程序性能和安全性复杂且对象同时暴露于读取和写入事务时,也可以使用 CQRS。

其工作方式是,CQRS 负责更改实体的状态或在事务中返回结果。可以提供多个视图用于查询,并且可以分别优化系统的读取端和写入端。这种转变可以通过分别查询模型和命令来降低所有应用程序的复杂性,因此:

  • 模型的写入端处理持久性事件,并充当读取端的数据源
  • 模型的读取端生成数据的投影,这是高度非规范化的视图

异步消息传递

如果服务不需要等待响应并且可以在发生故障后继续运行其代码,则可以使用异步消息传递。使用这种设计模式,微服务可以以快速且响应迅速的方式进行通信。有时这种模式被称为事件驱动通信。

为了实现速度最快、响应速度最快的应用,开发人员可以使用消息队列来最大限度地提高效率,同时最大限度地减少响应延迟。此模式可以帮助连接多个微服务,而无需创建依赖关系或紧密耦合它们。虽然异步通信存在一些权衡(例如最终一致性),但它仍然是一种灵活、可扩展的微服务架构设计方法。

事件溯源

当开发人员想要捕获实体状态的所有变化时,事件源设计模式可用于微服务。使用 Kafka 或其他替代方案等事件存储将有助于跟踪事件变化,甚至可以充当消息代理。消息代理有助于不同微服务之间的通信、监控消息并确保通信可靠稳定。为了实现此功能,事件源模式存储了一系列状态变化事件,并可以通过重播实体的发生来重建当前状态。

当事务对应用程序至关重要时,在微服务中使用事件源是一种可行的选择。当需要避免更改现有数据层代码库时,这种方法也很有效。

绞杀无花果图案

开发人员主要使用 Strangler 设计模式逐步将单体应用程序转换为微服务。这是通过用新服务替换旧功能来实现的 — 因此,该模式得名于此。一旦新服务准备好执行,旧服务就会被“扼杀”,以便新服务可以接管。

为了成功实现从单体到微服务的转变,开发人员使用外观接口来公开各个服务和功能。目标功能从单体中分离出来,因此可以“束缚”和替换它们。

利用设计模式让组织更易于管理

设置适当的架构和流程工具将帮助您创建成功的微服务工作流。使用上面描述的设计模式并在我的博客中了解有关微服务的更多信息,以创建强大、实用的应用程序。

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

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

相关文章

《书生·浦语大模型实战营》第1课 学习笔记:书生·浦语大模型全链路开源体系

文章大纲 1. 简介与背景智能聊天机器人与大语言模型目前的开源智能聊天机器人与云上运行模式 2. InternLM2 大模型 简介3. 视频笔记:书生浦语大模型全链路开源体系内容要点从模型到应用典型流程全链路开源体系 4. 论文笔记:InternLM2 Technical Report简介软硬件基础…

HR招聘面试测评,哪些工作岗位需要测评创新能力?

什么是创新能力? 创新能力指在现有的物质基础上,通过某些特定的条件,促成满足未来社会发展的新事物。无论是个人还是国家都需要巨大的创新能力,因为创新是一切发展的根基,离开了创新,所有的发展都是原地踏…

Windows安全基础——Windows WMI详解

Windows安全基础——WMI篇 1. WMI简介 WMI(Windows Management Instrumentation, Windows管理规范)是Windows 2000/XP管理系统的核心,属于管理数据和操作的基础模块。设计WMI的初衷是达到一种通用性,通过WMI操作系统、应用程序等…

设计模式16——策略模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 策略模式(Strategy…

计算机的存储体系

计算机的存储分为内存和硬盘两大类。其中内存属于非持久化的存储设备,用于临时存储数据,设备掉电后数据会丢失;硬盘属于持久化的存储设备,设备掉电后数据不会丢失。 实际上在计算机领域存储的种类是非常多的,业界有时…

linux网卡MAC地址

1、ifconfig命令查看网卡MAC地址 1.1 通过HWaddr或ether字段过滤mac地址 ifconfig | grep HWaddr ifconfig | grep ether [rootlocalhost ~]# /sbin/ifconfig | grep ether 注:有些Linux发行版本的MAC地址字段为HWaddr,有些Linux发行版本的MAC地址字段…

SkyWalking 介绍及部署

1、SkyWalking简介2、SkyWalking的搭建 2.1 部署Elasticsearch2.2 部署SkyWalking-Server2.3 部署SkyWalking-UI3、应用接入 3.1 jar包部署方式3.2 dockerfile方式3.3 DockerFile示例4、SkyWalking UI 界面说明 4.1 仪表盘 4.1.1 APM (1)全局维度&#x…

clickhouse——ck目录介绍

一、ck目录 1、/etc/clickhouse-server: 服务端的配置文件目录,包括全局配置config.xml和用户配置users.xml等。 2、/var/lib/clickhouse 默认的数据存储目录(通常会修改默认路径配置,将数据保存到大容量磁盘挂载的路径) 3、/var…

电脑不能远程桌面连接不上,电脑无法建立远程桌面连接如何解决?

电脑无法建立远程桌面连接的问题,通常涉及到多个层面的因素,包括但不限于网络设置、系统配置、防火墙设置以及服务状态等。以下是一些专业性的解决方案,以帮助您解决这一问题。 首先,我们需要检查网络连接。远程桌面连接需要稳定的…

【数据库】通过一个实例来认识数据流图DFD

导读:通过一个实例(数据中台)说明数据流图DFD的作用、介绍了常见的数据流图元素及其标准符号以及如何画数据流图。数据流图主要被分析师、系统设计师、流程优化专家、系统管理员以及与系统开发和维护相关的人员查看和使用。对于刚考完2024年5…

怎样在网上赚点零花钱?推荐十个正规的赚钱兼职平台

今天要和大家探讨一个激动人心的话题——网络赚钱。在这个互联网日新月异的时代,网络赚钱已经变成了触手可及的现实。如果你正打算在网上赚取一些额外收入,那么这篇文章绝对值得一读! 在这个信息泛滥的时代,网络赚钱的机遇随处可…

redis数据操作相关命令

1.list操作 1.1 rpush rpush:新的元素添加到list最右边 #从右边依次往List添加1,2,3 RPUSH name 1 RPUSH name 2 RPUSH name 3#查看列表:返回 1,2,3 LRANGE name 0 -1结果如下: 1.2 lpush lpush:新加的元素在list最左边 #从…

U8G2移植到STM32,SSD13XXXOLED(硬件SPI DMA通讯)

文章目录 一、前言1.1 U8g2的特点1.2 U8G2的优势1.3 U8G2的下载地址1.4 U8g2支持的显示控制器 二、STM32Cubexm SPI DMA配置2.1 SPI设置为半双工模式2.2 SPI DMA设置2.3 oled其他引脚配置 三、移植U8G2框架3.1 精简U8G2库文件3.2 去掉csrc文件夹中无用的驱动文件3.3 文件移动到…

【Java reentrantlock源码解读】

今天学习一下Java中lock的实现方式aqs 直接上图这是lock方法的实现类、分为公平锁和非公平锁两种。 先看非公平的实现方法、很暴力有木有,上来直接CAS(抢占锁的方法,是一个原子操作,没有学过的同学自行百度哦)&#…

香橙派 Kunpeng Pro使用教程:从零开始打造个人私密博客

一、引言 在这个日益互联的世界中,单板计算机已经成为创新和个性化解决方案的重要载体。而在单板计算机领域,香橙派 Kunpeng Pro凭借其强大的性能和灵活的应用潜力,正逐渐吸引着全球开发者和技术爱好者的目光。 作为一款集成了华为的鲲鹏处…

蓝牙模块、WiFi模块等无线通信模块使用规范

在当今的科技时代,无线通信模块已经广泛应用于各类电子设备中。特别是蓝牙模块、WiFi模块等无线模块,它们为设备间的通信提供了便利,使得我们的生活更加便捷和高效。然而,为了确保这些无线模块正常工作并避免可能的安全隐患&#…

I.MX6ULL的蜂鸣器实验-GPIO输出实验

系列文章目录 I.MX6ULL的蜂鸣器实验 I.MX6ULL的蜂鸣器实验 系列文章目录一、前言二、有源蜂鸣器简介三、硬件原理分析四、程序编写4.1程序编写前提工作4.2程序编写 五、编译下载验证5.1编写 Makefile 和链接脚本5.2编译下载 一、前言 在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器…

MYSQL框架结构

MYSQL框架结构 通过解析器和预处理生成解析树,预处理判断是否合法,如果合法则调用优化器去进行优化。

PYQT5点击Button执行多次问题解决方案(亲测)

PYQT5点击Button却执行多次问题 使用pyqt5时遇到问题,UI上按钮点击一次,对应的槽函数却执行了3遍 首先,确认函数名无冲突,UI button名无命名冲突,下图是简单的示例程序: 运行后,点击按钮&#…

探秘萤瓴优选短视频带货软件,开启新时代的电商创业方式

探秘萤瓴优选短视频带货软件,开启新时代的电商创业方式 随着移动互联网的飞速发展,电商行业迎来了前所未有的变革。短视频带货作为一种新兴的电商模式,以其直观、生动、互动性强的特点,迅速成为市场的新宠。在这个背景下&#xf…