您的位置:首页 > 其它

注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig

2018-03-05 00:00 741 查看
本文主要基于 Eureka 1.8.X 版本1. 概述

2. EurekaClientConfig
2.1 类关系图

2.2 配置属性

2.3 DefaultEurekaClientConfig

2.4 DefaultEurekaClientConfigProvider

2.5 小结

3. EurekaTransportConfig
3.1 类关系图

3.2 配置属性

3.3 DefaultEurekaTransportConfig

666. 彩蛋

友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。
友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。
友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。

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;
[/code]
}


进步一步理解 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. 彩蛋


知识星球涉及到配置,内容初看起来会比较多,慢慢理解后,就会变得很“啰嗦”,请保持耐心。胖友,分享一个朋友圈可好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐