重新定义Spring cloud实战笔记------eureka参数调优
阅读书籍笔记 -------摘自《重新定义Spring cloud实战》
eureka中的核心参数:
client端核心参数:
eureka:
client:
##=========>基本参数<============
#告知Client有哪些region和availability-zones,支持配置修改运行时生效
availability-zones: null
#是否过滤出注册到eureka中所有InstanceStatus为UP的实例,默认为true
filter-only-up-instances: true
#是否将该实例注册到 eureka server,eureka注册中心配置为false,不把自身注册到eureka
register-with-eureka: true
#是否优先使用与该实例处于相同zone的Eureka server ,默认为true,
#即默认会使用与实力处于相同zone的server,如果找不到,才会默认使用defaultZone中配置的
prefer-same-zone-eureka: true
#是否将本地实例状态通过ApplicationInfoManager实时同步到到Eureka Server中,默认是true,一般情况下不要改,默认就行
on-demand-update-status-change: true
##=========>定时任务参数<============
#指定用于刷新缓存的CacheRefreshThread的线程池大小,默认是2个
cache-refresh-executor-thread-pool-size: 2
#调度任务执行超时时,下次再次执行的延时时间
cache-refresh-executor-exponential-back-off-bound: 12
#发送心跳线程的线程池大小
heartbeat-executor-thread-pool-size: 3
#CacherefreshThread线程的调度频率,eureka默认30秒刷新一次缓存
registry-fetch-interval-seconds: 30
#刷新Eureka Server地址的时间间隔
eureka-service-url-poll-interval-seconds: 300
#instanceInfoReplication将实例信息变更同步到Eureka Server的初始延时时间,默认40秒
initial-instance-info-replication-interval-seconds: 40
#InstanceInfoReplication将实例信息变更同步到Eureka Server的时间间隔
instance-info-replication-interval-seconds: 30
##=========>http参数<============
#连接server的超时时间 默认5秒
eureka-server-connect-timeout-seconds: 5
#client 从server读取数据超时时间,默认8秒
eureka-server-read-timeout-seconds: 8
#连接池最大的活动链接数 最大默认200个连接数
eureka-server-total-connections: 200
#每个host能使用的最大连接数 ,默认每个主机最多只能使用50个练级
eureka-server-total-connections-per-host: 50
#连接池中连接的空闲时间
eureka-connection-idle-timeout-seconds: 30
instance:
##=========>基本参数<============
#指定该应用实例的元数据信息
metadata-map:
#是否优先使用IP地址来代替host name作为市里的hostname字段值,默认是false
prefer-ip-address: false
#指定Eureka Client间隔多久向Eureka Server发送心跳来告知Eureka Server该实例还存活,默认是90秒
lease-expiration-duration-in-seconds: 30
##=========>定时任务参数<============
#Eureka Client向Server发送心跳的时间间隔,默认CLient隔30秒就会向Server发送一次心跳
lease-renewal-interval-in-seconds: 30
Server端参数
eureka:
server:
##=========>基本参数<============
#是否开启自我保护模式,默认是开启的
enable-self-preservation: true
#每分钟需要收到的续约次数的阈值 server会根据某个应用注册时实例数,计算每分钟应收到的续约次数
#若收到的次数少于该阈值,server会关闭该租约,并禁止定时任务剔除失效的实例,保护注册信息
renewal-percent-threshold: 0.85
#指定updateRenewalThreshold定时任务的调度频率,来动态更新expectedNumberOfRenewsPerMin和numberOfRenewsPerMinThreshold值
renewal-threshold-update-interval-ms: 15
#指定EvictionTask定时任务的调度频率,用于剔除过期的实例,默认是60秒执行一次
eviction-interval-timer-in-ms: 60000
##=========>response cache参数<============
#是否使用只读的response-cache,默认是使用
use-read-only-response-cache: true
#设置CacheUpdateTask的调度时间间隔,用于从readWriteCacheMap更新数据到readOnlyCacheMap
#仅在use-read-only-response-cache设置为true是才生效
response-cache-update-interval-ms: 30000
#设置readWriteCacheMap的expireAfterWrite参数,指定写入多长时间后,cache过期
response-cache-auto-expiration-in-seconds: 180
##=========>peer参数 eureka server节点间同步数据的配置<============
#指定peerUpdateTask调度的时间间隔,
#用于从配置文件刷新peerEurekaNodes节点之间的配置信息(eureka.client.serviceUrl相关的zone的配置)
#默认10分钟
peer-eureka-nodes-update-interval-ms: 10
#指定更新peer node状态的时间间隔,默认30秒更新各node间的状态信息
peer-eureka-status-refresh-time-interval-ms: 30000
##=========>http参数<============
#server各node间连接超时时长,默认200毫秒,200毫秒没连接上server的其他节点,就会认为该node不可用
peer-node-connect-timeout-ms: 200
#从其他节点读取数据超时时间 ,默认200毫秒
peer-node-read-timeout-ms: 200
#server的单个node连接池最大的活动连接数
peer-node-total-connections: 1000
#server的单个node每个hot能使用的最大连接数
peer-node-total-connections-per-host: 500
#server的node连接池连接的空闲时间
peer-node-connection-idle-timeout-seconds: 30
instance:
registry:
##=========>基本参数<============
#指定每分钟需要收到的续约次数值,实际该值被写死为实例值*2
expected-number-of-clients-sending-renews: 1
参数调优
一般最简单常见的问题有这几个:
服务下线了,为什么还能调通接口
服务注册了,Client不能及时获取到
自我保护机制。
解决办法
1 因为Eureka不是强一致性的,因此registry中会有过期的实例信息,实例过期有以下原因
-应用实例异常挂掉,在挂掉之前没来得及通知Eureka Server要下线掉自己这个实例。这个要Eureka的 EvicitionTask去剔除了
-应用实例下线时有通知Server下线自己这个实例,但是由于Server 的API有启用readOnlyCache,所以需要等 待缓存过期才能更新
-由于Server开启了自我保护机制,导致registry不能因过期而剔除
针对Client下线,没来得及通知server,可以调整EvictionTask的调度频率,加快剔除过期实例的频率
针对responseCache问题,可以根据实际情况关机readOnlyCacheMap,或者调整readWriteCacheMap的过期时间,缩短点cache过期时间
针对自我保护机制,测试环境可以适当选择关闭自我保护机制。但是有时候,由于网络问题,Client的续约未能如期保持,但是服务本身是将康的,这个时候按照租约机制剔除的话,会造成误判。可以选择适当的调低触发自我保护机制的阈值,或者调低client向Server发送心跳的时间间隔
针对服务上线了,Client不能及时获取到,可以适当提高Client获取Server注册信息的频率,如将30秒改为5秒