SpringCloud组件简介

核心组件:

组件关系图:

1. 服务注册和发现

Netflix Eureka

Eureka 是 Netflix 开发的一个基于 REST 服务的应用程序,用于实现服务注册和服务发现。在微服务架构中,Eureka 作为服务注册中心发挥着至关重要的作用,帮助各个服务实例互相发现和协调通信。以下是 Eureka 工作原理的详细说明:

1. 服务注册

  • 服务提供者注册: 当一个微服务启动时,它包含的 Eureka Client 会通过 HTTP 请求将自身的服务实例信息(包括服务ID、主机地址、端口、元数据等)注册到 Eureka Server 中。服务实例会定时(默认每30秒)发送心跳给 Eureka Server,以证明其仍然处于活跃状态。
  • 服务实例续约: Eureka Client 心跳过程就是所谓的续约(renew lease),即不断地告诉 Eureka Server:"我还活着"。如果某个服务实例在设定的时间(默认90秒)内没有成功续约,Eureka Server 就会认为该服务实例可能已下线,并将其标记为不可用。

2. 服务发现

  • 服务消费者获取服务列表: 另一方面,服务消费者也是 Eureka Client,它会在启动时或定时(同样默认每30秒)从 Eureka Server 拉取最新的服务注册表信息,这样就能知道有哪些可用的服务提供者及其实例。
  • 负载均衡与服务调用: 服务消费者在获得服务列表后,可以根据配置的负载均衡策略选择一个或多个服务实例进行调用。通常使用 Ribbon 或者 Spring Cloud LoadBalancer 等客户端负载均衡器来实现这一过程。

3. 失效剔除与自我保护模式

  • 失效剔除: Eureka Server 有一个内置的任务 EvictionTask,它周期性(默认每60秒)检查未续约的服务实例,将超出一定时间(如90秒)未续约的服务实例从注册表中剔除。
  • 自我保护模式: 当网络分区或者其他故障可能导致大规模心跳丢失时,Eureka Server 可以启用自我保护模式,此时即便大部分实例未能及时续约,Eureka 也不会立刻剔除这些服务实例,以免在短时间内注销大量其实仍健康的服务。自我保护模式可以在集群不稳定时起到保护作用,待网络环境恢复后再正常清理无效实例。

4. 高可用性

  • 集群配置: 为了实现高可用,通常会部署多个 Eureka Server 形成集群。每个 Eureka Server 之间也会相互注册和同步服务注册表信息,以便在单点故障时其他节点可以继续提供服务发现的能力。

自我保护模式的工作原理是这样的:

  • 当 Eureka Server 观察到网络故障导致节点间的通信不稳定,并且在此期间收到的心跳数低于阈值时,它会自动切换到自我保护模式。
  • 在自我保护模式下,Eureka Server 不会轻易地注销任何服务实例,即使它们的心跳超时。
  • 这样做的目的是为了防止在短暂的网络故障期间发生大规模的服务实例剔除,保持系统的整体稳定性和可用性,直到网络状况恢复。
  • 当网络问题解决后,Eureka Server 会自动退出自我保护模式,并恢复正常的工作流程,包括根据心跳判断和服务实例的剔除逻辑。

注: 当Eureka Server切换到自我保护模式后,对于那些因网络故障未能及时更新心跳但仍存在于服务注册表中的服务实例,Eureka Server并不会立即将其从注册列表中移除。因此,如果有客户端应用通过Eureka Server去请求这些出现网络故障的服务实例,理论上请求仍有可能被路由到这些实例上。从用户角度来看,虽然Eureka Server的自我保护机制有助于防止服务雪崩,但也可能导致请求成功率降低,因为可能存在一定的概率请求到不可用的服务实例。 为了减轻这种影响,应用服务端通常还需要结合熔断、降级、负载均衡策略以及健康检查机制来进一步确保服务调用的可靠性。

Zookeeper

参考文章

ZooKeeper 是一个开源的分布式服务协调系统,由 Apache 软件基金会开发和维护。它为大型分布式系统提供了一致性服务,使得开发人员能够更容易地解决分布式环境下的数据管理和协调问题。ZooKeeper 的工作原理主要包括以下几个关键部分:

数据模型与存储结构

  1. 数据模型:ZooKeeper 采用一个类似于文件系统的树形数据结构,称为 ZNode。每个 ZNode 包含数据以及一组属性,如版本号、ACL(访问控制列表)、创建和修改时间戳等。ZNode 可以有子节点,形成层级关系。
  2. 持久化与临时节点:ZooKeeper 支持两种类型的节点,持久化节点在服务器重启后依然存在,而临时节点与客户端会话相关联,客户端会话结束时临时节点会被删除。

一致性协议

  1. ZAB 协议:ZooKeeper 使用一种名为 ZAB (ZooKeeper Atomic Broadcast) 的原子广播协议来保证数据的一致性。ZAB 是一种支持崩溃恢复的主从复制协议,实现了强一致性。
  2. 领导者选举:ZooKeeper 集群中的服务器通过 FastLeaderElection 算法选举出一个 Leader,其余服务器作为 Follower 或 Observer。Leader 负责处理写操作并广播事务提议(Proposal),Follower 接收并执行来自 Leader 的提案,达成一致后将数据持久化并响应客户端读请求。
  3. 数据同步与事务顺序:所有写入请求都必须经过 Leader 服务器,Leader 为每个写操作生成全局有序的事务 ID(zxid)。Follower 接收到 Proposal 后,需要在本地提交事务并追加到事务日志中,确保所有服务器上的数据变更顺序一致。

客户端交互

  1. Watcher 机制:ZooKeeper 提供了一个强大的 Watcher 监听机制,客户端可以对任意 ZNode 设置监听器。当被监听的 ZNode 数据发生改变或子节点列表发生变化时,ZooKeeper 会触发事件并将通知发送给设置监听的客户端。
  2. 会话管理:客户端与 ZooKeeper 服务器之间建立长连接,形成会话。ZooKeeper 能够感知客户端的断开与重连,支持临时节点的生命周期管理,并在会话过期或中断时通知客户端。

应用场景

  • 分布式锁:通过创建有序临时节点实现分布式锁服务,如互斥锁、读写锁等。
  • 集群管理与选举:例如在 Hadoop 中实现 NameNode 的 HA,通过 ZooKeeper 进行主备切换。
  • 配置管理:服务端存储共享配置,客户端通过监视特定节点获取配置更新。
  • 命名服务:为分布式系统提供统一的命名空间,便于查找和定位服务。
  • 队列服务:利用 ZooKeeper 的特性实现先进先出(FIFO)队列服务。

Nacos

Nacos 是阿里巴巴集团开源的一个集成了服务发现、配置管理和服务管理的平台,专为云原生应用设计,尤其适用于微服务架构场景。Nacos 主要包含以下几个核心部分:

服务注册与发现

  1. 服务注册

    • 微服务启动时,服务提供者通过 Nacos 客户端向 Nacos 服务器注册自身的服务信息,包括服务名、IP 地址、端口号、权重、元数据等。
    • 注册信息会被持久化存储在 Nacos 服务器中,这样服务消费者可以通过查询 Nacos 服务器获取到服务提供者的列表。
  2. 服务发现

    • 服务消费者同样通过 Nacos 客户端向 Nacos 服务器发起服务查询请求。
    • Nacos 服务器会根据服务名返回对应的服务提供者列表,列表可能基于负载均衡策略进行排序。
    • 服务消费者使用得到的服务地址列表进行服务调用。

配置管理

  1. 配置发布与订阅

    • 开发者可以将应用程序的各种配置项以 Data ID 和 Group 的形式上传至 Nacos 配置中心。
    • 应用程序通过 Nacos 客户端 SDK 注册配置监听器,指定要监听的 Data ID 和 Group。
    • 当开发者在 Nacos 控制台修改或新增配置时,Nacos 服务器会实时推送配置变更给所有订阅了该配置的应用实例。
  2. 配置拉取与更新

    • Nacos 客户端周期性地或通过长轮询方式从 Nacos 服务器获取最新的配置内容。
    • 当检测到配置变化时,客户端会下载新配置,并通过 SPI 加载到应用上下文中,触发自动刷新机制,使配置变更即时生效。

心跳与健康检查

  • Nacos 服务端通过接收客户端定期发送的心跳包来确认服务实例是否存活。若服务实例长时间未发送心跳,则将其标记为不健康或下线状态,不再对外提供服务。

高可用与数据一致性

  • Nacos 通常部署为集群模式,通过 Raft 或其他一致性算法保证集群内各节点间的配置和服务信息数据的一致性。
  • 客户端可以选择连接到集群中的任何节点,集群内部会负责数据的同步和故障转移。

通信协议优化

  • 在较新的版本中,Nacos 支持 gRPC 协议,相较于 HTTP,gRPC 通过双向流和长连接可以提高通信效率和减少资源消耗。

动态 DNS 服务

  • Nacos 还支持动态 DNS 服务,可以根据服务名解析出具体的服务实例地址,简化服务调用过程。

其他功能

  • Nacos 还提供了服务元数据管理、服务分组、灰度发布、权限控制等高级功能,以适应更为复杂的微服务治理需求。

综上所述,Nacos 作为一个综合性服务治理平台,通过高效的服务注册与发现机制、实时的配置管理和灵活的扩展能力,有效促进了微服务架构中服务之间的协同和管理。

2. 配置中心

Apollo

Apollo(阿波罗)是一个分布式配置中心,由携程框架研发部开发,主要用于解决微服务架构中配置的集中管理、动态推送和版本控制等问题。以下是Apollo的工作原理概述:

1. 架构组成

  • Apollo Portal: 提供可视化界面,供开发者进行配置管理和发布。管理员可以通过Portal对不同环境(如开发、测试、生产)、不同集群的配置进行增删改查和版本控制。
  • Apollo Config Service: 提供配置的读取和推送功能,服务对象主要是Apollo客户端。它负责存储和管理所有的配置信息,并通过服务注册与发现(如使用Eureka)实现高可用。
  • Apollo Admin Service: 提供配置的修改和发布功能,服务对象是Apollo Portal。管理员在Portal上做的任何配置更改都会通过Admin Service提交并同步到Config Service。
  • Apollo Client: 嵌入到各个服务应用中,通过长轮询、HTTP长连接或其他推送机制从Config Service获取配置更新,并缓存到本地,同时提供配置热更新能力。

2. 工作流程

  • 配置注册与获取

    • 应用服务启动时,其内的Apollo客户端会向Apollo Config Service注册自身信息并初始化配置。
    • 客户端通过与Config Service保持长连接,实时获取最新配置变化。也可以定期拉取以确保配置同步。
  • 配置发布

    • 开发者通过Apollo Portal修改应用的配置,这些更改会提交到Admin Service。
    • Admin Service审核并通过配置更新后,将新的配置内容同步到Config Service。
  • 配置推送与更新

    • 当Config Service接收到新的配置时,会通过长轮询机制或推送通道将配置更新推送给已注册的客户端。
    • 客户端收到更新通知后,会更新本地缓存的配置,并根据配置内容决定是否需要重启或刷新部分业务逻辑。
  • 灰度发布

    • Apollo还支持灰度发布,允许配置只推送给部分符合条件的客户端,比如特定的环境、集群或版本。
  • 权限与流程治理

    • Apollo具有完善的权限管理机制,确保只有拥有相应权限的用户才能对配置进行编辑和发布。
    • 对配置变更进行版本管理,每一次改动都有历史记录,方便回滚和审计。

3. 技术实现

  • 存储层:Apollo使用数据库存储配置信息,支持MySQL等关系型数据库。
  • 通信机制:Apollo Client与Server之间的通信采用长轮询或HTTP长连接等方式,实现配置的实时推送。
  • 集群部署:Apollo服务端各个组件均可水平扩展,通过服务注册与发现实现高可用。

总之,Apollo通过一套完整的分布式配置管理系统,让微服务应用可以方便、安全、高效地管理和消费配置信息,降低了配置管理的复杂度,提升了系统的灵活性和响应速度。

3. 网关

Spring Cloud Gateway

Spring Cloud Gateway 是Spring生态体系中的一款API网关服务,它是Spring Cloud项目的组件之一,主要用于微服务架构中,作为统一的入口和出口,对内部服务进行集中化的路由管理、安全控制、流量控制等功能。其设计思想是基于Spring Boot 2.x和Spring WebFlux构建,利用Reactor项目和Netty服务器提供的异步非阻塞能力,确保高并发场景下的高性能表现。

Spring Cloud Gateway的核心原理包括以下几点:

  1. 路由(Routing)

    • 用户可以根据需要定义路由规则,这些规则包含路由ID、目标URI、路由谓词和过滤器列表。
    • 路由谓词是一种条件匹配机制,用于决定哪些请求应被路由至哪个后端服务,条件可能涉及HTTP方法、URL路径、请求头、查询参数等。
  2. 过滤器(Filters)

    • Gateway通过过滤器链对请求和响应进行预处理和后处理。
    • 过滤器可以实现诸如身份验证、授权、日志记录、请求转换、响应修饰等各种中间件功能,并且支持自定义过滤器以满足特定业务需求。
    • 过滤器按顺序应用,形成一个责任链模式,每个过滤器可以决定是否继续传递请求到下一个过滤器或者直接返回响应。
  3. 初始化与请求处理流程

    • 初始化阶段,Gateway会从配置源加载路由定义(RouteDefinitions),每个定义内含了其对应的过滤器链配置。
    • 当请求到达时,Gateway会根据路由规则找到匹配的RouteDefinition,并依据此创建相应的过滤器链。
    • 请求按照过滤器链依次执行,每个过滤器负责执行特定的任务,最终请求会被转发至匹配的目标服务。
  4. 集成与扩展

    • Spring Cloud Gateway集成了Spring Cloud生态系统中的服务发现组件(如Eureka)、断路器(如Hystrix,虽然现在推荐使用 resilience4j)等,便于与现有微服务体系平滑整合。
    • 支持动态路由、限流、熔断、路径重写等多种高级功能,通过扩展过滤器即可轻松定制网关行为。

总结来说,Spring Cloud Gateway通过灵活的路由规则和可插拔的过滤器机制,实现了对微服务集群中请求的有效管理和高效路由,同时具备强大的可扩展性和良好的性能表现。

4. 负载均衡器

Ribbon

Ribbon是Netflix开源的一个客户端负载均衡器组件,它在Spring Cloud微服务架构中扮演着重要的角色。Ribbon的主要作用是在客户端实现服务调用时的负载均衡,避免单点过载和服务访问不均的问题,提高整个系统的稳定性和可用性。

Ribbon的工作原理主要包括以下几个方面:

  1. 服务发现

    • Ribbon与服务注册中心(例如Eureka)集成,可以从服务注册表中获取到同一服务的多个实例列表。
  2. 负载均衡策略

    • 根据预先配置的负载均衡算法(如轮询、随机、最少连接数、响应时间加权等),Ribbon会选择一个服务实例来处理客户端的请求。
    • 开发者也可以自定义负载均衡策略,只需实现IRule接口。
  3. 客户端直连与透明化负载均衡

    • Ribbon不是通过一个集中式的反向代理来进行负载均衡,而是内置于客户端库中,使客户端直接与服务实例建立连接,这样可以减少网络跳转,提高效率。
    • 使用带有@LoadBalanced注解的RestTemplate或Feign客户端时,Ribbon会自动进行负载均衡,对调用者而言这一过程是透明的。
  4. 重试与故障转移

    • Ribbon还支持重试机制,当请求失败时,可以根据配置尝试调用其他健康的服务实例。
    • 如果某个服务实例出现故障,Ribbon会将其标记为不可用,并在后续请求中避开该实例,实现故障转移。

总结来说,Ribbon在客户端层面实现了服务调用的负载均衡、容错和故障恢复功能,减轻了服务消费者的复杂性,增强了微服务架构的健壮性和弹性。通过灵活的配置和策略,它能够帮助开发者在分布式系统中更好地管理服务之间的交互。

Spring Cloud LoadBalancer

Spring Cloud LoadBalancer 是Spring Cloud生态中用来实现服务间负载均衡的关键组件,旨在提供一种更为现代化、灵活且高效的客户端负载均衡解决方案,尤其针对微服务架构设计。

Spring Cloud LoadBalancer 的核心原理和特点如下:

  1. 客户端负载均衡

    • 类似于Netflix的Ribbon,Spring Cloud LoadBalancer也是在客户端实现负载均衡逻辑,这意味着调用服务的客户端直接参与负载均衡决策,而不是依赖于独立的网络负载均衡器。
  2. 服务发现集成

    • 它与Spring Cloud服务发现组件无缝集成,如Eureka、Consul或Nacos,能实时从服务注册中心获取服务实例列表,以此为基础进行负载均衡。
  3. 负载均衡策略

    • 提供多种内置的负载均衡策略,如轮询(Round Robin)、随机(Random)、最少活跃连接数(LeastConn)等,可以根据实际需求选择或自定义负载均衡算法。
  4. 响应式支持

    • Spring Cloud LoadBalancer与WebFlux框架紧密结合,支持响应式编程模型,非常适合构建异步、非阻塞的服务调用场景,提升系统性能和并发处理能力。
  5. 请求处理流程

    • 当客户端发起请求时,LoadBalancer根据服务名获取到服务实例列表,然后按照选定的负载均衡策略选择一个实例进行调用。
    • 对于HTTP请求,可以与WebClient或装饰过的RestTemplate一起工作,通过@LoadBalanced注解自动完成负载均衡。
  6. 扩展性

    • 允许开发者自定义负载均衡策略和过滤器,以便插入自定义逻辑,比如熔断、限流、认证、日志输出等。

总之,Spring Cloud LoadBalancer是一个轻量级、高度灵活的客户端负载均衡工具,它通过与服务发现组件集成,结合多种负载均衡策略,并支持响应式编程模型,有效地提高了微服务架构中的服务调用稳定性、可靠性和性能。

Spring Cloud LoadBalancer 和 Ribbon 都是用于微服务架构中的客户端负载均衡器,但它们有一些关键的区别:

  1. 起源与维护状态

    • Ribbon 是 Netflix 开源的 Java 客户端负载均衡器,随着 Netflix 对 Spring Cloud Netflix 组件停止维护,Ribbon 在 Spring Cloud 生态中的地位逐渐被 Spring Cloud LoadBalancer 所取代。
    • Spring Cloud LoadBalancer 是 Spring Cloud 团队推出的一个新项目,目的是为了提供长期支持和更好的兼容性,特别是与Spring 5 和 Project Reactor 的响应式编程模型相结合。
  2. 设计哲学与技术支持

    • Ribbon 主要设计用于同步调用,它与 RestTemplate 结合使用,支持 HTTP 和 TCP 负载均衡。
    • Spring Cloud LoadBalancer 则同时支持同步和异步调用,特别是与 WebClient 集成良好,更适合现代的反应式编程风格,这使得它能够在非阻塞的 WebFlux 框架中发挥效用。
  3. 负载均衡策略

    • Ribbon 提供了丰富的负载均衡策略,包括轮询、随机、权重、区域感知、响应时间加权等。
    • Spring Cloud LoadBalancer 也提供了多种负载均衡策略,虽不如 Ribbon 多样,但基础策略基本覆盖,并且允许扩展更多的策略。
  4. 服务发现集成

    • 两者都支持与服务发现组件(如 Eureka、Consul 等)集成,获取服务实例列表并据此做负载均衡。
    • 在 Spring Cloud LoadBalancer 中,这种集成更加紧密,并且考虑到未来的发展趋势和生态兼容性。
  5. 生命周期与更新

    • Ribbon 由于不在 Netflix 的维护计划内,因此对于新版本 Spring Cloud 和 Spring Boot 的兼容性可能会出现问题。
    • Spring Cloud LoadBalancer 作为 Spring Cloud 官方支持的组件,持续得到维护和更新,以保证与 Spring 生态系统的其他组件保持一致。

总结起来,Spring Cloud LoadBalancer 是 Ribbon 的一个进化版和替代品,它不仅继承了 Ribbon 的客户端负载均衡特性,而且改进了对异步编程的支持,强化了与最新 Spring 技术栈的集成,旨在提供一个更加现代、灵活和可持续发展的负载均衡解决方案。

5. 服务调用

OpenFeign

OpenFeign 是一个声明式服务调用的Java客户端,它简化了微服务架构中服务间HTTP API的调用过程。在Spring Cloud环境下,OpenFeign成为一个重要的组件,让开发者能够以编程接口的方式定义服务调用,就像调用本地方法一样方便,无需关注底层HTTP请求的细节。

OpenFeign工作原理概览

  1. 接口定义

    • 使用OpenFeign时,开发者需在接口上添加@FeignClient注解,这个接口的方法对应远程服务的HTTP请求,方法参数和返回值映射到HTTP请求体、路径参数、查询参数或响应体。
  2. 接口代理

    • 在Spring Cloud应用启动时,OpenFeign会扫描带有@FeignClient注解的接口,并通过JDK动态代理生成接口的实现类。这意味着当你通过这个接口调用方法时,实际上是调用了OpenFeign创建的代理对象,这个代理对象会处理实际的HTTP请求。
  3. 请求构造

    • 调用接口方法时,OpenFeign会根据方法上的注解(如@GetMapping, @PostMapping等)以及参数类型和注解,构造出对应的HTTP请求。例如,HTTP方法、请求头、URL路径和查询参数都会从方法签名中提取出来。
  4. 负载均衡与服务发现

    • OpenFeign默认集成了Ribbon客户端负载均衡器(在较新版本中可能已替换成Spring Cloud LoadBalancer),可以与服务注册中心(如Eureka)结合,自动发现服务实例地址,并在多个实例间进行负载均衡。
  5. 熔断与错误处理

    • OpenFeign还可以与Hystrix(或Spring Cloud Circuit Breaker)集成,提供熔断和降级功能,以保护系统免受服务雪崩效应的影响。当远程服务不可用时,可以根据配置快速失败或返回备用结果。
  6. 响应处理

    • 当远程服务响应后,OpenFeign会解析HTTP响应,将其转换成接口方法期望的返回类型,并抛出可能发生的异常。

简而言之,OpenFeign通过注解驱动的声明式编程模型,极大地降低了服务间调用的复杂度,隐藏了HTTP调用的底层实现,促进了服务解耦,并与Spring Cloud生态内的服务发现、负载均衡、熔断等组件深度整合,提升了微服务架构的整体效率和可靠性。

6. 限流、熔断

Hystrix

Hystrix是一款由Netflix开源的容错和延迟容忍库,主要用于微服务架构中,目的是通过服务隔离、熔断、降级、回退等一系列手段,在分布式系统中增强服务之间的容错能力,防止因依赖服务故障而导致的级联失败(雪崩效应)。以下是其核心原理和特点:

  1. 命令模式封装

    • Hystrix使用命令模式将对外部服务的调用封装成HystrixCommand或HystrixObservableCommand对象,这些命令对象负责执行实际操作并处理可能出现的各种异常情况。
  2. 资源隔离

    • 线程池隔离:为每个依赖服务分配独立的线程池,当某个服务的线程池饱和时,新的请求会被迅速拒绝,避免资源耗尽影响整个系统的稳定。
    • 信号量隔离:使用信号量限制并发请求的数量,同样达到防止过度消耗系统资源的目的。
  3. 熔断器(断路器)

    • 当依赖服务连续失败或超时次数达到预设阈值时,熔断器会转为"开路"状态,阻止后续请求直接发送至有问题的服务,改而执行降级策略。
    • 开启熔断后的服务会在一定时间窗口过后尝试"半开"状态,发送一个试探请求以判断服务是否恢复正常,若请求成功则关闭熔断,否则继续保持打开状态。
  4. 服务降级

    • 当服务熔断或资源受限时,Hystrix会触发降级逻辑,即执行预先设定好的fallback方法,返回一个默认值或友好的提示信息,确保服务调用方不至于长时间等待或收到未处理的异常。
  5. 监控与配置实时更新

    • Hystrix提供了近乎实时的监控指标,包括成功率、超时数、拒绝数等,这些统计信息可用于实时调整熔断阈值或其他配置。
    • 可以通过Hystrix Dashboard进行可视化监控,并结合Turbine实现集群范围内的监控数据聚合。
  6. 请求缓存与请求合并

    • Hystrix也支持请求缓存以减少重复请求,以及请求合并以优化对同一服务的批量请求。

Hystrix通过上述机制,有效实现了服务间的隔离和容错管理,增强了分布式系统的鲁棒性和弹性,即使在部分服务不稳定或失败的情况下,也能保障整个系统的整体可用性和性能。

Resilience4j

Resilience4j 是一款专为 Java 8 和函数式编程设计的轻量级容错库,它的主要目标是提供一种简单且模块化的解决方案,用于在微服务架构中实现容错和弹性设计。相比于 Netflix 的 Hystrix,Resilience4j 更加轻量,没有额外的第三方依赖,并且与 Java 8 的函数式编程范式完美契合。

Resilience4j 的核心原理和组件包括:

  1. 断路器(Circuit Breaker)

    • 监控依赖服务的健康状况,如果服务连续失败达到预设阈值,则触发熔断状态,暂时阻止进一步请求以免级联故障。在熔断期间,可以执行降级逻辑,待一段时间后重新尝试请求以检测服务是否已经恢复。
  2. 速率限制器(Rate Limiter)

    • 控制服务调用的速率,防止短时间内过多请求导致资源耗尽,进而保证系统稳定性和服务质量。
  3. 重试(Retry)

    • 当服务调用失败时,按照预设策略自动重试,直到成功或达到最大重试次数,增加了服务调用的成功率。
  4. 舱壁(Bulkhead)

    • 分为SemaphoreBulkhead(信号量舱壁)和FixedThreadPoolBulkhead(固定线程池舱壁)两种模式,前者基于信号量限制并发执行任务的数量,后者通过限制线程池大小来防止资源耗尽。舱壁机制可以确保在面临大量并发请求时,服务的一部分仍能正常运行,不会因某一服务失效而导致整个系统崩溃。
  5. 时间限制器(TimeLimiter)

    • 设置方法调用的最大执行时间,超过时间限制则强制返回或抛出异常,防止因个别任务长时间阻塞导致资源无法释放。
  6. 装饰器模式

    • Resilience4j 通过高阶函数(装饰器)实现对功能接口、lambda 表达式或方法引用的增强,可以在调用前后加入上述的容错策略,使得开发者能够通过组合装饰器来灵活地构建具有弹性的服务调用链。

Resilience4j 通过一系列的容错机制,增强了应用程序对外部服务依赖的鲁棒性,有助于预防雪崩效应、保护系统资源并提高系统的整体可用性和响应速度。同时,其设计遵循函数式编程原则,易于与其他库和框架集成,如与Spring Boot和Spring Cloud的融合使用,为构建稳健的微服务系统提供了有力支持。

7. 分布式事务

Spring Cloud Alibaba Seata

Spring Cloud Alibaba Seata 是一个针对分布式事务处理的解决方案,它源自阿里巴巴开源的分布式事务框架 Seata(Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务架构)。Seata 旨在解决微服务架构中跨服务边界的数据一致性问题,通过提供一个全局事务协调器来管理分布式环境下的事务生命周期。

Spring Cloud Alibaba Seata 工作原理概述

  1. 事务协调者 TC (Transaction Coordinator)

    • TC 负责维护全局事务的状态,并协调各个服务中的分支事务,驱动全局事务的提交或回滚。
  2. 事务管理器 TM (Transaction Manager)

    • TM 通常部署在业务应用中,负责定义全局事务的边界,即开启、提交或回滚全局事务。
  3. 资源管理器 RM (Resource Manager)

    • RM 实际上是对数据库资源的抽象,每个参与到分布式事务的服务节点都有自己的 RM,负责事务的分支注册与状态变更,例如在数据库中执行 SQL 语句前进行事务的开启和提交准备。
  4. AT 模式(Automatic Transaction Mode)

    • Seata 的 AT 模式是最常用的事务模式,它在无侵入的前提下实现分布式事务。在 AT 模式下,Seata 通过代理数据库驱动,对本地事务的 SQL 进行拦截,将原始 SQL 改造为符合两阶段提交协议的事务分支。第一阶段(准备阶段)会先执行 SQL 并冻结数据,产生"before image"和"after image",第二阶段(提交/回滚阶段)根据全局事务的状态决定是提交还是回滚事务分支。
  5. TCC(Try-Confirm-Cancel)模式

    • TCC 模式要求业务方提供两个额外的补偿服务,即"try"、"confirm"和"cancel"。在事务执行过程中,"try"阶段尝试执行业务,预留资源;"confirm"阶段在全局事务提交时确认执行业务;"cancel"阶段在全局事务回滚时撤销之前预留的操作。
  6. Saga 模式

    • Saga 模式是一种长事务解决方案,通过一系列局部事务的有序执行和补偿操作来实现最终一致性。每个 Saga 由一系列子事务组成,每个子事务都是一个可补偿的操作(或逆操作),当某个子事务失败时,Saga 会按照相反的顺序执行前面成功的子事务的逆操作。

通过集成 Spring Cloud Alibaba Seata,开发者可以相对容易地在微服务架构中实现分布式事务,保证服务间的数据一致性。在整个事务过程中,Seata 提供了一种灵活且高可用的分布式事务管理机制,适用于不同的业务场景和数据存储技术。

8. 分布式链路跟踪

Spring Cloud Sleuth

Spring Cloud Sleuth 是一个为基于 Spring Cloud 构建的分布式系统提供分布式追踪解决方案的组件。它借鉴了 Google Dapper 和 Twitter Zipkin 的设计思想,帮助开发者追踪微服务架构中的服务间调用链路,从而便于监控、诊断和优化系统的性能及问题定位。

核心功能与术语

  1. Trace (跟踪) :代表一次完整的业务调用流程,从用户发起请求到所有涉及的微服务完成响应为止的过程,包含了多个 Span。
  2. Span (跨度) :Trace 中的基本工作单元,通常对应一次方法调用或网络请求,每个 Span 具有自己的标识符和开始/结束时间戳,以及与父 Span 的关联关系。

原理

  • 当应用集成 Sleuth 后,它会为每个进入应用的请求创建一个唯一的 Trace ID,并随着请求在各个微服务间的流转,将这个 Trace ID 通过 HTTP 头等方式传递下去。
  • 每个服务内部的每个独立操作会被赋予一个 Span ID,并且记录 Span 与父 Span(即上游服务的 Span)的关系,形成一棵 Span 树。
  • Sleuth 自动为 RestTemplate、FeignClient 等常见通信方式添加拦截器,以确保 Trace 和 Span 信息在微服务之间能够正确地传播。
  • Sleuth 收集的数据可以被发送到 Zipkin 或其他支持的追踪系统进行可视化展示和分析。

使用场景

  • 调用链路可视化:通过收集并汇总各个服务的追踪数据,可以在 Zipkin 中查看完整的服务调用链路图。
  • 性能瓶颈发现:通过统计每个 Span 执行的时间,可以快速识别出服务调用过程中的延迟热点。
  • 错误排查:当系统出现问题时,通过 Trace ID 可以快速定位到错误发生的具体服务及其上下文环境。

配置与自定义

  • 开发者只需在 Spring Boot 应用中引入 Sleuth 的相关依赖,并配置 Zipkin 服务器地址等参数,即可自动启用分布式追踪。
  • Sleuth 提供了高度可定制性,允许开发者自定义 Trace ID 和 Span ID 的生成策略,调整采样率,甚至可以过滤掉不想追踪的特定服务调用路径。
相关推荐
初见0019 小时前
🌱 SpringBoot自动配置:别装了,我知道你的秘密!🤫
spring boot·后端
用户785127814709 小时前
Python代码获取京东商品详情原数据 API 接口(item_get_app)
后端
JAVA数据结构9 小时前
BPMN-Activiti-简单流程委托
后端
sivdead10 小时前
智能体记忆机制详解
人工智能·后端·agent
拉不动的猪10 小时前
图文引用打包时的常见情景解析
前端·javascript·后端
该用户已不存在10 小时前
程序员的噩梦,祖传代码该怎么下手?
前端·后端
间彧10 小时前
Redis缓存穿透、缓存雪崩、缓存击穿详解与代码实现
后端
摸鱼的春哥10 小时前
【编程】是什么编程思想,让老板对小伙怒飙英文?Are you OK?
前端·javascript·后端
Max81211 小时前
Agno Agent 服务端文件上传处理机制
后端
调试人生的显微镜11 小时前
苹果 App 怎么上架?从开发到发布的完整流程与使用 开心上架 跨平台上传
后端