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

原文地址:https://www.cnblogs.com/feiye512/p/11550771.html