Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient
来源:互联网 发布:ae后期制作软件 编辑:程序博客网 时间:2024/06/05 07:10
摘要: 原创出处 http://www.iocoder.cn/Eureka/eureka-client-init-third/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 Eureka 1.8.X 版本
- 1. 概述
- 2. EurekaClient
- 2.1 LookupService
- 3. DiscoveryClient
- 3.1 构造方法参数
- 3.2 构造方法
- 创建 EurekaInstanceConfig对象
- 使用 EurekaInstanceConfig对象 创建 InstanceInfo对象
- 使用 EurekaInstanceConfig对象 + InstanceInfo对象 创建 ApplicationInfoManager对象
- 创建 EurekaClientConfig对象
- 使用 ApplicationInfoManager对象 + EurekaClientConfig对象 创建 EurekaClient对象
- (一)EurekaInstanceConfig)
- (二)EurekaClientConfig
- 【本文】(三)EurekaClient
- 请支持正版。下载盗版,等于主动编写低级 BUG 。
- 程序猿DD —— 《Spring Cloud微服务实战》
- 周立 —— 《Spring Cloud与Docker微服务架构实战》
- 两书齐买,京东包邮。
- 提供多种方法获取应用集合(
com.netflix.discovery.shared.Applications
) 和 应用实例信息集合(com.netflix.appinfo.InstanceInfo
)。 - 提供方法获取本地客户端信息,例如,应用管理器(
com.netflix.appinfo.ApplicationInfoManager
)和 Eureka-Client 配置(com.netflix.discovery.EurekaClientConfig
)。 - 提供方法注册本地客户端的健康检查和 Eureka 事件监听器。
- 在 Eureka-Client 里,EurekaClient 继承该接口。
- 在 Eureka-Server 里,
com.netflix.eureka.registry.InstanceRegistry
继承该接口。 - 向 Eureka-Server 注册自身服务
- 向 Eureka-Server 续约自身服务
- 向 Eureka-Server 取消自身服务,当关闭时
- 从 Eureka-Server 查询应用集合和应用实例信息
- 简单来理解,对 Eureka-Server 服务的增删改查
- ApplicationInfoManager,在《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》有详细解析。
- EurekaClientConfig,在《Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig》有详细解析。
com.netflix.discovery.BackupRegistry
,备份注册中心接口。当 Eureka-Client 启动时,无法从 Eureka-Server 读取注册信息(可能挂了),从备份注册中心读取注册信息。实现代码如下:- 从
com.netflix.discovery.NotImplementedRegistryImpl
可以看出,目前 Eureka-Client 未提供合适的默认实现。
- 从
com.netflix.discovery.AbstractDiscoveryClientOptionalArgs
,DiscoveryClient 可选参数抽象基类。不同于上面三个必填参数,该参数是选填参数,实际生产下使用较少。实现代码如下:
com.netflix.appinfo.HealthCheckCallback
,健康检查回调接口,目前已经废弃,使用 HealthCheckHandler 替代,你可以不关注该参数。com.netflix.appinfo.HealthCheckHandler
,健康检查处理器接口,目前暂未提供合适的默认实现,唯一提供的com.netflix.appinfo.HealthCheckCallbackToHandlerBridge
,用于将 HealthCheckCallback 桥接成 HealthCheckHandler,实现代码如下:- 在 Spring-Cloud-Eureka-Client,提供了默认实现
org.springframework.cloud.netflix.eureka.EurekaHealthCheckHandler
,需要结合spirng-boot-actuate
使用,感兴趣的同学可以看看。本文暂不拓展开,后面另开文章分享。(TODO[0004]:健康检查)
- 在 Spring-Cloud-Eureka-Client,提供了默认实现
com.netflix.discovery.PreRegistrationHandler
,向 Eureka-Server 注册之前的处理器接口,目前暂未提供默认实现。通过实现该接口,可以在注册前做一些自定义的处理。实现代码如下:
- x
additionalFilters
,Jersey 过滤器集合。这里声明泛型<T>
的原因,Jersey 1.X 和 Jersey 2.X 的过滤器接口不同,通过泛型来支持。实现代码如下:- Jersey 1.X 使用 ClientFilter 。ClientFilter 目前有两个过滤器实现:EurekaIdentityHeaderFilter 、DynamicGZIPContentEncodingFilter 。
- Jersey 2.X 使用 ClientRequestFilter 。
- DiscoveryClient 使用 DiscoveryClientOptionalArgs,即 Jersey 1.X 。
eurekaJerseyClient
,Jersey 客户端。该参数目前废弃,使用下面 TransportClientFactories 参数来进行生成。com.netflix.discovery.shared.transport.jersey.TransportClientFactories
,生成 Jersey 客户端工厂的工厂接口。目前有 Jersey1TransportClientFactories 、Jersey2TransportClientFactories 两个实现。TransportClientFactories 实现代码如下:- 第一个方法已经废弃,这就是为什么说上面的
eurekaJerseyClient
参数( 不是 EurekaJerseyClient 类)已经废弃,被第二个方法取代。相比来说,第二个方法对 EurekaJerseyClient 创建封装会更好。
- 第一个方法已经废弃,这就是为什么说上面的
com.netflix.discovery.EurekaEventListener
,Eureka 事件监听器。实现代码如下:
com.netflix.discovery.StatusChangeEvent
,应用实例状态变更事件,在《Eureka 源码解析 —— 应用实例注册发现 (一)之注册》「2.1 应用实例信息复制器」 有详细解析。com.netflix.discovery.CacheRefreshedEvent
,在《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》「2.4 发起获取注册信息」 有详细解析。
- 在创建 DiscoveryClient 时,
localRegionApps
为空。 - 定时任务间隔从 Eureka-Server 拉取注册应用信息到本地缓存,在 《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》 有详细解析。
- 每次成功向 Eureka-Serve 心跳或者从从 Eureka-Server 拉取注册信息后,都会更新相应时间戳。
- 配合 Netflix Servo 实现监控信息采集。
- 对
com.netflix.discovery.util.ThresholdLevelsMetric
感兴趣的同学可以点击链接查看。本文暂不拓展开,后面另开文章分享。(TODO[0012]:监控相关) scheduler
,定时任务线程池,初始化大小为 2,一个给heartbeatExecutor
,一个给cacheRefreshExecutor
。heartbeatExecutor
、cacheRefreshExecutor
在提交给scheduler
才声明具体的任务。- 本文暂不拓展开,在 《Eureka 源码解析 —— EndPoint 与 解析器》 和 《Eureka 源码解析 —— 网络通信》 详细解析。
com.netflix.discovery.AzToRegionMapper
,主要用于亚马逊 AWS,跳过。com.netflix.discovery.InstanceRegionChecker
,应用实例信息区域(region
)校验,实现代码如下:- 调用
#fetchRegistry(false)
方法,从 Eureka-Server 初始拉取注册信息。在(TO后文链接)详细解析。 调用
#fetchRegistryFromBackup()
方法,若初始拉取注册信息失败,从备份注册中心获取。实现代码如下:- BackupRegistry 目前暂未提供默认实现,需要自行相关逻辑。
- 初始化从 Eureka-Server 拉取注册信息执行器,在 《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》 详细解析。
- 初始化向 Eureka-Server 心跳(续租)执行器,在 《Eureka 源码解析 —— 应用实例注册发现(二)之续租》 详细解析。
- 配合 Netflix Servo 实现监控信息采集。
1. 概述
本文接《Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig》,主要分享 Eureka-Client 自身初始化的过程的第三部分 —— EurekaClient,不包含 Eureka-Client 向 Eureka-Server 的注册过程( ��后面会另外文章分享 )。
Eureka-Client 自身初始化过程中,涉及到主要对象如下图:
考虑到整个初始化的过程中涉及的配置特别多,拆分成三篇文章:
下面我们来看看每个类的实现。
推荐 Spring Cloud 书籍:
2. EurekaClient
com.netflix.discovery.EurekaClient
,Eureka-Client 接口,声明如下方法:
另外,Eureka 2.X 版本正在开发,该接口为 Eureka 1.X 和 2.X 提供平滑过渡接口。
This interface does NOT try to clean up the current client interface for eureka 1.x. Rather it tries to provide an easier transition path from eureka 1.x to eureka 2.x.
2.1 LookupService
com.netflix.discovery.shared.LookupService
,查找服务接口,提供简单单一的方式获取应用集合(com.netflix.discovery.shared.Applications
) 和 应用实例信息集合( com.netflix.appinfo.InstanceInfo
)。
3. DiscoveryClient
com.netflix.discovery.DiscoveryClient
,实现 EurekaClient 接口,用于与 Eureka-Server 交互。实现如下方法:
3.1 构造方法参数
DiscoveryClient 完整构造方法需要传入四个参数,实现代码如下:
3.2 构造方法
DiscoveryClient 的构造方法实现代码相对较多,已经将代码切块 + 中文注册,点击 DiscoveryClient 链接,对照下面每个小结阅读理解。
3.2.1 赋值 AbstractDiscoveryClientOptionalArgs
3.2.2 赋值 ApplicationInfoManager、EurekaClientConfig
3.2.3 赋值 BackupRegistry
3.2.4 初始化 InstanceInfoBasedUrlRandomizer
TODO[0016]:InstanceInfoBasedUrlRandomizer
3.2.5 初始化 Applications 在本地的缓存
3.2.6 获取哪些 Region 集合的注册信息
3.2.7 初始化拉取、心跳的监控
3.2.8 结束初始化,当无需和 Eureka-Server 交互
3.2.9 初始化线程池
3.2.10 初始化 Eureka 网络通信相关
3.2.11 初始化 InstanceRegionChecker
3.2.12 从 Eureka-Server 拉取注册信息
3.2.13 执行向 Eureka-Server 注册之前的处理器
3.2.14 初始化定时任务
3.2.15 向 Servo 注册监控
3.2.16 初始化完成
- Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient
- Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
- Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig
- Eureka 源码解析 —— Eureka-Server 启动(二)之 EurekaBootStrap
- Spring Cloud Eureka解析(3) EurekaClient 重要缓存解析
- Eureka 源码解析 —— 应用实例注册发现(三)之下线
- Eureka 源码解析 —— Eureka-Server 集群同步
- Eureka 源码解析 —— 任务批处理
- Eureka 源码解析 —— 网络通信
- Eureka 源码解析 —— StringCache
- Eureka 源码解析 —— Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁
- Eureka 源码解析 —— 应用实例注册发现(一)之注册
- Eureka 源码解析 —— 应用实例注册发现(二)之续租
- Eureka 源码解析 —— 应用实例注册发现(四)之自我保护机制
- Eureka 源码解析 —— 应用实例注册发现(五)之过期
- Eureka 源码解析 —— 应用实例注册发现(六)之全量获取
- Eureka 源码解析 —— 应用实例注册发现(七)之增量获取
- jeecg条件查询出错
- python-------------三级菜单
- java.sql.SQLException:Column Index out of range,0<1
- 猜数字
- cxf+spring自定义restful接口返回消息
- Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient
- python 虚拟环境[virtualenv/virtualenvwrapper]设置
- android网络之URLconnection
- IIS 7 为 URL Rewrite 模块创建重写规则
- [随笔] 停止mysql正在执行的sql
- Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig
- WORD使用技巧
- 继webpack之后的又一打包神器parcel
- mt2503 [NETWORK]如何改为默认GPRS ALWAYS ON