重新定义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秒

posted @ 2019-03-18 17:07  lab_or_hub  阅读(45)  评论(0编辑  收藏  举报