微服务负载均衡

一、负载均衡基本原理与应用

在这里插入图片描述

二、Spring Cloud LoadBalancer实现原理

核心组件
  • LoadBalancerInterceptor:
    • 作用:拦截 RestTemplate 请求,实现客户端负载均衡。
    • 初始化:由 LoadBalancerAutoConfiguration 自动配置并绑定到 RestTemplate进行。
    • 拦截逻辑:
      • 检查请求 URI 是否为服务名(如 http://service-name)。
      • 通过 LoadBalancerClient 选择实例并重构 URI。
  • LoadBalancerClient:
    • 作用:封装负载均衡逻辑,负责重构 URL 并执行请求。
      • 实现类:
        • BlockingLoadBalancerClient:同步请求的负载均衡客户端(默认)。
        • ReactorLoadBalancerClient:响应式请求的负载均衡客户端。
  • ReactiveLoadBalancer:
    • 作用:定义负载均衡的抽象接口,负责选择服务实例。
    • 实现类:
      • RoundRobinLoadBalancer:轮询策略。
      • RandomLoadBalancer:随机策略。
      • ReactorServiceInstanceLoadBalancer:服务实例的负载均衡接口,支持自定义策略。
  • ServiceInstanceListSupplier:
    • 作用:提供服务实例列表,通常是通过服务发现组件(如 Eureka、Nacos)获取。
    • 默认实现:DiscoveryClientServiceInstanceListSupplier,从注册中心动态获取服务实例。
    • 生命周期管理:通过 refreshInterval 配置定期刷新实例列表。
工作流程
初始化阶段:
  • 自动配置:Spring Boot 启动时加载 LoadBalancerAutoConfiguration,创建
    LoadBalancerInterceptor 和
    LoadBalancerClientFactory。LoadBalancerInterceptor 被注入到 RestTemplate
    的拦截器链中。
  • 服务发现集成:ServiceInstanceListSupplier 从注册中心(如
    Eureka、Nacos)获取服务实例列表,并缓存到本地,并通过 DiscoveryClient 动态监听服务实例的变化(如实例上线 /
    下线)。
  • 负载均衡策略初始化:默认使用 RoundRobinLoadBalancer,可通过配置切换为 RandomLoadBalancer
    或自定义策略。
请求处理阶段:
  • 拦截请求:LoadBalancerInterceptor 拦截 RestTemplate 的请求,检查 URI 是否为服务名(如
    http://service-name)。如果是服务名,则调用 LoadBalancerClient 进行负载均衡。
  • 选择服务实例:LoadBalancerClient 调用负载均衡器 ReactiveLoadBalancer 的 choose
    方法选择服务实例。负载均衡器 ReactiveLoadBalancer
    的具体负载均衡策略实现有轮询(RoundRobinLoadBalancer)、随机(RandomLoadBalancer)等。实际上,ReactiveLoadBalancer
    内部会基于服务实例列表提供者 ServiceInstanceListSupplier 去获取所有可用服务实例列表,比如
    DiscoveryClientServiceInstanceListSupplier 会通过服务发现( eureka
    等)获取服务实例列表。
  • 执行服务请求:获取到服务实例后,就可以将服务名替换为实际的 IP 和端口,然后通过 HTTP 发送请求到目标服务实例。
故障处理与重试:

失败重试:如果请求失败(如超时、5xx 错误),可配置重试策略,选择另一个实例重新尝试。
健康检查:结合服务发现组件的健康检查机制,确保只选择健康的实例。
在这里插入图片描述
Spring Cloud LoadBalancer属于官方开源客户端负载均衡器,底层也是基于RestTemplate拦截器(ClientHttpRequestInterceptor)扩展实现,实现原理与Ribbon相似,区别在于LoadBalancerClient和上下文构建实现有所区别。
在这里插入图片描述

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐