spring-cloud /pause 平滑升级 踩坑记录
0、客户端添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1、eureka 客户端 添加配置
endpoints.pause.enabled=true
endpoints.pause.sensitive=false
#用pause了 shutdown 就可以不开启了
management.security.enabled=false
# restart 必须要开启的,pause 必须要依赖 restart
endpoints.restart.enabled=true
2、注意配置
eureka.client.healthcheck.enabled=true
management.contextPath=/management
而当我们设置配置eureka.client.healthcheck.enabled=true
的时候,即使调用/pause
端点,Eureka上服务的状态也会是UP
注:当应用在Eureka Server上的状态已被标记为DOWN
,但是应用本身其实依然是可以正常对外服务的,并没有被关闭,而在Spring Cloud中,Ribbon做负载均衡时,只会负载到标记为UP
的实例上。
3、服务启动时,控制台会打印出所有端口
参考:
https://blog.csdn.net/u010629610/article/details/88045980
4、请求 /pause 接口后,该服务在eureka 上显示 down ,但是 30秒内rubbon 还是会分配请求给这个服务,30秒后该服务不可用,
eureka.client.fetch-registry=true
eureka.client.registry-fetch-interval-seconds=5
这两个配置 第一个默认是开启,第二个意思是每5秒从eureka拉取一次服务列表信息,但是测试时还是30秒才更新,
原因是:
Eureka Server 针对请求响应ResponseCache,采用了一个2级缓存:readWrite cache读写缓存(存在过期时间) 和 readonly cache只读缓存(没有过期时间)
eureka: server: use-read-only-response-cache: true # 是否使用只读缓存作为请求响应的缓存,默认启用 response-cache-update-interval-ms: 30000 # 用于一级响应缓存多久更新一次,默认30秒 initial-capacity-of-response-cache: 1000 # 用于定义二级响应缓存的容量大小,默认1000 response-cache-auto-expiration-in-seconds: 180 # 二级响应缓存自动失效时间,默认180秒
- 一级二级缓存获取规则
当开启使用一级缓存时,会从一级缓存获取信息,否则直接从二级缓存取
当第一次获取缓存时(一级缓存为null),会从二级缓存获取并将信息存入一级缓存(只读缓存)中
缓存失效
-
一级缓存不存在自动失效期和手动清除
-
二级缓存存在默认180s自动清除以及当注册服务下线,过期,注册,状态变更,都会来清除里面的数据
另外当二级缓存数据被清除以后以后,只能依靠定时任务刷新一级缓存里面的数据,也就是说最快也要等默认的30s才能更新一级缓存
- 一级缓存是默认开启的,如果不能忍受这30秒的响应缓存变更延迟,可以手动禁止使用一级缓存,然后把二级缓存改为你能忍受的时间
参考:https://www.jianshu.com/p/71a8bdbf03f4