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

微服务架构设计的概念

      微服务架构(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. 命令和查询职责分离(CQRS)

描述
       如果我们使用事件源,那么从事件存储中读取数据就变得困难了。要从数据存储中获取实体,我们需要处理所有的实体事件。有时我们对读写操作还会有不同的一致性和吞吐量要求。

       这种情况,我们可以使用 CQRS 模式。在该模式中,系统的数据修改部分(命令)与数据读取部分(查询)是分离的。而 CQRS 模式有两种容易令人混淆的模式,分别是简单的和高级的。       其简单形式中,不同实体或 ORM 模型被用于读写操作,如下所示:

它有助于强化单一职责原则和分离关注点,从而实现更简洁的设计。

        在其高级形式中,会有不同的数据存储用于读写操作。高级的 CQRS 通常结合事件源模式。根据不同情况,会使用不同类型的写数据存储和读数据存储。写数据存储是“记录的系统”,也就是整个系统的核心源头。

        对于读频繁的应用程序或微服务架构,OLTP 数据库(任何提供 ACID 事务保证的关系或非关系数据库)或分布式消息系统都可以被用作写存储。对于写频繁的应用程序(写操作高可伸缩性和大吞吐量),需要使用写可水平伸缩的数据库(如全球托管的公共云数据库)。标准化的数据则保存在写数据存储中。
       对搜索(例如 Apache Solr、Elasticsearch)或读操作(KV 数据库、文档数据库)进行优化的非关系数据库常被用作读存储。许多情况会在需要 SQL 查询的地方使用读可伸缩的关系数据库。非标准化和特殊优化过的数据则保存在读存储中。
        数据是从写存储异步复制到读存储中的,所以读存储和写存储之间会有延迟,但最终是一致的。


微服务架构及其最重要的10个设计模式
原文链接: https://www.infoq.cn/article/kdw69bdimlx6fsgz1bg3

优缺点

 优点:

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

  • 数据的高可用性。

  • 读写系统可独立扩展。

缺点:

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

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

可用技术示例:      

写存储: EventStoreDB, Apache Kafka, Confluent Cloud, AWS Kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, MongoDB, Cassandra. Amazon DynamoDB

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

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

使用场景

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

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

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

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.rhkb.cn/news/404018.html

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

相关文章

clickhouse集群+Zk优化-解决只读模式,主节点磁盘增长快

问题1:数据库进入只读模式 最近在项目中使用clickhouse的时候,遇到了一个批量插入后报错的问题。报错的内容是数据库进入了只读模式,导致数据写不进去。发现有大量的批量写入报错日志信息。(关键异常信息:DB::Exceptio…

高德地图SDK Android版开发 6 显示覆盖物

高德地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互动画其它属性 折线的更多属性常用属性其它属性 多边形的更多属性常用属性其它属性 Arc的更多属性Ci…

[数据结构] RBTree 模拟实现RBTree

标题:[数据结构] RBTree && 模拟实现RBTree 水墨不写bug 目录 一、红黑树的概念 二、map和set的封装 三、红黑树的实现 1、红黑树节点的定义 2、红黑树的结构 3、红黑树的插入 1.名称 2.插入节点的颜色 红黑树的insert 实现 情况一:不…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

Spring Boot: 2.7.x 至 2.7.18 及更旧的版本,漏洞说明

本文提供的修复指南将帮助开发者有效规避 CVE-2024-38808 和 CVE-2024-38809 的风险。如果你正在使用老版本的 Spring Boot,请尽快参考本文进行修复与升级。 此漏洞来源于spring官网:https://spring.io/blog/2024/08/14/spring-framework-releases-fixe…

8.17模拟赛题解

先考虑空间能不能把N个座位放好 最优的方式就是挨着摆放 那么一排能摆放QL/x的商个椅子 ,然后计算摆放完N个座位需要多少排,N/Q 向上取整 计算所需要的排总共占据多宽,讨论有没有超过W,然后讨论剩余空间还能放几条走廊 如果走廊数…

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署 什么是RAG: 我能把这个过程理解为Kimi.ai每次都能列出的一大堆网页参考资料吗?Kimi学了这些资料以后,根据这里面的信息综…

Leading SAFe领导大规模敏捷认证公开课

课程简介 SAFe – Scaled Agile Framework是目前全球最广泛使用的大规模敏捷框架,也是全球敏捷相关认证中增长最快、最受认可的规模化敏捷认证。全球已有超过120万名SAFe认证专业人士。据官方统计,获得SAFe认证的IT专业人士平均工资增长13,000美元&…

澎湃认证显实力,浪潮信息存储兼容新篇章

浪潮信息在存储技术兼容性领域取得新突破,其集中式存储HF/AS系列与长擎安全操作系统24强强联合,成功完成澎湃技术认证。此次合作不仅验证了双方产品的无缝对接能力,更体现了浪潮信息在推动全产业链共建共享方面的坚定决心。 浪潮信息澎湃技术…

python人工智能001:NumPy科学计算库说明与安装

1. NumPy说明 NumPy(Numerical Python)是Python的一个开源数值计算扩展库。它提供了一个强大的N维数组对象ndarray,以及用于对这些数组进行操作的函数。NumPy的数组和数组操作是Python数据分析、机器学习、科学计算等领域的基础。 NumPy的主…

Linux 配置定时任务

Linux定时任务,通常被称为Cron Jobs,在系统管理和运维自动化领域中扮演着至关重要的角色,并且在日常的服务器维护活动中也展现出了广泛而深远的应用价值。这种强大的工具允许用户按照预定的时间周期自动执行各种任务,如数据备份、…

从零开始掌握限流技术:计数器、滑动窗口、漏桶与令牌桶详解

为什么需要限流呢? 🔹想象一下,你的服务器就像一个繁忙的餐馆,而你的应用就像是餐馆的服务员。餐馆里人山人海,每个人都在争先恐后地想要点餐。这时候,如果没有一个好的限流机制,会发生什么呢&…

京东2025届秋招 算法开发工程师 第2批笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/17 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷还有选择题部分,但这部分比较简单就不再展示。 1. 第一题 村子里有一些桩子,从左到右高度依次为 1 , 1 2…

【免费】企业级大模型应用推荐:星环科技无涯·问知

无涯问知是星环科技发布的大模型应用系统,那么我们先简单了解下星环科技吧! 星环科技(股票代码:688031)致力于打造企业级大数据和人工智能基础软件,围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…

这个是git使用的合集

如果遇到了关于git和github的bug就会写这里 2024/8/16 github一直没有打卡和上传代码是因为感觉除了做项目的情况,普通的学习和普通的笔记没必要记在github里;如果是笔记类的东西为什么不记在csdn上呢?如果是算法题算法网站上回有记录啊&am…

CAD图纸加密软件哪个好?(这六款大众好评度高!)

在CAD图纸加密软件领域,有多款软件因其高效、安全、易用等特点而广受好评。 以下是六款大众好评度较高的CAD图纸加密软件,它们各自具有独特的功能和优势: 1.安企神 特点:它以其强大的透明加密技术和精细化的权限管理功能著称。 …

python爬虫爬取某图书网页实例

文章目录 导入相应的库正确地设置代码的基础部分设置循环遍历遍历URL保存图片和文档全部代码即详细注释 下面是通过requests库来对ajax页面进行爬取的案例,与正常页面不同,这里我们获取url的方式也会不同,这里我们通过爬取一个简单的ajax小说…

MPU6050详细介绍

一、MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件 内部主要结构:陀螺仪、加速度计、数字运动处理器DMP(Digital Motion Processor) MPU6050有两个IIC接口,第一IIC接口可作为主接口给单片机传输数…

CSP-CCF 202012-1 期末预测之安全指数

一、问题描述 二、解答 #include<iostream> using namespace std; int main() {int n;cin >> n;int w[100001] { 0 };int score[100001] { 0 };for (int i 1; i < n; i){cin >> w[i] >> score[i];}int y 0;for (int i 1; i < n; i){y y …

电脑监控软件有哪些,哪款更好用?一网打尽!电脑监控软件大搜罗,总有一款适合你!

甲&#xff1a;哎&#xff0c;您听说了吗&#xff1f;这年头&#xff0c;电脑监控软件那是五花八门&#xff0c;跟变戏法似的&#xff01; 乙&#xff1a;哦&#xff1f;怎么个五花八门法&#xff1f; 甲&#xff1a;嘿&#xff0c;您还别说&#xff0c;从实时监控到网络追踪…