为什么 Feign 第一次调用耗时很长?
为什么 Feign 第一次调用耗时很长?
回答重点
这个主要是由于 Feign 内置的负载均衡组件 Ribbon 的懒加载机制。
当第一次进行服务调用的时候,Feign 才会触发 Ribbon 的加载流程,然后从服务注册中心拉取服务列表,建立起对应的连接池,这个过程会增加第一次调用的耗时。
解决方案:
- 主动预热:只需要在应用启动的时候进行服务预热,先自动执行一次随便的调用,提前加载 Ribbon 以及其他相关的服务调用组件
- 开启 Ribbon 的饥饿加载
1 | # application.yml 配置 |
配置说明:
ribbon.eager-load.enabled:将其设置为true,表示启用 Ribbon 的饥饿加载机制。ribbon.eager-load.clients:指定需要进行饥饿加载的 Feign 客户端列表,用逗号分隔。这些客户端的 Ribbon 配置和服务实例信息将在应用启动时预先加载。
扩展知识
Ribbon 的客户端缓存机制
- 服务实例缓存:Ribbon 会将从 Eureka 拉取的服务实例列表缓存在客户端,并根据缓存的服务实例列表进行负载均衡。
- 缓存的有效期:默认情况下,Ribbon 会每隔 30 秒刷新一次缓存中的服务实例列表。这意味着在此期间内,客户端获取到的服务实例信息不会变化。通过调整
ribbon.ServerListRefreshInterval的值,可以更频繁或更少地刷新缓存。
Ribbon 的替代方案
Spring Cloud LoadBalancer:
- 简介:Spring Cloud LoadBalancer 是 Spring 官方提供的新一代负载均衡器,旨在替代 Ribbon,提供更加简洁和现代化的配置方式。
- 优点:更加轻量,原生支持响应式编程,适合与 Spring WebFlux 等现代化框架配合使用。
建议在使用 Spring Cloud 2020 版本及之后的项目中,逐步迁移到 Spring Cloud LoadBalancer。
Comments