概述
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的情况下是关闭自我保护机制的。
最后
以上就是小巧小熊猫为你收集整理的Eureka心跳机制1.心跳是从什么时候开始的2.Eureka Server端接收到心跳做了什么操作3.Eureka Server在什么情况下会摘除Eureka Client的信息4.摘除的时候是怎么摘除的5.如果网络故障,会不会一次性全部摘除服务的全部内容,希望文章能够帮你解决Eureka心跳机制1.心跳是从什么时候开始的2.Eureka Server端接收到心跳做了什么操作3.Eureka Server在什么情况下会摘除Eureka Client的信息4.摘除的时候是怎么摘除的5.如果网络故障,会不会一次性全部摘除服务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复