一、Client 端参数
Client 端相关参数在 EurekaClientConfigBean
和 EurekaInstanceConfigBean
中
EurekaClientConfigBean
相关参数前缀为 eureka.client
EurekaInstanceConfigBean
相关参数前缀为 eureka.instance
针对这些参数配置能够分为:基本参数,定时任务参数,http参数
1.1、基本参数
运行时生效:在运行时的下一个注册表获取周期中有效,该配置-周期时长由
registryFetchIntervalSeconds
控制
参数 | 类型 | 默认值 | 描述 | 是否运行时生效 |
---|---|---|---|---|
eureka.client. availabilityZones |
Map |
new HashMap<>() | 获取此实例所在区域 的可用性区域列表() |
yes |
eureka.client. filterOnlyUpInstances |
boolean | true | 获取实例列表前,先过滤 出状态为 UP 的实例。 |
|
eureka.client. region |
String | us-east-1 | 获取实例驻留的区域( 在 AWS 数据中心中使用) |
|
eureka.client. registerWithEureka |
boolean | true | 实例是否注册到 EurekaServer 中, 让其他服务发现。(在某些场景, 实例只想获取其他服务信息, 但不想让其他服务获取自己的信息) |
|
eureka.client. preferSameZoneEureka |
boolean | true | 是否优先使用相同 zone 中的实例(不同zone存在多个相同实例下) | yes |
eureka.client. onDemandUpdateStatusChange |
boolean | true | 是否将本地实例状态的更新通过 ApplicationInfoManager 实时触发同步(有请求流控限制)到 Eureka Server |
|
eureka.instance. metadataMap |
Map |
new HashMap<>() | 服务实例 key-value 形式的元信息,能够被其他实例使用 | |
eureka.instance. preferIpAddress |
boolean | false | 是否优先使用IP地址来代替 hostname 作为实例中的 hostName 值 | |
eureka.instance. leaseExpirationDurationInSeconds |
int | 90(单位:秒) | 实例发送心跳时间间隔,eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance.(太长,下线的实例注册信息长期存在,导致系统问题,太短,可能因为网络分区导致正常的服务实例,被剔除,需要重新注册)) |
1.2、定时任务参数
参数 | 类型 | 默认值 | 描述 | 是否运行时生效 |
---|---|---|---|---|
eureka.client. cacheRefreshExecutorThreadPoolSize |
int | 2 | CacheRefreshExecutor 线程池初始化大小。 | |
eureka.client. cacheRefreshExecutorExponentialBackOffBound |
int | 10 | CacheRefresh 发生超时时,重试延迟的最大乘数因子 | |
eureka.client. heartbeatExecutorThreadPoolSize |
int | 2 | HheartbeatExecutor 线程池初始化大小。 | |
eureka.client. heartbeatExecutorExponentialBackOffBound |
int | 10 | 心跳维持发生超时时,重试延迟的最大乘数因子 | |
eureka.client. registryFetchIntervalSeconds |
int | 30(单位:秒) | 从eureka服务器获取注册表信息的频率(以秒为单位) | yes |
eureka.client. eurekaServiceUrlPollIntervalSeconds |
int | 5 * 60(单位秒) | 轮询对查看 Eureka 的配置信息是否发生更改,如果发生更改,需要马上更新 | |
eureka.client. initialInstanceInfoReplicationIntervalSeconds |
int | 40 | 实例信息变更同步到 Eureka Server 初始延时时间 | |
eureka.client. instanceInfoReplicationIntervalSeconds |
int | 30 | 实例信息变更同步到 Eureka Server 的时间间隔 | |
eureka.instance. leaseRenewalIntervalInSeconds |
int | 30 | Client 端向 Server 端发送心跳的时间间隔(单位:秒)该值y应该小于 leaseExpirationDurationInSeconds |
1.3、http参数
Eureka Client 底层 httpClient 与 Eureka Server 通信相关参数配置
参数 | 类型 | 描述 | |
---|---|---|---|
eureka.client. eurekaServerConnectTimeoutSeconds |
int | 5(单位:秒) | Eureka Client 通过 httpClient 连接 Eureka Server 的超时时长 |
eureka.client. eurekaServerReadTimeoutSeconds |
int | 8(单位:秒) | Eureka Client 从 Eureka Server 读取信息的超时时长 |
eureka.client. eurekaServerTotalConnections |
int | 200 | Eureka Clietn 连接 Eureka Server 允许的最大连接数 |
eureka.client. eurekaServerTotalConnectionsPerHost |
int | 50 | 每个 Eureka Server 能够被连接的 Eureka Client 的最大数量 |
eureka.client eurekaConnectionIdleTimeoutSeconds |
int | 30 | Eureka Client 与 Eureka Server 建立连接在指定时间内没有操作,则关闭连接 |
二、Server 端参数
Server 端的配置在 EurekaServerConfigBean
和 EurekaInstanceConfigBean
中,
EurekaServerConfigBean
前缀为:eureka.server
EurekaInstanceConfigBean
前缀为:eureka.instance
2.1、基本参数
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
eureka.server. enableSelfPreservation |
boolean | true | 是否开启自我保护模式 |
eureka.server. renewalPercentThreshold |
double | 0.85 | 每分钟需要收到的续约次数的阈值 |
eureka.server. renewalThresholdUpdateIntervalMs |
int | 15 * 60 (单位:秒) | 指定 updateRenewalThreshold 定时任务的调度频率,来动态更新 expectedNumnberOfRenewsPerMin 和 unmberOfRenewsPerMinThreshold 值 |
eureka.server. evictionIntervalTimerInMs |
long | 60 * 1000 | 指定 Eviction Task 定时任务调度频率,用于剔除过期的实例 |
2.2、response cache 参数
Eureka Server 为了提升 Rest API 接口性能,提供了两个缓存:
- 基于 ConcurrentMap 的 readOnlyCacheMap
- 基于 Guava Chace 的 readWriteCacheMap
相关参数配置如下:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
eureka.server. useReadOnlyResponseCache |
boolean | true | 是否使用制度的 response-cache |
eureka.server. responseCacheUpdateIntervalMs |
long | 30 * 1000 | 设置 CacheUpdateTask 的调度时间间隔,用于 readWriteCacheMap 更新数据到 readOnlyCacheMap。 |
eureka.server.responseCacheAutoExpirationInSeconds |
long | 180 | 设置 readWriteCacheMap 的 expireAfterWrite 参数,指定写入多长时间后过期 |
2.3、peer 相关参数
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
eureka.server. peerEurekaNodesUpdateIntervalMs |
int | 10 * 60 | 指定 PeersUpdateTask 调度的时间间隔,用于从配置文件刷新 peerEurekaNodes 节点的配置信息(eureka.client.serviceUrl 相关 zone 的配置 ) |
eureka.server. peerEurekaStatusRefreshTimeIntervalMs |
int | 30 * 1000 | 指定更新 peer nodes 状态信息的时间间隔 |
2.4、Http 相关参数
Eureka Server 需要与其他 peer 节点进行通信,复制实例信息,底层使用的 httpClient
相关参数如下:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
eureka.server. peerNodeConnectTimeoutMs |
int | 200 | 连接超时时间 |
eureka.server. peerNodeReadTimeoutMs |
int | 200 | 读超时时间 |
eureka.server. peerNodeTotalConnections |
int | 1000 | 最大活动连接数 |
eureka.server. peerNodeTotalConnectionsPerHost |
int | 500 | 每个 host 能使用的最大连接数 |
eureka.server. peerNodeConnectionIdleTimeoutSeconds |
int | 30 | 连接空闲时间 |
三、参数调优
3.1、为什么服务下线了,Eureka Client 端仍然可以获取到下线实例的信息
分析
Eureka Server 本身是一个 AP 模型的架构设计,所以数据是非强一致性,因此服务即使下线了,Eureka Server 注册表中的服务实例信息,并不会马上被清除。
造成数据非强一致性的原因如下:
- 原因一:应用实例异常挂掉,没能在挂掉之前告知 Eureka Server 要下线掉该服务实例信息。需要依赖 Eureka Server 的 EvictionTask 定时去剔除。
- 原因二:应用实例下线时有告知 Eureka Server 下线,但是由于 Eureka Server 的 Rest API 有 response cache ,需要等待缓存过期才能更新。
- 原因三:Eureka Server 由于开启并移入 SELF PRESERVATION 模式,导致 注册表信息不会因为过期而被剔除,直到退出 SELF PRESERVATION 模式。
针对上述不同原因造成的解决办法如下:
调整
EvictionTask
调度频率。通过配置参数
eureka.server.evictionIntervalTimerInMs
,该值默认为:60000 ms = 60s 。调整 readWriteCacheMap 的过期时间,使得 response cache 更快过期。
通过配置参数
responseCacheAutoExpirationInSeconds
,该值默认为:180 s。提高触发 SELF PRESERVATION 模式的阈值
通过配置参数
eureka.client.leaseRenewalIntervalInSeconds
缩短client 的心跳发送间隔。 通过配置参数eureka.server.renewalPercentThreshold
每分钟需要收到的续约次数的阈值
3.2、为什么服务上线了,Eureka Client 端无法获取到上线实例的信息
Eureka Client 拉取 Server 注册信息的频率为默认为 30 s ,可以通过更改配置 eureka.client.registryFetchIntervalSeconds
适当提高 Client 端拉取 Server 注册信息的频率。
3.3、Eureka Server 的自我保护机制(SELF PRESERVATION)
自我保护机制的作用,在实际生产过程中,可能由于网络抖动导致服务实例与 Eureka Server 的心跳维持被中断,但是此时服务实例本身是健康的。
如果此时开启了自我保护机制,Eureka 图形界面会出现如下红色描述,且实例的注册信息不会被定时任务剔除
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
如果此时关闭了自我保护机制,Eureka 图形界面会出现如下红色描述,且实例的注册信息会在执行下一次提出定时任务时被剔除
THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
自我保护机制调优
如果关闭自我保护机制,会导致健康的服务由于网络抖动被误判为下线的实例信息,被定时任务给全部剔除,从而导致这个服务注册列表的大部分注册信息被删除,从而没有可用服务。
如果开启自我保护机制,当最近一分钟接收到的续约次数小于等于指定阈值的话,触发自我保护机制,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。不过默认的触发门槛比较低为 0.85 很容易便触发自我保护机制。
在生产环境可以通过调优的方式,提高触发 自我保护机制的门槛
参数一:
eureka.instance.leaseRenewalIntervalInSeconds
Client 端向 Server 端发送心跳的时间间隔(单位:秒)。默认:30s。 可以降低该值,比如:10s。以此来缩短服务实例下线状态判断的时间间隔。
参数二:
eureka.server.renewalPercentThreshold
续约次数阈值,默认:0.85. 可以降低该值,比如:0.49 ,以此来提高触发自我保护机制的门槛。