注册中心 Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig
时间:2022-05-06
本文章向大家介绍注册中心 Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig,主要内容包括2. EurekaServerConfig、2.2 配置属性、2.3 DefaultEurekaServerConfig、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
本文主要基于 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.EurekaServerConfig
,Eureka-Server 配置接口。
2.1 类关系图
2.2 配置属性
点击 EurekaServerConfig 查看配置属性简介,已经添加中文注释,可以对照着英文注释一起理解。这里笔者摘出部分较为重要的属性:
-
请求认证相关
- Eureka-Server 未实现认证。在 Spring-Cloud-Eureka-Server,通过
spring-boot-starter-security
模块支持。《spring cloud-给Eureka Server加上安全的用户认证》有详细解析。 -
#shouldLogIdentityHeaders()
:打印访问的客户端名和版本号,配合 Netflix Servo 实现监控信息采集。
- Eureka-Server 未实现认证。在 Spring-Cloud-Eureka-Server,通过
-
请求限流相关
- 《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 的枚举类。
- Android查缺补漏(View篇)--自定义 View 的基本流程
- CVPR2018: Unsupervised Cross-dataset Person Re-identification by Transfer Learning of Spatio-tempora
- 一个数据包消灭一台服务器的DNS漏洞
- java文件基本操作与实例
- 如何在Azkaban中安装HDFS插件以及与CDH集成
- CVE-2017-5123 漏洞利用全攻略
- sqlmap被ban了ip怎么办
- 毫秒级检测!你见过带GPU的树莓派吗?
- 达观数据对AngularJS技术的思考与实践
- hadoop配置文件
- 推荐一款src自动化扫描和收集的工具
- 蓝桥杯:兰顿蚂蚁
- 蓝桥杯:矩阵翻硬币
- PTA 字符串关键字的散列映射(25 分)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前后端数据交互-json 你还不会传集合吗?
- 动态规划-背包问题(01背包、完全背包、多重背包)
- 疫情数据分析与展示--小程序版
- 动态规划-LCS、LIS
- 图书管理系统设计与实现—看这篇就够了
- 动态规划-区间DP
- 动态规划-树形DP
- 面试官:你精通多少种语言的 Hello World?
- Redis安装(Windows和Linux)详细图解
- 史上最详细版 头文件biso.h,graphics.h,libbgi.a
- ZooKeeper入门,这一篇给你讲的明明白白
- 数论-GCD、LCM、扩展欧几里得
- “豪 横”版 channel_v3.json,你确定不需要?
- Redis-性能测试(redis-benchmark)
- 一条贪吃蛇的使命——零基础入门贪吃蛇游戏