开发过程中,Eukeka服务端和客户端配置我们一般使用默认配置,但经常发现有些已经停止的服务没有从注册中心删除或很久才删除,关键在于Eureka心跳检测和自我保护机制。客户端按固定周期(lease-renewal-interval-in-seconds)向服务端发送心跳请求,服务端按固定周期(eviction-interval-timer-in-ms)开启EvictionTask任务,在允许租约过期(Eureka在自我保护状态中是不允许租约过期的)的情况下,扫描注册的服务,若发现有租约过期则删除租约(即删除服务注册)。

客户端的心跳检测参数:

eureka.instance.lease-renewal-interval-in-seconds: 5                      # 心跳检测间隔时间,默认30
eureka.instance.lease-expiration-duration-in-seconds: 8                # 过期时间,必须大于心跳间隔时间,默认90

服务端的服务租约检测:

eureka.server.enable-self-preservation = false # 是否开启自我保护机制,默认true
eureka.server.eviction-interval-timer-in-ms = 10000 # 剔除无效服务间隔时间,单位毫秒,默认1分钟

服务端判断租约是否过期方式为 当前时间>最后一次心跳时间+过期时间(lease-expiration-duration-in-seconds),代码如下:

上面代码,duration就是客户端定义的过期时间,additionalLeaseMs可以当做0

 

若使用默认配置,从服务关闭到从Eureka注册中心删除该服务,最多需要(90+60)秒

posted on 2019-12-31 16:32  玄同太子  阅读(307)  评论(0编辑  收藏  举报