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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig

本文主要基于 Eureka 1.8.X 版本

    1. 概述
    2. 2. EurekaClientConfig
  • 2.1 类关系图

  • 2.2 配置属性

  • 2.3 DefaultEurekaClientConfig

  • 2.4 DefaultEurekaClientConfigProvider

  • 2.5 小结

  • 3.1 类关系图

  • 3.2 配置属性

  • 3.3 DefaultEurekaTransportConfig

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

1. 概述

本文接《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》,主要分享 Eureka-Client 自身初始化的过程的第二部分 —— EurekaClientConfig,不包含 Eureka-Client 向 Eureka-Server 的注册过程( 🙂后面会另外文章分享 )。

Eureka-Client 自身初始化过程中,涉及到主要对象如下图:

  1. 创建 EurekaInstanceConfig对象
  2. 使用 EurekaInstanceConfig对象 创建 InstanceInfo对象
  3. 使用 EurekaInstanceConfig对象 + InstanceInfo对象 创建 ApplicationInfoManager对象
  4. 创建 EurekaClientConfig对象
  5. 使用 ApplicationInfoManager对象 + EurekaClientConfig对象 创建 EurekaClient对象

考虑到整个初始化的过程中涉及的配置特别多,拆分成三篇文章:

  1. (一)EurekaInstanceConfig)
  2. 【本文】(二)EurekaClientConfig
  3. (三)EurekaClient

下面我们来看看每个的实现。

推荐 Spring Cloud 书籍

  • 请支持正版。下载盗版,等于主动编写低级 BUG 。
  • 程序猿DD —— 《Spring Cloud微服务实战》
  • 周立 —— 《Spring Cloud与Docker微服务架构实战》
  • 两书齐买,京东包邮。

2. EurekaClientConfig

com.netflix.discovery.EurekaClientConfigEureka-Client 配置接口

2.1 类关系图

EurekaClientConfig 整体类关系如下图:

  • 本文只解析红圈部分类。
  • EurekaArchaius2ClientConfig 基于 Netflix Archaius 2.x 实现,目前还在开发中,因此暂不解析。

2.2 配置属性

点击 EurekaClientConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:

  • **Region、Zone 相关**
    • `#getRegion()` :Eureka-Client 所在区域( `region` )。
    • `#getAvailabilityZones()` :Eureka-Client 所在地区( `region` ) 可用区( `zone` )集合。**该参数虽然是数组,第一个元素代表其所在的可用区**。实现代码如下:
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
      // 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;
      }

      }
      return instanceZone;
      }

    • #getRegion() :Eureka-Client 所在区域(  region )。

      // 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;
      }

      • #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。

      • #getEurekaServerServiceUrls() : Eureka-Server 的 URL 集合。

      • 实现逻辑和 《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 对应的应用实例们的注册信息。

      • #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 配置实现类,实现代码如下:

  • 本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig