1. 概述
本文主要分享 Eureka-Server 启动的过程.
考虑到整个初始化的过程中涉及的代码特别多, 拆分成两两篇文章:
[本文] ServerConfig
EurekaBootStrap
推荐 Spring Cloud 书籍:
请支持正版. 下载盗版, 等于主动编写低级 BUG .
程序猿 DD -- 《Spring Cloud 微服务实战》 https://union-click.jd.com/jdc?d=505Twi
周立 -- 《Spring Cloud 与 Docker 微服务架构实战》 https://union-click.jd.com/jdc?d=k3sAaK
两书齐买, 京东包邮.
推荐 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 配置属性
点击 查看配置属性简介, 已经添加中文注释, 可以对照着英文注释一起理解. 这里笔者摘出部分较为重要的属性:
请求认证相关
Eureka-Server 未实现认证. 在 Spring-Cloud-Eureka-Server, 通过
spring-boot-starter-security
模块支持.《spring cloud - 给 Eureka Server 加上安全的用户认证》有详细解析.
#shouldLogIdentityHeaders()
: 打印访问的客户端名和版本号, 配合 Netflix Servo https://github.com/Netflix/servo 实现监控信息采集.
请求限流相关
《Eureka 源码解析 -- 基于令牌桶算法的 RateLimiter》 http://www.iocoder.cn/Eureka/rate-limiter/?self 有详细解析.
#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 远程节点 ( 非集群 ) 读取相关
- TODO[0009]:RemoteRegionRegistry
- #getRemoteRegionUrlsWithName()
- :TODO[0009]:RemoteRegionRegistry.
key :Eureka-Server 区域( region )
value :Eureka-Server 地址
- #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 的枚举类.
来源: https://juejin.im/entry/5c12d6836fb9a049c30b1f0f