
03 · LoadBalancer 负载均衡一句话定位Spring Cloud LoadBalancer 从服务的多个实例中选一个调用是 Feign/RestTemplate 调用的底层。1. 什么是客户端负载均衡服务 order-service 有 3 个实例3 个 Pod/进程 调用方从注册中心拿到这 3 个实例地址 → 自己按策略选一个调用客户端负载均衡 vs 服务端负载均衡Nginx/LB 客户端负载均衡调用方自己选LoadBalancer在消费者端 服务端负载均衡请求先到 LBLB 再转发如 NginxSpring Cloud LoadBalancerSLB 取代了已停更的 Ribbon Feign 和 LoadBalanced RestTemplate 底层都用它2. 工作流程Feign/RestTemplate 发起调用用服务名 → LoadBalancer 拦截 → 从服务发现Nacos拿到服务的所有实例 → 按负载均衡策略选一个实例 → 把服务名替换成实例的真实 IP:端口 → 发起真实 HTTP 请求3. LoadBalancedRestTemplate 用BeanLoadBalanced// ★开启负载均衡能识别服务名publicRestTemplaterestTemplate(){returnnewRestTemplate();}// 用服务名调用不是 IPStringresultrestTemplate.getForObject(http://order-service/order/1,String.class);// LoadBalancer 把 order-service 解析成某个实例的 IP:端口Feign 默认就集成了 LoadBalancer无需额外配置。4. 内置负载均衡策略Spring Cloud LoadBalancer 内置两种 ① RoundRobinLoadBalancer轮询默认依次选每个实例 ② RandomLoadBalancer随机随机选一个5. 自定义负载均衡策略// 定义策略配置类不加 ConfigurationpublicclassCustomLoadBalancerConfig{BeanpublicReactorLoadBalancerServiceInstancerandomLoadBalancer(Environmentenvironment,LoadBalancerClientFactoryfactory){Stringnameenvironment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);returnnewRandomLoadBalancer(factory.getLazyProvider(name,ServiceInstanceListSupplier.class),name);}}// 对指定服务启用自定义策略ConfigurationLoadBalancerClient(valueorder-service,configurationCustomLoadBalancerConfig.class)publicclassLoadBalancerConfig{}// 全局启用LoadBalancerClients(defaultConfigurationCustomLoadBalancerConfig.class)6. 实例过滤与元数据路由// ServiceInstanceListSupplier 可定制实例列表过滤、按元数据选// 例同机房优先、版本路由灰度// Nacos 实例带元数据version、zone// 可自定义 Supplier 只选 versionv2 的实例灰度// 或同 zone 优先降低跨机房延迟# 开启基于区域/元数据的负载均衡spring:cloud:loadbalancer:configurations:zone-preference# 同区域优先7. 健康检查与实例缓存spring:cloud:loadbalancer:# 实例列表缓存减少每次都查注册中心cache:enabled:truettl:35s# 缓存过期时间capacity:256# 只选健康实例health-check:interval:25s实例缓存 LoadBalancer 缓存服务实例列表默认 35s → 减少频繁查注册中心 ⚠️ 实例下线后缓存未过期可能还选到它 → 配合重试容错8. 负载均衡 重试spring:cloud:loadbalancer:retry:enabled:true# 开启重试max-retries-on-same-service-instance:1# 同实例重试次数max-retries-on-next-service-instance:2# 换实例重试次数retry-on-all-operations:false# 默认只重试 GET重试策略 同实例重试 → 换下一个实例重试 ⚠️ 只对幂等操作GET重试POST 慎重可能重复提交9. 坑与最佳实践✅ Feign 自动集成 LoadBalancerRestTemplate 要加LoadBalanced。✅ 默认轮询够用特殊需求灰度/就近才自定义策略。✅ 用元数据做版本路由灰度、同区域优先降延迟。⚠️ 实例列表有缓存默认 35s下线实例可能短暂还被选 → 配重试。⚠️ 重试只对幂等操作GETPOST/写操作慎重防重复。✅ 开健康检查只选健康实例。⚠️ 自定义策略配置类别加 Configuration同 Feign 局部配置坑。 LoadBalancer 客户端负载均衡从多实例选一个Feign 底层。10. 本篇小结Spring Cloud LoadBalancer 做客户端负载均衡取代 RibbonFeign 底层用它。RestTemplate 加 LoadBalanced 才能用服务名Feign 自动集成。内置轮询默认、随机可自定义策略灰度、就近。实例列表有缓存默认 35s配合重试容错。重试只对幂等操作开健康检查选健康实例。