Eureka Configuration 官方介绍

一、Client 端参数

Client 端相关参数在 EurekaClientConfigBeanEurekaInstanceConfigBean

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 端的配置在 EurekaServerConfigBeanEurekaInstanceConfigBean中,

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 ,以此来提高触发自我保护机制的门槛。