• SpringCloud LoadBalancer 新一代负载均衡器


    前言

    工作中使用 OpenFeign 进行跨服务调用,最近发现线上经常会遇到请求失败。

    java.net.ConnectException: Connection refused: connect
    复制代码
    
    • 1
    • 2

    通过排查我们发现不是接口超时,而是有时候会请求到已经下线的服务导致报错。这多发生在服务提供者系统部署的时候,因为系统部署的时候会调用 Spring 容器 的 shutdown() 方法, Eureka Server 那里能够及时的剔除下线服务,但是我们上一篇文章中已经知道 readOnlyCacheMapreadWriteCacheMap 同步间隔是 30SClient 端拉取实例信息的间隔也是 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 如何获取实例信息

    EurekaOpenFeign 的文章中都有提到,OpenFeign 进行远程调用的时候会通过负载均衡器选取一个实例发起 Http 请求。我们 SpringCloud 版本是 2020,已经移除了 ribbon,使用的是 LoadBalancer

    通过 debug OpenFeign 调用的源码发现它是从 DiscoveryClientServiceInstanceListSupplier的构造方法获取实例信息集合 List 的,内部调用到 CachingServiceInstanceListSupplier 构造方法,重点看 CacheFlux.lookup()

    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 ==
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    C语言入门 Day_15 while循坏
    【SLAM论文阅读笔记】Multi-modal Semantic SLAM for Complex Dynamic Environments
    2022“杭电杯” 中国大学生算法设计超级联赛(8)5 7题解
    技术学习:Python(16)|lxml模块和Xpath(爬虫篇)
    python requests ssl
    ssm整合shiro
    前端学习--React(1)
    Ant-design中表单多级对象做嵌套表单校验
    openfeign客户端调用远程服务端接口,传递参数为null及服务端接口返回值为null的情况
    类和对象6:相关内置函数
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127700387