Spring Cloud 源码分析之 Eureka 篇第七章:续约
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
在文章《Spring Cloud源码分析之Eureka篇第四章:服务注册是如何发起的 》的分析中,我们知道了作为 Eureka Client 的应用启动时,在 com.netflix.discovery.DiscoveryClient 类的 initScheduledTasks 方法中,会做以下几件事:
周期性更新服务列表;
周期性服务续约;
服务注册逻辑;
本章学习的是周期性服务续约的相关代码,对应用如何将自身信息注册到 Eureka 进行深入了解
概览
以下图片来自 Netflix 官方,图中显示 Eureka Client 会发起 Renew 向注册中心做周期性续约,这样其他 Eureka client 通过 Get Registry 请求就能获取到新注册应用的相关信息:
关于源码版本
本次分析的 Spring Cloud 版本为 Edgware.RELEASE,对应的 eureka-client 版本为 1.7.0;
来自官方文档的指导信息
最准确的说明信息来自 Netflix 的官方文档,地址:https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication#renew
学习源码之前先看文档可以确定大方向,不会因为陷入源码细节导致偏离学习目标,如下图所示:
我的理解:
Eureka client 每隔三十秒发送一次心跳到 Eureka server,这就是续约;
Eureka client 续约的目的是告诉 Eureka server 自己还活着;
Eureka server 若 90 秒内未收到心跳,就从自己的服务列表中剔除该 Eureka client;
建议不要改变心跳间隔,因为 Eureka server 是通过心跳来判断 Eureka client 是否正常;
源码分析
首先回顾 com.netflix.discovery.DiscoveryClient 类的 initScheduledTasks 方法,Eureka client 在启动的时侯都会执行此方法,如下方所示,已经略去了周期性更新服务列表相关的代码:
上述代码可以看出,续租逻辑在 HeartbeatThread 实例中,交给 TimedSupervisorTask 实例进行周期性调用,有关 TimedSupervisorTask 的功能和细节,请参考《Eureka的TimedSupervisorTask类(自动调节间隔的周期性任务)》;
HeartbeatThread 类中,通过调用 renew 方法实现续租,如下代码所示,方法注释已说明是 Restfult 请求来实现的,对应 Eureka server 的返回信息 httpResponse,除了检查返回码是否等于 200 就没有任何作用了,想想也是如此,30 秒一次的心跳,不论是请求还是响应都应该尽量简洁,降低服务器和网络的压力:
继续展开上面代码段中的 eurekaTransport.registrationClient.sendHeartBeat 方法,源码在 EurekaHttpClientDecorator 类中:
继续展开 delegate.sendHeartBeat,多层调用一路展开,最终由 JerseyApplicationClient 类来完成操作,对应源码在父类 AbstractJerseyEurekaHttpClient 中,如下所示,主要工作是利用 jersey 库的 Restful Api 将自身的信息 PUT 到 Eureka server,注意:这里不是 POST,也不是 GET,而是 PUT:
至此,Eureka client 向服务续租的源码就分析完毕了,过程相对简单,DiscoveryClient、TimedSupervisorTask、JerseyApplicationClient 等实例各司其职,定时发送 PUT 请求到 Eureka server;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/7b79bbac7526d5757c2d9db28】。文章转载请联系作者。
评论