服务续约:
服务会定时向注册中心发送心跳证明自己的存活,注册中心在一定时间内收到服务“UP”的心跳就会将服务进行自动续约。
心跳请求通常包含地址urlPath:apps/${appName}(配置的服务名称)/${serverId}(IP+appName+port拼装而成的唯一id)
apps/EUREKA-CLIENT/192.168.1.101:eureka-client:30000
心跳请求的参数包含:status(UP、DOWN、STARTING、OUT_OF_SERVICE、UNKNOWN),lastDirtyTimeStamp(最后一次同步时间,若不一致则可能存在未同步的脏数据)等。
在客户端服务的配置文件中配置服务的心跳间隔时间与心跳超时时间:
# 每隔5秒钟,向服务器发送一次续约 eureka.instance.lease-renewal-interval-in-seconds=10 # 30秒续约超时时间 eureka.instance.lease-expiration-duration-in-seconds=30
服务剔除
注册中心会启动一个定时任务并通过eviction方法找出过期超时的服务,如果注册中心未开启自保,则过期与超时的服务会被剔除下线。
# 设置剔除任务的时间间隔,默认60秒 eureka.server.eviction-interval-timer-in-ms=30000
服务自保
当出现突发性网络波动时,可能会出现大批量服务超时而无法续约,但服务本身仍然可使用,为避免因此需要大量重新注册而造成的业务停滞,注册中心默认开启了服务自保。
注册中心设置了一个系数,默认0.85,即当有且只有100台服务全部心跳超时时,85%的服务会触发服务自保,不会被服务剔除,其余的服务则会正常剔除。
而当服务的总个数比较少的时候(比如1个2个),当出现个别服务超时时,续约成功的服务与总的服务数量的比值总会小于85%的阈值,这时所有的服务都会触发服务自保,不会被剔除。这时我们可以在注册中心发现这样一个警告:

我们可以在注册中心的配置文件中强制关闭服务自保:
eureka.server.enable-self-preservation=false