Eureka 源码解析 —— 应用实例注册发现(二)之续租
本文主要基于 Eureka 1.8.X 版本
- RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
- 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
- 新的源码解析文章实时收到通知。每周更新一篇左右。
- 认真的源码交流微信群。
1. 概述
本文主要分享 Eureka-Client 向 Eureka-Server 续租应用实例的过程。
FROM 《深度剖析服务发现组件 Netflix Eureka》 二次编辑
- 蓝框部分,为本文重点。
- 非蓝框部分,Eureka-Server 集群间复制注册的应用实例信息,不在本文内容范畴。
推荐 Spring Cloud 书籍:
2. Eureka-Client 发起续租
Eureka-Client 向 Eureka-Server 发起注册应用实例成功后获得租约 (Lease)。
Eureka-Client 固定间隔向 Eureka-Server 发起续租 (renew),避免租约过期。
默认情况下,租约有效期为 90 秒,续租频率为 30 秒。两者比例为 1 : 3 ,保证在网络异常等情况下,有三次重试的机会。
2.1 初始化定时任务
Eureka-Client 在 初始化 过程中,创建心跳线程,固定间隔向 Eureka-Server 发起续租 (renew)。实现代码如下:
2.2 HeartbeatThread
- com.netflix.discovery.DiscoveryClient.HeartbeatThread
,心跳线程,实现执行 Eureka-Client 向 Eureka-Server 发起续租 (renew) 请求。实现代码如下:- 调用 #renew 方法,执行续租逻辑。实现代码如下:
2.3 TimedSupervisorTask
- com.netflix.discovery.TimedSupervisorTask
,监管定时任务的任务。A supervisor task that schedules subtasks while enforce a timeout.
创建 TimedSupervisorTask 代码如下:
- scheduler 初始化延迟执行 TimedSupervisorTask 。
- TimedSupervisorTask 执行时,提交 task 到 executor 执行任务。
- 当 task 执行正常,TimedSupervisorTask 再次提交自己到 scheduler 延迟 timeoutMillis 执行。
- 当 task 执行超时,重新计算延迟时间 (不允许超过 maxDelay),再次提交自己到 scheduler 延迟执行。
实现代码如下:
3. Eureka-Server 接收续租
3.1 接收续租请求
- com.netflix.eureka.resources.InstanceResource
,处理单个应用实例信息的请求操作的 Resource (Controller)。续租应用实例信息的请求,映射
- InstanceResource#renewLease()
方法,实现代码如下:3.2 续租应用实例信息
调用
AbstractInstanceRegistry#renew(...)
方法,续租应用实例信息,实现代码如下:666. 彩蛋
效率比想象的低一些,加油继续更新下一篇。
胖友,分享我的公众号 (芋道源码) 给你的胖友可好?
来源: http://www.suo.im/Xvu1z