注册中心 Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig

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

  • 1. 概述
  • 2. EurekaServerConfig
  • 2.1 类关系图
  • 2.2 配置属性
  • 2.3 DefaultEurekaServerConfig

本文主要分享 Eureka-Server 启动的过程

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

  • 【本文】ServerConfig
  • EurekaBootStrap

推荐 Spring Cloud 书籍

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

推荐 Spring Cloud 视频

  • Java 微服务实践 - Spring Boot
  • Java 微服务实践 - Spring Cloud
  • Java 微服务实践 - Spring Boot / Spring Cloud

2. EurekaServerConfig

com.netflix.eureka.EurekaServerConfigEureka-Server 配置接口

2.1 类关系图

2.2 配置属性

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

  • 请求认证相关
    • Eureka-Server 未实现认证。在 Spring-Cloud-Eureka-Server,通过 spring-boot-starter-security 模块支持。《spring cloud-给Eureka Server加上安全的用户认证》有详细解析。
    • #shouldLogIdentityHeaders() :打印访问的客户端名和版本号,配合 Netflix Servo 实现监控信息采集。
  • 请求限流相关
    • 《Eureka 源码解析 —— 基于令牌桶算法的 RateLimiter》 有详细解析。
    • #isRateLimiterEnabled() :请求限流是否开启。
    • #isRateLimiterThrottleStandardClients() :是否对标准客户端判断是否限流。标准客户端通过请求头( header )的 "DiscoveryIdentity-Name" 来判断,是否在标准客户端名集合里。
    • #getRateLimiterPrivilegedClients()标准客户端名集合。默认包含"DefaultClient""DefaultServer"
    • #getRateLimiterBurstSize() :速率限制的 burst size ,使用令牌桶算法
    • #getRateLimiterRegistryFetchAverageRate()增量拉取注册信息的速率限制。
    • #getRateLimiterFullFetchAverageRate()全量拉取注册信息的速率限制。
  • 获取注册信息请求相关
    • 《Eureka 源码解析 —— 应用实例注册发现 (六)之全量获取》 有详细解析。
    • 《Eureka 源码解析 —— 应用实例注册发现 (七)之增量获取》 有详细解析。
    • #shouldUseReadOnlyResponseCache() :是否开启只读请求响应缓存。响应缓存 ( ResponseCache ) 机制目前使用两层缓存策略。优先读取只读缓存,读取不到后读取固定过期读写缓存
    • #getResponseCacheUpdateIntervalMs()只读缓存更新频率,单位:毫秒。只读缓存定时更新任务只更新读取过请求 (com.netflix.eureka.registry.Key),因此虽然永不过期,也会存在读取不到的情况。
    • #getResponseCacheAutoExpirationInSeconds()读写缓存写入后过期时间,单位:秒。
    • #getRetentionTimeInMSInDeltaQueue():租约变更记录过期时长,单位:毫秒。默认值 : 3 * 60 * 1000 毫秒。
    • #DeltaRetentionTimerIntervalInMs():移除队列里过期的租约变更记录的定时任务执行频率,单位:毫秒。默认值 :30 * 1000 毫秒。
  • 自我保护机制相关
    • 在 《Eureka 源码解析 —— 应用实例注册发现(四)之自我保护机制》 有详细解析。
    • #shouldEnableSelfPreservation() :是否开启自我保护模式。 FROM 周立——《理解Eureka的自我保护模式》 当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。 一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。 当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
    • #getRenewalPercentThreshold() :开启自我保护模式比例,超过该比例后开启自我保护模式。
    • #getRenewalThresholdUpdateIntervalMs() :自我保护模式比例更新定时任务执行频率,单位:毫秒。
  • 注册的应用实例的租约过期相关
    • 在 《Eureka 源码解析 —— 应用实例注册发现(五)之过期》 有详细解析。
    • #getEvictionIntervalTimerInMs() :租约过期定时任务执行频率,单位:毫秒。
  • Eureka-Server 远程节点( 非集群 )读取相关
    • key :Eureka-Server 区域( region )
    • value :Eureka-Server 地址
    • TODO[0009]:RemoteRegionRegistry
    • #getRemoteRegionUrlsWithName() :TODO[0009]:RemoteRegionRegistry。
    • #getRemoteRegionAppWhitelist() :TODO[0009]:RemoteRegionRegistry。
    • #getRemoteRegionRegistryFetchInterval() :TODO[0009]:RemoteRegionRegistry。
    • #getRegistrySyncRetries() :Eureka-Server 启动时,从远程 Eureka-Server 读取失败重试次数。
    • #getRegistrySyncRetryWaitMs() :Eureka-Server 启动时,从远程 Eureka-Server 读取失败等待( sleep )间隔,单位:毫秒。
    • #getRemoteRegionFetchThreadPoolSize() :TODO[0009]:RemoteRegionRegistry。
    • #disableTransparentFallbackToOtherRegion() :是否禁用本地读取不到注册信息,从远程 Eureka-Server 读取。
  • Eureka-Server 集群同步相关
    • 在 《Eureka 源码解析 —— Eureka-Server 集群同步》
    • #getMaxThreadsForPeerReplication() :同步应用实例信息最大线程数。
    • #getMaxElementsInPeerReplicationPool() :待执行同步应用实例信息事件缓冲最大数量。
    • #getMaxTimeForReplication() :执行单个同步应用实例信息状态任务最大时间。
    • #shouldSyncWhenTimestampDiffers() :是否同步应用实例信息,当应用实例信息最后更新时间戳( lastDirtyTimestamp )发生改变。
    • #getWaitTimeInMsWhenSyncEmpty() :Eureka-Server 启动时,从远程 Eureka-Server 读取不到注册信息时,多长时间不允许 Eureka-Client 访问。
    • #getPeerEurekaNodesUpdateIntervalMs() :Eureka-Server 集群节点更新频率,单位:毫秒。

2.3 DefaultEurekaServerConfig

com.netflix.eureka.DefaultEurekaServerConfig,基于配置文件Eureka-Server 配置实现类,实现代码如下:

public class DefaultEurekaServerConfig implements EurekaServerConfig {

    // ... 省略部分方法和属性

    private static final String ARCHAIUS_DEPLOYMENT_ENVIRONMENT = "archaius.deployment.environment";
    private static final String TEST = "test";
    private static final String EUREKA_ENVIRONMENT = "eureka.environment";

    /**
     * 配置文件对象
     */
    private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory.getInstance();
    /**
     * 配置文件
     */
    private static final DynamicStringProperty EUREKA_PROPS_FILE = DynamicPropertyFactory
            .getInstance().getStringProperty("eureka.server.props", "eureka-server");

    /**
     * 命名空间
     */
    private String namespace = "eureka.";

    public DefaultEurekaServerConfig() {
        init();
    }

    public DefaultEurekaServerConfig(String namespace) {
        // 设置 namespace,为 "." 结尾
        this.namespace = namespace;
        // 初始化 配置文件对象
        init();
    }

    private void init() {
        // 初始化 配置文件对象
        String env = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT, TEST);
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);
        String eurekaPropsFile = EUREKA_PROPS_FILE.get();
        try {
            // ConfigurationManager
            // .loadPropertiesFromResources(eurekaPropsFile);
            ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);
        } catch (IOException e) {
            logger.warn("Cannot find the properties specified : {}. This may be okay if there are other environment "
                            + "specific properties or the configuration is installed with a different mechanism.", eurekaPropsFile);
        }
    }
}
  • 调用 #init() 方法,初始化配置文件对象。类似 PropertiesInstanceConfig,点击《Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」查看详细解析。默认配置文件名eureka-server
  • 无配置文件的每个属性 KEY 的枚举类。

原文发布于微信公众号 - 芋道源码(YunaiV)

原文发表时间:2018-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Rainbond开源「容器云平台」

边做边学,基于Spring Cloud的微服务架构最佳实践

19040
来自专栏java沉淀

build.xml: 33: Class not found: javac1.8的解决办法

19230
来自专栏Laoqi's Linux运维专列

shell项目-分发系统-expect

36380
来自专栏积累沉淀

struts2国际化

在struts2中需要做国际化的有: jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化 jsp页面的国际化 第一步 ...

24250
来自专栏IT可乐

eclipse在debug模式下总是自动进入到ThreadPoolExecutor类中

  当我们将web项目发布到tomcat服务器中,并且以debug模式启动的时候,总是自动跳转到 ThreadPoolExecutor 类中,如下: ? 解决办...

23350
来自专栏北京马哥教育

详细到没朋友,一文帮你理清Linux 用户与用户组关系~

15230
来自专栏Java技术栈

SpringCloud动态刷新配置信息

有时候在配置中心有些参数是需要修改的,这时候如何不重启而达到实时生效的效果呢? 添加依赖 <dependencies> ... <depende...

30950
来自专栏xingoo, 一个梦想做发明家的程序员

Oracle卸载

1.关闭oracle所有的服务。可以在windows的服务管理器中关闭; 2.打开注册表:regedit 打开路径: HKEY_LOCAL_MACHINE...

318100
来自专栏Android相关

Gradle For Android(1)--使用AndroidStudio开始Gradle

build.gradle是为了构建Android项目的脚本。Gradle构建脚本并不是使用传统的XML,而是基于Groovy的domain-specific l...

11030
来自专栏黑白安全

Kali Linux安装到U盘

虽然使用其他工具也能将Kali Linux安装到U盘,但是经测试,成功率很低。而且一般是刻录后还需要其他操作以避免刻录为Kali Linux安装盘。借助虚拟机将...

22920

扫码关注云+社区

领取腾讯云代金券