Eureka Client与Eureka Server之间的心跳机制

1.心跳是从什么时候开始的

在每一个Eureka Client启动的时候,都会有一个HeartbeatThread的心跳线程,这个就是一个后跳线程,保证默认30秒的时候向Eureka Server发送一个信息的请求,告诉Eureka Server当前的Eureka Client还存活着。eureka.instance.lease-renewal-interval-in-seconds,这个参数可以来配置对应的心跳间隔时间。

2.Eureka Server端接收到心跳做了什么操作

Eureka Server在接收到请求之后,肯定是先去自己的注册表中去,找到请求的对应的服务信息,在这个服务信息里面有个Lease的对象,这个里面就是可以进行心跳续约操作的,更新Lease对象里面的LastUpdateTimestamp时间戳,每一次接收到都会更新这个时间戳的。

3.Eureka Server在什么情况下会摘除Eureka Client的信息

有了心跳,也有了接受,那么怎么来判断在什么情况下,Eureka Server在什么情况下才会摘除对应没有心跳的Eureka Client的呢?

Eureka Server在启动的时候启动的时候会每60秒遍历一次注册表中的信息,然后查看注册表中的信息是否有过期的,如果过期会加入到一个列表里面单独处理。

eureka.server.evictionIntervalTimerInMs可以配置心跳检测的时间间隔,单位是毫秒。那么接下来就是多长时间没有心跳才会剔除这个服务呢?默认情况下,如果90秒还没有更新对应的LastUpdateTimestamp就表示这个服务可能故障了,我们需要给他做摘除的操作了。如果有看过源码的话,肯定有人会奇怪一点。

public void renew() {   lastUpdateTimestamp = System.currentTimeMillis() + duration; }

续约的时候是上面的代码,更新的时间戳。

public boolean isExpired(long additionalLeaseMs) {
   return (evictionTimestamp > 0 || System.currentTimeMillis() > (lastUpdateTimestamp + duration + additionalLeaseMs));
}

这个是来判断是否过期的,这个里面还有一个duration,大家是不是很奇怪这个duration到底是什么?这个就是90秒过期的配置,这个参数可以通过eureka.instance.lease-expiration-duration-in-seconds来配置。

看完这些你还觉得是90秒才会过期么?这样看来最少应该是180秒才会摘除对应的服务,那么有的人还会问,additionalLeaseMs是什么?additionalLeaseMs只是用来容错的,正常情况下为0。

这个地方就是Eureka给自己留的bug,在以后有人问起来,你知道这个地方,别人就知道你肯定是看过源码,知道这个地方的,所以这个地方大家还是需要记录一下的。

4.摘除的时候是怎么摘除的

我在上面说了,每次摘除的时候会添加到一次Queue里面,那么在这个Queue里面是怎么操作的呢?

其实很简单,在这个Queue里面为每个服务调用对应的下线的接口就好了,下线的接口里面在更新对应的注册表的信息和对应缓存的信息,然后同步给其他Eureka Server。

5.如果网络故障,会不会一次性全部摘除服务

Eureka Server有一个自我保护机制,如果开启,每次最多只能摘除15%的服务实例,正常情况向下在线上的情况是不能开启的,eureka.server.enable-self-preservation设为false的情况下是关闭自我保护机制的。

 

 

 

上一篇:CMTimeRange start 不要单独去改变 start 而是从新赋值给 CMTimeRange


下一篇:Tensorflow深度学习笔记5 经典卷积神经网络--Alexnet