开发过程中,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)秒