首页 >> 网络技术 > 服务器技术 >> 详细内容
服务器技术 >> 正文
解决 Eureka Server 不踢出已关停的节点问题的方法
日期:2018/6/8 

Eureka Server 服务启动后,我们注册到 Eureka Server 的服务关闭或停掉的应用,Eureka Server 默认会保留这些节点,并不会把它们立即删除掉。从而达到误删除高可用,但是这样会产生一些其他问题,那么如何让 Eureka Server 踢出已关停的节点呢?本文来告诉你答案。

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. 

首先我们需要明白,Eureka Server 为什么会不踢出已关停的节点。原因是它的自我保护机制。既然知道了原因,那么我们就可以尝试是否可以关闭掉 Eureka Server 的自我保护机制呢?

答案当然是可以的,Eureka Server 提供了一些配置,我们只需要略做配置上的改动即可。

由于Eureka拥有自我保护机制,当其注册表里服务因为网络或其他原因出现故障而关停时,Eureka不会剔除服务注册,而是等待其修复。这是AP的一种实现。 
为了让其有精准的 CP健康检查,可以采取让其剔除不健康节点。

server端:

1
2
eureka.server.enable-self-preservation          (设为false,关闭自我保护主要)
eureka.server.eviction-interval-timer-in-ms     清理间隔(单位毫秒,默认是60*1000)

client端:

1
2
3
eureka.client.healthcheck.enabled = true//开启健康检查(需要spring-boot-starter-actuator依赖)
eureka.instance.lease-renewal-interval-in-seconds =10//租期更新时间间隔(默认30秒)
eureka.instance.lease-expiration-duration-in-seconds =30//租期到期时间(默认90秒

server端配置示例:

1
2
3
4
eureka:
    server:
        enableSelfPreservation: false
        evictionIntervalTimerInMs: 4000

客户端端配置示例:

1
2
3
4
eureka:
    instance:
        leaseRenewalIntervalInSeconds: 10
        leaseExpirationDurationInSeconds: 30

注意:更改Eureka更新频率将打破服务器的自我保护功能。