当 lb://service-provider 或 Feign 通过服务名发起调用时,总要有人回答一个问题:这个服务当前有多个实例,这次选哪一个?在这套项目里,答案由
Spring Cloud LoadBalancer 给出。
一、作为调用链的一环引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-consumer/pom.xml
Consumer 和 Gateway 都引入 LoadBalancer。Gateway 根据路由转发,Feign 根据服务名调用,两者最终都需要客户端侧选择实例。
二、客户端负载均衡的含义
它不是一台独立的中转机器,而是嵌在调用方进程里的选择逻辑。调用方从 Nacos 拿到实例列表,再按负载均衡策略选一个实例发起连接。
这带来两个特点:
- 少一跳集中式转发组件。
- 调用方需要维护实例缓存和选择策略。
三、实例列表需要缓存
服务实例列表来自注册中心,但每次调用都实时拉取会把 Nacos 打成热点。项目为 LoadBalancer 引入 Caffeine 缓存,在“实例感知及时性”和“调用性能”之间取平衡。
四、避坑点
- 服务下线后,客户端可能短时间内仍拿到旧实例,要结合重试和超时处理。
- 实例数很少时,负载均衡效果天然有限。
- 本地调试多实例时,先确认端口和注册元数据。
- Gateway 里的
lb://和 Feign 里的服务名都依赖服务发现健康数据。
五、经验总结
LoadBalancer 是服务发现和真实请求之间的桥。它不显眼,但决定了服务名调用能否稳定落到一个具体实例上。