现在由于 eureka 服务越来越多, 发现服务提供者在停掉很久之后, 服务调用者很长时间并没有感知到变化, 依旧还在持续调用下线的服务, 导致长时间后才能返回错误, 因此需要调整 eureka 服务和客户端的配置, 以便实现服务下线后快速感知.
需要调整服务注册中心, 服务提供者和服务消费者三个配置.
服务注册中心 EurekaServer
先上要更改的配置:
- eureka:
- server: #配置属性, 但由于 Eureka 自我保护模式以及心跳周期长的原因, 经常会遇到 Eureka Server 不剔除已关停的节点的问题
- enable-self-preservation: false # 设为 false, 关闭自我保护
- eviction-interval-timer-in-ms: 5000 # 清理间隔 (单位毫秒, 默认是 60*1000) 启用主动失效, 并且每次主动失效检测间隔为 3s
1. 先要关闭自我保护 enable-self-preservation: false
2.eviction-interval-timer-in-ms 启用主动失效, 并且每次主动失效检测间隔为 5s
Eureka Server 会定时 (间隔值是 eureka.server.eviction-interval-timer-in-ms, 默认值为 0, 默认情况不删除实例) 进行检查, 如果发现实例在在一定时间 (此值由客户端设置的 eureka.instance.lease-expiration-duration-in-seconds 定义, 默认值为 90s) 内没有收到心跳, 则会注销此实例.
有些文档指出还需要设置下面的两个参数(上下两种写法), 但都测试后暂时没发现什么强关联性, 这里暂时先不设置.
Eureka 服务提供方, Eureka 服务调用方修改如下配置:
- eureka:
- instance:
- prefer-ip-address: true
- lease-renewal-interval-in-seconds: 4
- lease-expiration-duration-in-seconds: 12
- client:
- serviceUrl:
- defaultZone: http://localhost:1025/eureka
- fetch-registry: true
- registry-fetch-interval-seconds: 8
客户端通过 eureka.instance.lease-renewal-interval-in-seconds 每隔这个时间会主动心跳一次, 默认值为 30s, 更新自己的状态. Eureka Server 收到心跳后, 会通知集群里的其它 Eureka Server 更新此实例的状态.
lease-expiration-duration-in-seconds 设置服务过期时间配置, 超过这个时间没有接收到心跳 EurekaServer 就会将这个实例剔除, 一般是 lease-renewal-interval-in-seconds 的 3 倍.
Eureka Server 会定时 (间隔值是 eureka.server.eviction-interval-timer-in-ms, 默认值为 0, 默认情况不删除实例) 进行检查, 如果发现实例在在一定时间 (此值由 eureka.instance.lease-expiration-duration-in-seconds 定义, 默认值为 90s) 内没有收到心跳, 则会注销此实例.
经过测试设置 4s 上报一次心跳, 12s 内无跳就让注册中心剔除服务比较合理, 上报时间若为 2s,1000 个服务会造成对注册中心请求的压力, 且 2s 有可能网络抖动, 整个时长 6s 无响应就判为下线会造成并发压力.
消费端为了能快速响应服务请求会从 Eureka Server 拉取服务地址清单后缓存到本地(后面会增量获取),fetch-registry 要设置为 true, 定期的更新客户端的服务清单时间 registry-fetch-interval-seconds: 8, 这是消费端的设置.
测试总结
只设置服务端 Eureka Server 的配置是无效的, 还需要设置客户端来配合.
调用方访问一个在注册中心不存在服务 ID 响应是非常快的, 但如果访问一个 ID 还存在, 但对应 ip 服务已经挂了的服务就是 404, 长时间无响应.
服务提供者进程意外退出或服务完全卡住 (是整个服务无法响应) 情况是一样的, 都是在指定服务的 lease-expiration-duration-in-seconds 时间内无心跳就会从注册中心剔除.
注册中心把服务剔除后, 调用方还需要时间刷新到本地缓存.
来源: https://www.cnblogs.com/zhangs1986/p/10529815.html