在微服务架构中,Feign 用于远程调用,其背后依赖 Ribbon 实现负载均衡。服务通过注册中心(如 Nacos 或 Eureka)注册后,Ribbon 会获取服务列表并缓存到本地,FeignClient 再基于这些信息进行调用。
Ribbon负载均衡机制
Ribbon 通过 LoadBalancer 组件处理负载均衡,核心接口 ILoadBalancer 提供以下功能:添加新服务、选择服务实例、标记服务下线、获取服务列表、筛选健康服务等。
ZoneAwareLoadBalancer 实现
默认负载均衡器 ZoneAwareLoadBalancer 继承自 DynamicServerListLoadBalancer,在初始化过程中会执行 restOfInit 方法,其中 enableAndInitLearnNewServersFeature 和 updateListOfServers 是关键环节。enableAndInitLearnNewServersFeature 通过 ServerListUpdater 启动定时任务,以线程方式动态拉取服务列表。
负载均衡策略
Ribbon 支持多种负载策略:
- RoundRobinRule:轮询调用
- WeightedResponseTimeRule:响应时间权重优选
- RandomRule:随机选择
- BestAvailableRule:最小连接数优先
- RetryRule:失效服务重试
- AvailabilityFilteringRule:过滤非健康实例
- ZoneAvoidanceRule:区域敏感路由
饥饿加载模式原理
Ribbon 默认在首次调用时创建 Client 实例,导致第一次 HTTP 请求需叠加客户端初始化时间,从而响应延迟。通过以下测试代码可见端倪:
@GetMapping("/requestSystem2Api")
public String requestSystem2Api(){
long startTime = System.currentTimeMillis();
R<String> stringR = iTestServiceClient.testRequestMethod();
if (null != stringR){
log.info("接口返回:"+stringR.getMsg());
}
long needTime = System.currentTimeMillis() - startTime;
log.info("接口调用需要的时间:"+needTime);
return "";
}
日志显示首次调用会触发 DynamicServerListLoadBalancer 的初始化流程,后续请求则直接使用缓存实例。
启用饥饿加载配置
在 微服务配置 中增加以下设置:
ribbon:
nacos:
enabled: true
eager-load:
enabled: true
clients: Lxlxxx-system2
ReadTimeout: 10000
ConnectTimeout: 10000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
OkToRetryOnAllOperations: false
启动时可见 Lxlxxx-system2 服务被预加载,有效避免首次调用超时。
总结
饥饿加载本质是客户端负载预热机制,特别适用于调用链复杂或数据处理耗时的 微服务场景,通过预初始化客户端实例显著提升首次调用性能。
|