Eureka工作流程图
注册
-
Eureka在应用启动时,会在EurekaAutoServiceRegistration这个类初始化的时候,主动去Eureka Server端注册。
-
Eureka在启动完成之后会启动一个40秒执行一次的定时任务,该任务会去监测自身的 IP信息以及自身的配置信息是否发生改变,如果发生改变,则会重新发起注册,详情可见:深入理解lastDirtyTimestamp
-
续约返回404状态码时,会去重新注册
详情可见: 深入理解Eureka 服务注册(二)
下线
Eureka会在spring容器销毁的时候执行shutDown方法 , 该方法首先会将自身的状态改为 DOWN,接着发送cancle命令至
Eureka Server请求下掉自己的服务。
详情可见:
心跳
Eureka在系统启动后,会创建一个每30秒执行一次的定时任务。用来发送心跳, 也就是说心跳是30秒一次,用来告知
服务端我还活着
详情可见:
过期
Eureka 过期时间默认是90秒, 这个配置客户端可以自定义,如果客户端配置了,则以客户端的为准。
Eureka Server在启动完成之后,会初始化一个清理过期实例的线程,每60秒执行一次。
详情可见:
自我保护机制Eureka Server维护了两个变量:
expectedNumberOfRenewsPerMin :每分钟最大的续约数量,由于客户端是每30秒续约一次,一分钟就是续约2次, count代表的是客户端数量
所以这个变量的计算公式 : 客户端数量*2
numberOfRenewsPerMinThreshold : 每分钟最小续约数量, 使用expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold()。
serverConfig.getRenewalPercentThreshold()的默认值为0.85 , 也就是说每分钟的续约数量要大于85% 。
如果每分钟的续约数小于numberOfRenewsPerMinThreshold ,则自我保护机制开启,Eureka Server将不会主动清除过期实例
详情可见:
EurekaClient获取实例信息
-
Eureka Client 在刚刚启动的时候,会主动全量获取一次实例信息。
-
启动一个每30秒执行一次的定时任务,用来从服务端获取注册信息,这个时候一般是增量获取。当然有特殊情况也会全量获取
详情可见:
集群同步
Eureka Server 收到来自客户端的 注册,下线,心跳等操作时,会将操作同步给相邻的集群节点
-
同步操作采用异步的方式,Eureka Server构建同步信息的任务,放入线程池,供线程异步来跑,默认是批量同步,即线程会一次性从队列里面取走所有数据进行同步, 如果相邻Eureka Server Node不可用,会进行重试,超出过期时间,则该同步任务放弃。过期时间默认为30秒
-
通过HTTP的方式发送请求给其他Eureka Server,比如:register, Eureka Server收到其他节点的批量同步注册请求,会调用本地的register方法,跟客户端注册走的流程一直,只不过方法参数isReplication = true如此,带有isReplication = true是不会继续同步给其他节点的,避免了循环同步流程图如下: