Eureka 的 InstanceInfoReplicator 类(服务注册辅助工具)
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
关于服务注册
以下图片来自Netflix官方,图中显示 Eureka Client 会向注册中心发起 Get Registry 请求来获取服务列表:
以 Spring Cloud 的 Edgware.RELEASE 版本为例,Eureka client 的注册动作是在 com.netflix.discovery.DiscoveryClient 类的 initScheduledTasks 方法中执行的,相关代码片段如下所示,请注意中文注释:
上述代码表明,将自身信息上报到 Eureka server 的工作是通过调用 instanceInfoReplicator 的 api 完成的;
InstanceInfoReplicator 的作用
先看 InstanceInfoReplicator 源码的注释:
我的理解:
InstanceInfoReplicator 是个任务类,负责将自身的信息周期性的上报到 Eureka server;
有两个场景触发上报:周期性任务、服务状态变化(onDemandUpdate 被调用),因此,在同一时刻有可能有两个上报的任务同时出现;
单线程执行上报的操作,如果有多个上报任务,也能确保是串行的;
有频率限制,通过 burstSize 参数来控制;
先创建的任务总是先执行,但是 onDemandUpdate 方法中创建的任务会将周期性任务给丢弃掉;
源码分析
以前面对注释的理解作为主线,去看源码:
先看构造方法,如下,中文注释位置需要注意:
从以上代码可见,构造方法中准备好了线程池和频率限制工具,再算好了每分钟允许的任务数;
在 com.netflix.discovery.DiscoveryClient 类的 initScheduledTasks 方法中,通过调用 instanceInfoReplicator.start 方法启动了周期性任务,现在来看此方法:
延时时间到达时,会执行 run 方法:
以上代码汇总起来,就完成了周期性任务的逻辑,接下来看看被外部调用的 onDemandUpdate 方法:
如上述代码所示,可见之前注释中提到的功能都已实现;
至此,InstanceInfoReplicator 已分析完毕,可见这是个功能强大的辅助类,在应用信息上报到 Eureka server 时发挥了重要的作用,业务逻辑可以放心的提交上报请求,并发、频率超限等情况都被 InstanceInfoReplicator 处理好了;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/61d335c7df0bd4736dfecc987】。文章转载请联系作者。
评论