第二章 微服务负载均衡
·
微服务负载均衡
一、负载均衡基本原理与应用

二、Spring Cloud LoadBalancer实现原理
核心组件
LoadBalancerInterceptor:- 作用:拦截
RestTemplate请求,实现客户端负载均衡。 - 初始化:由
LoadBalancerAutoConfiguration自动配置并绑定到 RestTemplate进行。 - 拦截逻辑:
- 检查请求 URI 是否为服务名(如 http://service-name)。
- 通过
LoadBalancerClient选择实例并重构 URI。
- 作用:拦截
LoadBalancerClient:- 作用:封装负载均衡逻辑,负责重构 URL 并执行请求。
- 实现类:
BlockingLoadBalancerClient:同步请求的负载均衡客户端(默认)。ReactorLoadBalancerClient:响应式请求的负载均衡客户端。
- 实现类:
- 作用:封装负载均衡逻辑,负责重构 URL 并执行请求。
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和上下文构建实现有所区别。

更多推荐



所有评论(0)