前言
正文
client发送续约心跳
client在构造方法中启动定时调度任务的方法中,启动了定时向server发送心跳的任务:
client调用链路:
-
DiscoveryClient#DiscoveryClient
- DiscoveryClient#heartbeatExecutor
-
DiscoveryClient#initScheduledTasks
-
DiscoveryClient.HeartbeatThread#run
- DiscoveryClient#renew
-
最终调用了com.netflix.discovery.DiscoveryClient#renew方法:
方法中向server端接口发起了一个请求,如果请求返回404的话,需要重新发起注册。
server处理续约请求
server处理的调用链路:
-
com.netflix.eureka.resources.InstanceResource#renewLease
-
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#renew
-
com.netflix.eureka.registry.AbstractInstanceRegistry#renew
- com.netflix.eureka.lease.Lease#renew
-
-
实际的服务续约逻辑,就是更新Lease.lastUpdateTimestamp时间戳。
注意:lastUpdateTimestamp = System.currentTimeMillis() + duration;
lastUpdateTimestamp 被更新成了当前时间 + duration。duration默认值是90s,代表租约持续时间,当租约过久未续租,即当前时间 - lastUpdatedTimestamp
> duration
时,租约过期。
读者有没有觉得很奇怪,为什么更新时间不是当前时间,而是加上了90s ?
其实这是个eureka官方承认的bug,详情将在《服务失效剔除》中讲解。
配置参数
前缀namespace,默认为eureka
客户端心跳间隔时间 (s)
instance.lease-renewal-interval-in-seconds = 30
服务端剔除实例时间
instance.lease-expiration-duration-in-seconds = 90