06、Eureka源码系列-服务续约

前言

正文

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