Eureka 参数调优问题(注册延迟、缓存等)

1、说明

 
1、 本篇博文建议参考 《SpringCloud 服务注册和发现 Eureka组件》 阅读
 
2、本文主要讲解了以下两个调优的案例 :

  • Eureka-client服务已经下线了,但是Eureka-Server接口返回的信息还是会存在。
  • 新服务上线了,Eureka-Client服务不能及时获取到。

 

2、案例一

 

2.1 问题描述

 
问题:Eureka-client服务已经下线了,但是Eureka-Server接口返回的信息还是会存在。
 

2.2 原因与解决

 
Eureka-Server中的 注册列表(registry)会存留过期的实例。具体原因来自以下几个方面:

  • 1、Eureka_Client应用实例异常挂掉了,但是没有能在挂掉前告知Eureka-Server服务,所以Eureka-Server服务没有下线挂掉的Eureka-Client服务实例信息。解决该问题可以依赖Eureka-Server 的 EvictionTask 去剔除已下线的Eureka-client服务实例信息。
     
    解决方案:
     
           可以在Eureka-Server服务中调整EvictionTask的调度频率,比如将调度间隔从默认的60秒,调整为5秒,即添加以下配置:
eureka:
  server:
     eviction-interval-timer-in-ms: 5000 

 

  • 2.Eureka-Client应用实例下线时告知Eureka-Server了,但是 Eureka-Server 的 REST API 有 response cache 缓存,所以需要等待缓存过期后才能更新。
     
    解决方案:
     
    可以根据情况考虑在Eureka-Server服务中关闭readOnlyCacheMap,即修改或添加以下配置:
eureka:
    server:
         use-read-only-response-cache: false

       或者调整 readWriteCacheMap 的过期时间,即修改或添加以下配置:

eureka:
   server:
     response-cache-auto-expiration-in-seconds: 60

 

  • 3.Eureka-Server 服务由于开启了Self Preservation 模式(自我保护模式),导致注册列表(registry)的信息不会因为过期而被剔除,直到退出自我保护模式(Self Preservation)。

解决方案:
 
       在测试环境中可在Eureka-Server服务中关闭自我保护模式,即修改或添加以下配置:

eureka:
   server:
      enable-self-preservation: false

eureka:
   server:
      enableSelfPreservation: false

       在生产环境下可以在Eureka-Server服务中把leaseRenewalIntervalInSeconds 和 renewal-percent-threshold 参数调小,从而提高触发自我保护机制的门槛,即修改或添加以下配置:

eureka:
  server:
      renewal-percent-threshold: 0.49  ## 指定每分钟需要收到的续约次数的阀值,默认值为0.85  

       以及

eureka:
   instance:
     leaseRenewalIntervalInSeconds: 10  # 默认值为30 

 

3、案例二

 

3.1 问题描述

 
问题:新服务上线了,Eureka-Client服务不能及时获取到。
 

3.2 原因与解决

 

  • 原因1:Eureka Client注册延迟
           Eureka Client启动后,不是立即向Eureka Server注册的,而是有一个延迟向服务端注册的时间。通过跟踪源码,可以发现默认的延迟时间为40秒,源码在eureka-client-1.6.2jar的DefaultEurekaClientConfig类中。

    解决方案:
     
            将实例信息变更同步到 Eureka Server的初始延迟时间,从默认的40秒修改到10秒,即修改或添加以下配置:
     

eureka:
   client:
     ## InstanceInfoReplicator 将实例信息变更同步到 Eureka Server的初始延迟时间 ,默认为40秒
     initial-instance-info-replication-interval-seconds: 10

 

  • 原因2: Eureka Client缓存
           Eureka Client保留注册表信息的缓存。该缓存每30秒更新一次。故Eureka Client刷新本地缓存并发现其他新注册的实例可能需要30秒。
     
    解决方案:
     
           在测试环境下,可以在Eureka-Client服务中适当提高 Eureka-Client端拉取 Server注册信息的频率,比如将默认频率由30秒改为5秒,即修改或添加以下配置:
eureka:
  client:
    registry-fetch-interval-seconds: 5

       

4、补充说明

 
       除以上问题外,本人还遇到了另一个问题。即前端请求后端接口,通过gateway网关调用具体业务服务器时,比如登录时调用 users 服务,经常会在网关层面走熔断机制。于是对配置文件做了如下调整:
 
具体的业务服务(如 users 服务),添加或修改以下配置 :

eureka:
   client:
      ## http 连接超时时间,默认为5秒,这里设置为30秒
      eureka-server-connect-timeout-seconds: 30

网关服务( gateway),添加或修改以下配置 :

##    eureka 服务注册中心配置
eureka:
   client:
      ## InstanceInfoReplicator 将实例信息变更同步到 Eureka Server的初始延迟时间 ,默认为40秒
      initial-instance-info-replication-interval-seconds: 10
   server:
      ## 连接超时时间,节点之间连接超时时长(ms) 默认 200
      peer-node-connect-timeout-ms: 5000

## 设置hystrix超时时间(毫秒) ,默认只有2秒,设置为30秒
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

 
 
以上是本人在试点微服务时,测试阶段遇到的诸多问题,和一点薄见,欢迎各位大牛批评指正
 
 
 
 
 
.

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值