Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
来源:互联网 发布:淘宝上的化妆品磨损装 编辑:程序博客网 时间:2024/05/29 17:19
摘要: 原创出处 http://www.iocoder.cn/Eureka/eureka-client-init-first/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 Eureka 1.8.X 版本
- 1. 概述
- 2. EurekaInstanceConfig
- 2.1 类关系图
- 2.2 配置属性
- 2.3 AbstractInstanceConfig
- 2.4 PropertiesInstanceConfig
- 2.5 MyDataCenterInstanceConfig
- 2.6 小结
- 3. InstanceInfo
- 4. ApplicationInfoManager
- 创建 EurekaInstanceConfig对象
- 使用 EurekaInstanceConfig对象 创建 InstanceInfo对象
- 使用 EurekaInstanceConfig对象 + InstanceInfo对象 创建 ApplicationInfoManager对象
- 创建 EurekaClientConfig对象
- 使用 ApplicationInfoManager对象 + EurekaClientConfig对象 创建 EurekaClient对象
- 【本文】(一)EurekaInstanceConfig
- (二)EurekaClientConfig
- (三)EurekaClient
- 请支持正版。下载盗版,等于主动编写低级 BUG 。
- 程序猿DD —— 《Spring Cloud微服务实战》
- 周立 —— 《Spring Cloud与Docker微服务架构实战》
- 两书齐买,京东包邮。
- EurekaInstanceConfig,重在应用实例,例如,应用名、应用的端口等等。此处应用指的是,Application Consumer 和 Application Provider。
- EurekaClientConfig,重在 Eureka-Client,例如, 连接的 Eureka-Server 的地址、获取服务提供者列表的频率、注册自身为服务提供者的频率等等。
- 本文只解析红圈部分类。
- EurekaArchaius2ClientConfig 基于 Netflix Archaius 2.x 实现,目前还在开发中,因此暂不解析。
- CloudInstanceConfig、Ec2EurekaArchaius2InstanceConfig 基于亚马逊 AWS,大多数读者和我对 AWS 都不了解,因此暂不解析。
#getLeaseRenewalIntervalInSeconds()
:租约续约频率,单位:秒。应用不断通过按照该频率发送心跳给 Eureka-Server 以达到续约的作用。当 Eureka-Server 超过最大频率未收到续约(心跳),契约失效,进行应用移除。应用移除后,其他应用无法从 Eureka-Server 获取该应用。#getLeaseExpirationDurationInSeconds()
:契约过期时间,单位:秒。#getDataCenterInfo()
:数据中心信息。com.netflix.appinfo.DataCenterInfo
,数据中心信息接口,目前较为简单,标记所属数据中心名。一般情况下,我们使用Name.MyOwn
。接口实现代码如下:#getNamespace()
:配置命名空间,默认使用eureka
。以eureka-client.properties
举个例子:- 每个属性最前面的
eureka
即是配置命名空间,一般情况无需修改。
- 每个属性最前面的
TODO[0004]:健康检查
#isInstanceEnabledOnit()
:应用初始化后是否开启。在「3. InstanceInfo」详细解析。#getHostInfo()
方法,获取本地服务器的主机名和主机 IP 地址。如果主机有多网卡或者虚拟机网卡,这块要小心,解决方式如下:- 手动配置本机的
hostname
+etc/hosts
文件,从而映射主机名和 IP 地址。 - 使用 Spring-Cloud-Eureka-Client 的话,参考周立 —— 《Eureka服务注册过程详解之IpAddress》解决。
- 手动配置本机的
configInstance
属性,配置文件对象,基于 Netflix Archaius 1.x 实现配置文件的读取。在com.netflix.appinfo.PropertyBasedInstanceConfigConstants
可以看到配置文件的每个属性 KEY 。appGrpNameFromEnv
属性,应用分组,从环境变量中获取。从#getAppGroupName()
方法中,可以看到优先还是从配置文件读取。设置方法如下:FALLBACK_APP_GROUP_KEY
,私有静态变量,实际得使用NETFLIX_APP_GROUP
。com.netflix.config.ConfigurationManager
可以从环境变量获取到值。
调用
Archaius1Utils#initConfig(...)
方法,初始化读取的配置文件对象,实现代码如下:
- 从环境变量
eureka.client.props
,获取配置文件名。如果未配置,使用参数configName
,即CommonConstants.CONFIG_FILE_NAME
("eureka-client"
)。 - 从环境变量
eureka.environment
( EUREKA_ENVIRONMENT ),获取配置文件环境。 - 调用
ConfigurationManager#loadCascadedPropertiesFromResources(...)
方法,读取配置文件到环境变量,首先读取${eureka.client.props}</code> 对应的配置文件;然后读取 <code>${eureka.client.props}-${eureka.environment}
对应的配置文件。若有相同属性,进行覆盖。
- 从环境变量
- 该类实现
javax.inject.Provider
接口,设置 InstanceInfo 的生成工厂。感兴趣的同学,可以点击《Google-Guice入门介绍》搜索 Provider 关键字。目前处于试验阶段,未完成。 EurekaConfigBasedInstanceInfoProvider(config)
构造方法,设置生成 InstanceInfo 的 EurekaInstanceConfig 配置。调用
#get()
方法,根据 EurekaInstanceConfig 创建 InstanceInfo。InstanceInfo 的绝大数属性和 EurekaInstanceConfig 是一致的 。实现代码如下:- 第 21 至 24 行 :创建租约信息构建器(
com.netflix.appinfo.LeaseInfo.Builder
),并设置renewalIntervalInSecs
/durationInSecs
属性。 第 26 至 29 行 :创建 VIP地址解析器(
com.netflix.appinfo.providers.VipAddressResolver
)。实现代码如下:- 使用
#resolveDeploymentContextBasedVipAddresses()
方法,将 VIP地址 里的${(.*?)}</code> 查找配置文件里的键值进行替换。例如,<code>${eureka.env}.domain.com
,查找配置文件里的键${eureka.env}
对应值进行替换。TODO[0005]:调试下来,发现 Archaius 已经替换,等到找到答案修改此处。
- 使用
第 32 至 33 行 :创建应用实例信息构建器(
com.netflix.appinfo.InstanceInfo.Builder
)。- 第 35 至 45 行 :获得应用实例编号(
instanceId
)。 - 第 47 至 58 行 :获得主机名。
- 第 60 至 78 行 :设置应用实例信息构建器的属性。
- 第 80 至 90 行 :应用初始化后是否开启。
- 第 82 至 85 行 :应用不开启,应用实例处于 STARTING 状态。
- 第 86 至 90 行 :应用开启,应用实例处于 UP 状态。
- 使用应用初始化后不开启,可以通过调用
ApplicationInfoManager#setInstanceStatus(...)
方法改变应用实例状态,在《Eureka 源码解析 —— 应用实例注册发现 (一)之注册》「2.1 应用实例信息复制器」有详细解析。
- 第 92 至 98 行 :设置应用实例信息构建器的元数据( Metadata )集合。
- 第 100 至 101 行 :创建应用实例信息(
com.netflix.appinfo.InstanceInfo
)。 - 第 103 至 104 行 :设置应用实例信息的租约信息(
com.netflix.appinfo.InstanceInfo
)。
- 第 21 至 24 行 :创建租约信息构建器(
listeners
属性,状态变更监听器集合。在《Eureka 源码解析 —— 应用实例注册发现 (一)之注册》「2.1 应用实例信息复制器」有详细解析。instanceStatusMapper
属性,应用实例状态匹配。实现代码如下:#map
方法,根据传入pre
参数,转换成对应的应用实例状态。- 默认情况下,使用 NO_OP_MAPPER 。一般情况下,不需要关注该类。
1. 概述
本文主要分享 Eureka-Client 自身初始化的过程,不包含 Eureka-Client 向 Eureka-Server 的注册过程( ��后面会另外文章分享 )。
Eureka-Client 自身初始化过程中,涉及到主要对象如下图:
考虑到整个初始化的过程中涉及的配置特别多,拆分成三篇文章:
下面我们来看看每个类的实现。
推荐 Spring Cloud 书籍:
2. EurekaInstanceConfig
com.netflix.appinfo.EurekaInstanceConfig
,Eureka 应用实例配置接口。在下文你会看到 EurekaClientConfig 接口,两者的区别如下:
2.1 类关系图
EurekaInstanceConfig 整体类关系如下图:
2.2 配置属性
点击 EurekaInstanceConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:
2.3 AbstractInstanceConfig
com.netflix.appinfo.AbstractInstanceConfig
,Eureka 应用实例配置抽象基类,主要实现一些相对通用的配置,实现代码如下:
2.4 PropertiesInstanceConfig
com.netflix.appinfo.PropertiesInstanceConfig
,基于配置文件的 Eureka 应用实例配置抽象基类,实现代码如下:
2.5 MyDataCenterInstanceConfig
com.netflix.appinfo.MyDataCenterInstanceConfig
,非 AWS 数据中心的 Eureka 应用实例配置实现类,实现代码如下:
2.6 小结
一般情况下,使用 MyDataCenterInstanceConfig 配置 Eureka 应用实例。
在 Spring-Cloud-Eureka 里,直接基于 EurekaInstanceConfig 接口重新实现了配置类,实际逻辑差别不大,在TODO[0007] :《Spring-Cloud-Eureka-Client》详细解析。
3. InstanceInfo
com.netflix.appinfo.InstanceInfo
,应用实例信息。Eureka-Client 向 Eureka-Server 注册该对象信息。注册成功后,可以被其他 Eureka-Client 发现。
本文仅分享 InstanceInfo 的初始化。InstanceInfo 里和注册发现相关的属性和方法,暂时跳过。
com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider
,基于 EurekaInstanceConfig 创建 InstanceInfo 的工厂,实现代码如下:
4. ApplicationInfoManager
com.netflix.appinfo.ApplicationInfoManager
,应用信息管理器。实现代码如下:
- Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
- Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient
- Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig
- Eureka 源码解析 —— Eureka-Server 启动(二)之 EurekaBootStrap
- Eureka 源码解析 —— 应用实例注册发现(一)之注册
- Eureka 源码解析 —— Eureka-Server 集群同步
- Eureka 源码解析 —— 任务批处理
- Eureka 源码解析 —— 网络通信
- Eureka 源码解析 —— StringCache
- Eureka 源码解析 —— Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁
- Eureka 源码解析 —— 应用实例注册发现(二)之续租
- Eureka 源码解析 —— 应用实例注册发现(三)之下线
- Eureka 源码解析 —— 应用实例注册发现(四)之自我保护机制
- Eureka 源码解析 —— 应用实例注册发现(五)之过期
- Eureka 源码解析 —— 应用实例注册发现(六)之全量获取
- Eureka 源码解析 —— 应用实例注册发现(七)之增量获取
- Eureka 源码解析 —— 应用实例注册发现(八)之覆盖状态
- 五款开源免费的建站系统推荐
- 路由器串联设置
- CentOS7使用firewalld打开关闭防火墙与端口
- Python is not installed as a framework. The Mac OS X backend will not be a
- python-----购物车
- Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
- VS2013 用ATL向导制作OCX控件入门 (开发及测试)
- BootstrapTable加载一次后无效
- 为什么要是用R语言?
- 1313: 【白书习题第三章】计算器
- 作业2017.12.13
- python的numpy模块
- mysql 基本操作 触发器、锁、事物、分布式事物、sql安全问题、sql mode详解 (第五章)
- jps