微服务架构设计中的常见的10种设计模式

news2024/11/24 10:24:07

微服务架构设计的概念

      微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制(如HTTP REST API)进行交互。这种架构模式具有高度的可伸缩性、可重用性、可维护性和可测试性,特别适用于构建大规模、高并发、复杂的应用系统。

微服务架构设计的常见10种设计模式

        虽然直接列出并详细阐述10种微服务设计模式并达到4000字的要求较为困难,但我可以概述几种常见的微服务设计模式,包括它们的描述、优缺点、实现方式、可用技术示例以及使用场景。

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

描述

      当一家公司将大型单体系统替换成一组微服务,首先要面临的最重要决策是关于数据库。单体架构会使用大型中央数据库。即使转移到微服务架构许多架构师仍倾向于保持数据库不变。虽然有一些短期收益,但它却是反模式的,特别是在大规模系统中,微服务将在数据库层严重耦合,整个迁移到微服务的目标都将面临失败(例如,团队授权、独立开发等问题)。

    更好的方法是为每个微服务提供自己的数据存储,这样服务之间在数据库层就不存在强耦合。这里我使用数据库这一术语来表示逻辑上的数据隔离,也就是说微服务可以共享物理数据库,但应该使用分开的数据结构、集合或者表,这还将有助于确保微服务是按照领域驱动设计的方法正确拆分的。

优缺点

  • 优点:服务间数据隔离清晰,减少数据冲突和依赖;每个服务可以独立选择最适合其业务需求的数据库技术。
  • 缺点:跨服务的数据一致性管理复杂;分布式事务处理困难;数据冗余和同步问题。

实现方式
        每个微服务在启动时配置自己的数据库连接信息,并通过ORM(对象关系映射)框架或数据访问层(DAO)与数据库进行交互。

可用技术示例
      MySQL、MongoDB、Cassandra等数据库系统,以及Spring Data JPA、MyBatis等ORM框架。

使用场景
     适用于业务复杂度高、数据模型差异大、需要高度自治的微服务系统。

2. 聚合器(Aggregator)

描述
         聚合器模式是一种将多个微服务的响应聚合起来,以形成一个统一的响应返回给客户端的设计模式。这种模式常用于构建复杂的业务场景,其中客户端需要的数据分散在多个微服务中。

          为了尽量减少服务之间的通信,我们可以使用服务聚合模式。基本上,服务聚合设计模式是接收来自客户端或 API 网关的请求,然后分配给内部多个后端微服务,再将结果合并,并在一个响应结构中发给请求发起人。

       通过实现服务聚合模式,可以减少客户端和微服务之间的通信量和通信开销

     服务聚合模式

 微服务通信设计模式------服务聚合模式设计

优缺点

  • 优点:提高系统的灵活性和可扩展性;减少客户端的调用次数和复杂度。
  • 缺点:聚合器可能成为性能瓶颈;增加了系统的复杂性和维护成本。

实现方式
   聚合器微服务通过同步或异步方式调用其他微服务,并将结果聚合后返回给客户端。

可用技术示例
      Spring Cloud Gateway、Zuul等API网关,以及Spring Boot、Node.js等后端技术栈。

使用场景
     适用于需要跨多个微服务获取数据并展示给用户的场景,如电商平台的商品详情页。

3. 链式(Chain)

  描述
     链式模式是指微服务之间按照特定的顺序进行调用,形成一条服务调用链。每个服务在接收到请求后,处理部分业务逻辑,并将请求传递给链中的下一个服务。

  优缺点

  • 优点:实现服务间的松耦合;提高系统的灵活性和可维护性。
  • 缺点:调用链过长可能导致性能问题;服务间的依赖关系复杂。

实现方式
     通过HTTP请求或消息队列等方式实现服务间的顺序调用。

可用技术示例
      Spring Cloud OpenFeign、Apache Dubbo等RPC框架,以及RabbitMQ、Kafka等消息队列。

使用场景
      适用于业务流程具有明确顺序和依赖关系的场景,如订单处理流程。

4. 代理(Proxy)

描述
     代理模式在微服务架构中通常指API网关,它作为客户端和微服务之间的中间层,负责路由、过滤、认证、限流等职责。

优缺点

  • 优点:简化客户端调用;提高系统的安全性和可维护性。
  • 缺点:API网关可能成为单点故障;增加系统的复杂性和维护成本。

实现方式
     使用Nginx、Zuul、Spring Cloud Gateway等API网关产品。

可用技术示例
         Nginx、Zuul、Spring Cloud Gateway等。

使用场景
       适用于需要统一入口、进行请求路由和过滤的场景。

5. 异步消息传递(Asynchronous Messaging)

描述
      同步调用模式在调用的过程中会阻塞线程,如果服务提供方迟迟没有返回,则服务消费方会一直阻塞,严重的会撑满服务的线程池,出现雪崩效应。因此,在构建服务架构系统时,通常会梳理核心系统的最小化服务集合,这些核心的系统服务使用同步调用。而其他核心链路以外的服务可以使用异步消息队列进行异步化

优缺点

  • 优点:提高系统的可靠性和可扩展性;减少服务间的直接依赖。
  • 缺点:增加了系统的复杂性和维护成本;消息的一致性和顺序性管理困难。

实现方式
      使用RabbitMQ、Kafka等消息队列产品。

可用技术示例
       RabbitMQ、Kafka、ActiveMQ等。

使用场景
         适用于对实时性要求不高,但需要高可靠性和可扩展性的场景,如订单处理、日志收集等。在这些场景中,服务之间的调用不必立即响应,可以通过消息队列进行异步处理,从而提高系统的整体性能和稳定性。

6. 事件驱动(Event-Driven)

描述
     事件驱动模式通过事件来触发服务之间的交互。当一个微服务发生特定事件时,它会发布该事件到事件总线或消息队列中,其他微服务可以订阅这些事件并在事件发生时进行相应的处理。

优缺点

  • 优点:实现服务间的松耦合;提高系统的可扩展性和灵活性。
  • 缺点:事件处理的一致性和顺序性管理困难;系统复杂度增加。

实现方式
       使用事件总线(如Apache Kafka、RabbitMQ等)或分布式消息系统来实现事件的发布和订阅。

可用技术示例
    Apache Kafka、RabbitMQ、Azure Event Grid等。

使用场景
      适用于需要高度解耦、实时性要求不高的场景,如订单状态变更通知、用户行为跟踪等。

7. 服务发现(Service Discovery)

描述
     服务发现模式允许微服务在运行时自动发现其他服务的地址和端口信息,从而实现服务的自动注册和发现。这有助于实现服务的动态扩展和容错。

优缺点

  • 优点:提高系统的灵活性和可扩展性;减少服务间的硬编码依赖。
  • 缺点:服务注册和发现的复杂性和开销。

实现方式
      使用服务注册中心(如Eureka、Consul、Zookeeper等)来管理服务的注册和发现。

可用技术示例
       Eureka、Consul、Zookeeper等。

使用场景
     适用于需要动态扩展和容错能力的微服务系统,特别是在云环境或容器化部署中。

8. Saga

描述
    如果微服务使用独享数据库,那么通过分布式事务管理一致性是一个巨大的挑战。你无法使用传统的两阶段提交协议,因为它要么不可伸缩(关系数据库),要么不被支持(多数非关系数据库)。

    但您还是可以在微服务架构中使用 Saga 模式实现分布式事务。Saga 是 1987 年开发的一种古老模式,是关系数据库中关于大事务的一个替代概念。但这种模式的一种现代变种对分布式事务也非常有效。Saga 模式是一个本地事务序列,其每个事务在一个单独的微服务内更新数据存储并发布一个事件或消息。Saga 中的首个事务是由外部请求(事件或动作)初始化的,一旦本地事务完成(数据已保存在数据存储且消息或事件已发布),那么发布的消息或事件则会触发 Saga 中的下一个本地事务。

  

优缺点

优点:

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

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

缺点:

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

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

实现方式
     使用熔断器库(如Netflix的Hystrix、Resilience4j等)来实现熔断逻辑。

可用技术示例
     Axon, Eventuate, Narayana

使用场景
     

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

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

9. 缓存(Caching)

描述
     缓存模式通过在服务之间添加缓存层来减少对底层数据源的访问频率,从而提高系统的响应速度和吞吐量。

优缺点

  • 优点:提高系统的响应速度和吞吐量;减少对底层数据源的访问压力。
  • 缺点:数据一致性问题;缓存击穿和雪崩问题。

实现方式
      使用缓存中间件(如Redis、Memcached等)来实现缓存逻辑。

可用技术示例
      Redis、Memcached等。

使用场景
       适用于读多写少、数据更新频率不高的场景,如商品信息、用户信息等。

10.边车模式(Sidecar Pattern)

描述:

         边车模式(Sidecar Pattern)是一种在微服务架构中常见的模式,它通过将辅助性质的服务(通常被称为sidecar)与主要的服务实例部署在一起,以提供额外的功能、能力或支持。边车模式的设计思想是将控制和逻辑分离,使得主要服务实例可以更专注于其核心业务逻辑,而边车则负责处理如日志记录、监控、安全性、通信等辅助功能。这种设计模式允许主服务更加单一职责,便于维护和升级,同时也提高了系统的灵活性和可扩展性。

优点:

  1. 解耦与模块化:将服务治理功能从业务逻辑中分离出来,实现了关注点的分离和模块化,使得业务逻辑更加清晰和简洁,同时治理功能也更加可重用和灵活。
  2. 可扩展性:允许对治理功能进行独立的扩展和升级,而不需要修改业务逻辑代码,提高了系统的可扩展性。
  3. 多语言支持:对业务逻辑的代码侵入性较小,支持多种编程语言和技术栈,使得在混合语言环境中进行微服务治理变得更加容易。
  4. 灵活性:可以灵活地添加或移除治理功能,以满足不同业务场景的需求,降低了维护成本。

缺点:

  1. 复杂性增加:引入边车模式会增加系统的复杂性,需要额外管理和维护边车进程,增加了开发和运维的工作量。
  2. 资源消耗:每个微服务实例都需要一个边车进程,可能会导致资源(如CPU、内存等)的消耗增加,在资源受限的环境中可能成为一个问题。
  3. 网络延迟:边车进程需要与微服务实例进行通信,可能会增加网络延迟,尽管可以通过优化网络配置来降低延迟。

实现方式:

       边车模式的实现通常涉及使用特定的技术或工具,这些工具可以作为辅助性质的服务与主服务实例一起部署。常见的实现方式包括:

  1. 使用容器化技术:如Docker容器,将边车服务作为独立的容器与主服务容器部署在同一个Pod中(在Kubernetes等容器编排系统中)。
  2. 部署代理:如Envoy、Linkerd等高性能的代理和通信总线,负责处理服务之间的网络通信、负载均衡、故障恢复等任务。

可用技术示例:

  1. Istio:一个开源的服务网格框架,通过在应用程序的每个服务实例旁边部署一个Envoy Sidecar来实现边车模式,提供了流量管理、安全性、可观察性等功能。
  2. Linkerd:由Buoyant公司开源的服务网格实现,通过在每个服务实例旁边部署一个Linkerd Proxy来实现边车模式,提供了负载均衡、故障注入、监控和可观察性等功能。
  3. Consul Connect:HashiCorp公司的Consul服务发现和配置管理工具的一部分,通过在每个服务实例旁边运行一个代理来实现边车模式,提供安全的服务到服务通信功能。
  4. NGINX:虽然主要作为Web服务器和反向代理服务器使用,但也可以作为Sidecar部署在每个服务实例旁边,通过配置NGINX作为反向代理,实现负载均衡、安全性和其他网络功能。

使用场景:

  1. 老系统的改造和扩展:对于已有的复杂系统,边车模式可以帮助逐步引入微服务治理功能,而不需要对整个系统进行重构。
  2. 多语言环境:在由多种语言构建的微服务系统中,边车模式可以提供一种统一的服务治理方式,降低跨语言集成的难度。
  3. 控制和逻辑分离:当需要将服务治理逻辑与业务逻辑分离时,边车模式是一个很好的选择,有助于降低代码的耦合度,提高系统的可维护性。
  4. 微服务治理:包括服务注册、发现、负载均衡、熔断、限流等功能,边车模式可以很容易地集成这些服务治理功能,而无需修改主服务的代码。
  5. 监控和日志记录:通过将监控和日志记录功能封装在边车中,可以实现对所有服务实例的统一监控和日志记录,便于快速定位问题和优化系统性能。
  6. 安全性和认证授权:边车可以处理所有的网络通信,并应用适当的安全协议来保护服务间的通信,确保数据传输的安全性和授权服务的相互通信。

上面是对微服务架构设计中常见设计模式的简要介绍,每种模式都有其独特的优缺点、实现方式和使用场景。在实际应用中,开发者需要根据项目的具体需求和约束条件来选择合适的设计模式,并结合其他最佳实践来构建高质量的微服务系统。

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

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

相关文章

重塑商业生态:技术驱动下的批发供应系统开发与革新

在当今这个快速变化的商业环境中,批发供应系统作为连接生产商、分销商与零售商的关键纽带,其效率与智能化水平直接影响着整个供应链的运作效率与市场竞争力。随着信息技术的飞速发展,特别是大数据、云计算、人工智能(AI&#xff0…

D. 二进制

1.题意:给出2中操作 1):将段排序 2):将段输出为十进制数 思路: 1.考虑第一种操作。只需要查询l-r中1的个数即可。如果递增,则中为1,否则中为1,需要一个覆盖tag 2.考虑如何维护十进制的值。…

基于Java的美妆购物网站的设计与实现

TOC springboot323基于Java的美妆购物网站的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和…

在 S7-1200/S7-1500 中,如何测量一个完整程序、子程序或特定组织块的运行时间?

RUNTIME"指令的第一次调用用来设置测量时间的起点,并将其保存在DB变量 "Memory"中来为第二次调用做参考。然后调用 "TestBlock" 程序块。当程序块被执行后,"RUNTIME" 指令第二次调用,第二次调用来计算 "TestBlock"程序块的运行…

电影《白蛇:浮生》观后感

上周看了电影《白蛇:浮生》,动画的特效方面,中国动画这几年确实做的非常不错了,不过整个故事,还是老的那套,并没有感觉特别新意。 (1)老套故事 《白娘子传奇》的故事,几…

NCBI批量下载序列

根据提供的accession编号批量下载 下载地址 NCBI_batch 点击选择文件,导入需要下载的accession编号文件,点击Retrieveji下载

eNSP 华为划分VLAN

SW1&#xff1a; <Huawei>system-view [Huawei]sysname SW1 [SW1]VLAN batch 10 20 //批量划分vlan [SW1]interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1]port link-type access //设置为access口&#xff0c;access口允许单个vlan通过 [SW1-GigabitEth…

数据结构day02(链表)

【1】链表 Link list 链表又称单链表/链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据 和顺序表不同&#xff0c;使用链表存储数据&#xff0c;不强制要求在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 所以在链表中&#xff0c;每个数据元素可以配…

K7系列FPGA多重启动(Multiboot)

Xilinx 家的 FPGA 支持多重启动功能&#xff08;Multiboot&#xff09;&#xff0c;即可以从多个 bin 文件中进行选择性加载&#xff0c;从而实现对系统的动态更新&#xff0c;或系统功能的动态调整。 这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而…

计算机网络体系结构【★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、计算机网络概述 1. 计算机网络的性能指标&#xff08;★★&#xff09; 1&#xff09;速率&#xff08;speed&#xff09; 指连接到计算机网络上的节点在数…

用爬虫玩转石墨文档详细操作步骤

石墨文档是一款强大的在线文档编辑和协作工具&#xff0c;它支持文字处理、表格制作、演示文稿等多种功能&#xff0c;适用于个人和团队的办公需求。以下是一些玩转石墨文档的详细步骤和技巧&#xff1a; 1. 注册和登录 注册&#xff1a;访问石墨文档官网&#xff0c;点击“注…

【漏洞复现】某骋BPM系统——Handler.ashx——sql注入

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 某骋BPM系统是一款功能全面的商业流程管理平台,旨在帮助企业实现…

车辆横向控制的参考路径估计

Reference Path Estimation for Lateral Vehicle Control 车辆横向控制的参考路径估计 Abstract Autonomous driving cars have been a hot topic in the media in recent years, with more and more tech companies and universities presenting projects with fully autom…

同态加密和SEAL库的介绍(九)CKKS 参数心得 1

写在前面&#xff1a; 前面几篇有官方的说明和示例做支撑&#xff0c;相信能给大家比较多的参考价值。但是由于没能对同态加密有更深入的了解&#xff0c;所以在我具体使用的时候出现各种问题。本篇是针对这些问题做的一些测试&#xff0c;由结论产生的了些个人的推测&#xff…

准大学生电脑应该怎么选?

随着夏日的尾声悄然临近&#xff0c;各位准大学生们是不是已经迫不及待想要翻开大学生活的崭新篇章了呢&#xff1f;作为准大学生&#xff0c;选择一台称心如意的电脑绝对是大家最近最头疼的事情&#xff0c;那我们应该怎么选择适合自己的电脑呢&#xff1f; 01 处理器&#x…

井字棋游戏(HTML+CSS+JavaScript)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;这两天在写植物大战僵尸&#xff0c;写不动了&#xff0c;现在和大家分享一下之前我写的一个很简单的小游戏井字棋&#xff0c;这个没有AI&#xff0c;可以两个人一起玩&#xff0c;如果大家觉得我哪里写的有一些问…

【Redis】Linux CentOS Redis 的安装—(一)

Redis 一、获取源二、解压编译 一、获取源 //redis-stable是最新稳定版 wget https://download.redis.io/redis-stable.tar.gz二、解压编译 //我指定目录/app tar -xzvf redis-stable.tar.gz -C /appcd /app/redis-stablemake && make install##三 、修改配置启动 …

重复的子字符串 | LeetCode-459 | 字符串匹配 | KMP | 双指针

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️KMP练习题 &#x1f4cc;LeetCode链接&#xff1a;459. 重复的子字符串 文章目录 1.题目描述&#x1f34d;2.题解&#x1fad0;2.1 暴力解法&#x1…

enhanced Input Action IA_Look中Action value引脚没有分割结构体引脚的选项

UE5系列文章目录 文章目录 UE5系列文章目录前言二、使用步骤解决办法 前言 据说&#xff0c;unreal engine5中准备废弃“项目设置”中“输入”&#xff0c;操作映射&#xff0c;轴映射。取而代之的是&#xff1a; 使用增强的输入动作&#xff08;Enhanced Input Actions&#…

【QT】Qt SDK的下载,安装和环境配置

目录 一&#xff0c;Qt SDK的下载二&#xff0c;Qt SDK的安装三&#xff0c;验证Qt SDK安装是否成功四&#xff0c;Qt环境变量配置 一&#xff0c;Qt SDK的下载 进入下面两个网站都可以进行下载&#xff1a; Qt 下载官⽹ 国内清华源 进⼊官⽹&#xff0c;按如下图⽰进⾏相应…