注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaCl
1. 概述
本文接《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》,主要分享 Eureka-Client 自身初始化的过程的第二部分 —— EurekaClientConfig,不包含 Eureka-Client 向 Eureka-Server 的注册过程(
后面会另外文章分享 )。
Eureka-Client 自身初始化过程中,涉及到主要对象如下图:
创建 EurekaInstanceConfig对象
使用 EurekaInstanceConfig对象 创建 InstanceInfo对象
使用 EurekaInstanceConfig对象 + InstanceInfo对象 创建 ApplicationInfoManager对象
创建 EurekaClientConfig对象
使用 ApplicationInfoManager对象 + EurekaClientConfig对象 创建 EurekaClient对象
考虑到整个初始化的过程中涉及的配置特别多,拆分成三篇文章:
(一)EurekaInstanceConfig)
【本文】(二)EurekaClientConfig
(三)EurekaClient
下面我们来看看每个类的实现。
推荐 Spring Cloud 书籍:
请支持正版。下载盗版,等于主动编写低级 BUG 。
程序猿DD —— 《Spring Cloud微服务实战》
周立 —— 《Spring Cloud与Docker微服务架构实战》
两书齐买,京东包邮。
2. EurekaClientConfig
com.netflix.discovery.EurekaClientConfig
,Eureka-Client 配置接口。
2.1 类关系图
EurekaClientConfig 整体类关系如下图:
本文只解析红圈部分类。
EurekaArchaius2ClientConfig 基于 Netflix Archaius 2.x 实现,目前还在开发中,因此暂不解析。
2.2 配置属性
点击 EurekaClientConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:
Region、Zone 相关
x
#getRegion()
:Eureka-Client 所在区域(region
)。#getAvailabilityZones()
:Eureka-Client 所在地区(region
) 可用区(zone
)集合。该参数虽然是数组,第一个元素代表其所在的可用区。实现代码如下:// InstanceInfo.java
public static String getZone(String[] availZones, InstanceInfo myInfo) {
String instanceZone = ((availZones == null || availZones.length == 0) ? "default"
: availZones[0]);
if (myInfo != null
&& myInfo.getDataCenterInfo().getName() == DataCenterInfo.Name.Amazon) {String awsInstanceZone = ((AmazonInfo) myInfo.getDataCenterInfo())
.get(AmazonInfo.MetaDataKey.availabilityZone);
if (awsInstanceZone != null) {
instanceZone = awsInstanceZone;
}
}
return instanceZone;}
进步一步理解 Region、Zone 查看《周立 —— Region、Zone解析》。
使用 DNS 获取 Eureka-Server URL 相关
#shouldUseDnsForFetchingServiceUrls()
:是否使用 DNS 方式获取 Eureka-Server URL 地址。#getEurekaServerDNSName()
:Eureka-Server 的 DNS 名。#getEurekaServerPort()
:Eureka-Server 的端口。#getEurekaServerURLContext()
:Eureka-Server 的 URL Context 。#getEurekaServiceUrlPollIntervalSeconds()
:轮询获取 Eureka-Server 地址变更频率,单位:秒。默认:300 秒。#shouldPreferSameZoneEureka()
:优先使用相同区(zone
)的 Eureka-Server。
直接配合 Eureka-Server URL 相关
#getEurekaServerServiceUrls()
: Eureka-Server 的 URL 集合。
发现:从 Eureka-Server 获取注册信息相关
实现逻辑和 《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》
本系列暂时写对它的源码解析,感兴趣的同学可以看
com.netflix.discovery.shared.transport.EurekaHttpClient#getVip(String, String...)
和com.netflix.eureka.resources.AbstractVIPResource
。#shouldFetchRegistry()
:是否从 Eureka-Server 拉取注册信息。#getRegistryFetchIntervalSeconds()
:从 Eureka-Server 拉取注册信息频率,单位:秒。默认:30 秒。#shouldFilterOnlyUpInstances()
:是否过滤,只获取状态为开启( Up )的应用实例集合。#fetchRegistryForRemoteRegions()
:TODO[0009]:RemoteRegionRegistry#getCacheRefreshExecutorThreadPoolSize()
:注册信息缓存刷新线程池大小。#getCacheRefreshExecutorExponentialBackOffBound()
:注册信息缓存刷新执行超时后的延迟重试的时间。#getRegistryRefreshSingleVipAddress()
:只获得一个vipAddress
对应的应用实例们的注册信息。
注册:向 Eureka-Server 注册自身服务
#shouldRegisterWithEureka()
:是否向 Eureka-Server 注册自身服务。#shouldUnregisterOnShutdown()
:是否向 Eureka-Server 取消注册自身服务,当进程关闭时。#getInstanceInfoReplicationIntervalSeconds()
:向 Eureka-Server 同步应用实例信息变化频率,单位:秒。#getInitialInstanceInfoReplicationIntervalSeconds()
:向 Eureka-Server 同步应用信息变化初始化延迟,单位:秒。#getBackupRegistryImpl()
:获取备份注册中心实现类。当 Eureka-Client 启动时,无法从 Eureka-Server 读取注册信息(可能挂了),从备份注册中心读取注册信息。目前 Eureka-Client 未提供合适的实现。#getHeartbeatExecutorThreadPoolSize()
:心跳执行线程池大小。#getHeartbeatExecutorExponentialBackOffBound()
:心跳执行超时后的延迟重试的时间。
2.3 DefaultEurekaClientConfig
com.netflix.discovery.DefaultEurekaClientConfig
,基于配置文件的 Eureka-Client 配置实现类,实现代码如下:
public class DefaultEurekaClientConfig implements EurekaClientConfig {
public static final String DEFAULT_ZONE = "defaultZone";
/**
* 命名空间
*/
private final String namespace;
/**
* 配置文件对象
*/
private final DynamicPropertyFactory configInstance;
/**
* HTTP 传输配置
*/
private final EurekaTransportConfig transportConfig;
public DefaultEurekaClientConfig(String namespace) {
// 设置 namespace,为 "." 结尾
this.namespace = namespace.endsWith(".")
? namespace
: namespace + ".";
// 初始化 配置文件对象
this.configInstance = Archaius1Utils.initConfig(CommonConstants.CONFIG_FILE_NAME);
// 创建 HTTP 传输配置
this.transportConfig = new DefaultEurekaTransportConfig(namespace, configInstance);
}
}
类似 PropertiesInstanceConfig,点击《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」查看详细解析。
在
com.netflix.discovery.PropertyBasedClientConfigConstants
可以看到配置文件的每个属性 KEY 。transportConfig
属性,在 「3. EurekaTransportConfig」 详细解析。
2.4 DefaultEurekaClientConfigProvider
com.netflix.discovery.providers.DefaultEurekaClientConfigProvider
,创建 DefaultEurekaClientConfig 的工厂,实现代码如下:
public class DefaultEurekaClientConfigProvider implements Provider<EurekaClientConfig> {
@Inject(optional = true)
@EurekaNamespace
private String namespace;
private DefaultEurekaClientConfig config;
@Override
public synchronized EurekaClientConfig get() {
if (config == null) {
config = (namespace == null)
? new DefaultEurekaClientConfig()
: new DefaultEurekaClientConfig(namespace);
// TODO: Remove this when DiscoveryManager is finally no longer used
DiscoveryManager.getInstance().setEurekaClientConfig(config);
}
return config;
}
}
2.5 小结
推荐参考阅读:
程序猿DD —— 《Spring Cloud微服务实战》 Spring Cloud Eureka —— 配置详解
风中程序猿 —— 《微服务架构:Eureka参数配置项详解》
3. EurekaTransportConfig
3.1 类关系图
EurekaTransportConfig 整体类关系如下图:
本文只解析红圈部分类。
EurekaArchaius2TransportConfig 基于 Netflix Archaius 2.x 实现,目前还在开发中,因此暂不解析。
3.2 配置属性
点击 EurekaTransportConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:
#getSessionedClientReconnectIntervalSeconds()
:EurekaHttpClient 会话周期性重连时间,单位:秒。在 《Eureka 源码解析 —— 网络通信》「5.4 SessionedEurekaHttpClient」》 有详细解析。#getRetryableClientQuarantineRefreshPercentage()
:重试 EurekaHttpClient ,请求失败的 Eureka-Server 隔离集合占比 Eureka-Server 全量集合占比,超过该比例,进行清空。在 《Eureka 源码解析 —— 网络通信》「5.3 RetryableEurekaHttpClient」》 有详细解析。异步 EndPoint 集群解析器 :
在 《Eureka 源码解析 —— EndPoint 与 解析器》「3.6 AsyncResolver」》 有详细解析。
#getAsyncResolverRefreshIntervalMs()
:异步解析 EndPoint 集群频率,单位:毫秒。#getAsyncResolverWarmUpTimeoutMs()
:异步解析器预热解析 EndPoint 集群超时时间,单位:毫秒。#getAsyncExecutorThreadPoolSize()
:异步解析器线程池大小。
TODO[0028]:写入集群和读取集群。Eureka 2.x 兼容 :
#getApplicationsResolverDataStalenessThresholdSeconds()
#applicationsResolverUseIp()
#getWriteClusterVip()
#getReadClusterVip()
#getBootstrapResolverStrategy()
#useBootstrapResolverForQuery()
3.3 DefaultEurekaTransportConfig
com.netflix.discovery.shared.transport.DefaultEurekaTransportConfig
,基于配置文件的网络传输配置实现类,实现代码如下:
public class DefaultEurekaTransportConfig implements EurekaTransportConfig {
private static final String SUB_NAMESPACE = TRANSPORT_CONFIG_SUB_NAMESPACE + ".";
/**
* 命名空间
*/
private final String namespace;
/**
* 配置文件对象
*/
private final DynamicPropertyFactory configInstance;
public DefaultEurekaTransportConfig(String parentNamespace, DynamicPropertyFactory configInstance) {
// 命名空间
this.namespace = parentNamespace == null
? SUB_NAMESPACE
: (parentNamespace.endsWith(".")
? parentNamespace + SUB_NAMESPACE
: parentNamespace + "." + SUB_NAMESPACE);
// 配置文件对象
this.configInstance = configInstance;
}
}
类似 PropertiesInstanceConfig,点击《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」查看详细解析。
在
com.netflix.discovery.shared.transport.PropertyBasedTransportConfigConstants
可以看到配置文件的每个属性 KEY 。
666. 彩蛋
更多相关文章
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(三)之 Eurek
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(一)之 Eurek
- C#基础入门第十二天(面向对象多态,File操作流,泛型集合)
- 这可能是 Python 面向对象编程的最佳实践
- 浏览器中的JavaScript:文档对象模型与 DOM 操作[每日前端夜话0x5F
- Javascript的对象拷贝[每日前端夜话0x53]
- Python 为什么会有个奇怪的“...”对象?
- 面向对象综合练习(超市收银系统)
- 如何美观地打印 Python 对象?这个标准库可以简单实现