前言
工作中使用 OpenFeign
进行跨服务调用,最近发现线上经常会遇到请求失败。
java.net.ConnectException: Connection refused: connect
复制代码
通过排查我们发现不是接口超时,而是有时候会请求到已经下线的服务导致报错。这多发生在服务提供者系统部署的时候,因为系统部署的时候会调用 Spring
容器 的 shutdown()
方法, Eureka Server
那里能够及时的剔除下线服务,但是我们上一篇文章中已经知道 readOnlyCacheMap
和 readWriteCacheMap
同步间隔是 30S
,Client
端拉取实例信息的间隔也是 30S
,这就导致 Eureka Client
端存储的实例信息数据在一个临界时间范围内都是脏数据。
调整 Eureka 参数
既然由于 Eureka
本身的设计导致会存在服务实例信息延迟更新,那么我们尝试去修改几个参数来降低延迟
- Client 端设置服务拉取间隔3S,
eureka.client.registry-fetch-interval-seconds = 3
- Server 端设置读写缓存同步间隔 3S,
eureka.server.response-cache-update-interval-ms=3000
这样设置之后经过一段时间的观察发现情况有所改善,但还是存在这个问题,而且并没有改善多少。
LoadBalancer 如何获取实例信息
在 Eureka
和 OpenFeign
的文章中都有提到,OpenFeign
进行远程调用的时候会通过负载均衡器选取一个实例发起 Http
请求。我们 SpringCloud
版本是 2020
,已经移除了 ribbon
,使用的是 LoadBalancer
。文章来源:https://www.toymoban.com/news/detail-421129.html
通过 debug OpenFeign
调用的源码发现它是从 DiscoveryClientServiceInstanceListSupplier
的构造方法获取实例信息集合 List<ServiceInstance>
的,内部调用到 CachingServiceInstanceListSupplier
构造方法,重点看 CacheFlux.lookup()
文章来源地址https://www.toymoban.com/news/detail-421129.html
public CachingServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, CacheManager cacheManager) {
super(delegate);
this.serviceInstances = CacheFlux.lookup(key -> {
// TODO: configurable cache name
Cache cache = cacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
if (cache ==
到了这里,关于SpringCloud LoadBalancer 新一代负载均衡器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!