找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

241

积分

1

好友

23

主题
发表于 前天 02:28 | 查看: 8| 回复: 0

在微服务架构中,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 服务被预加载,有效避免首次调用超时。

总结

饥饿加载本质是客户端负载预热机制,特别适用于调用链复杂或数据处理耗时的 微服务场景,通过预初始化客户端实例显著提升首次调用性能。

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 14:57 , Processed in 0.061896 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表