一、需求
在我们项目发布的时候,如果我们的注册中心使用的是eureka,当我们有多个服务实例,在发布某个服务的时候希望达到平滑的发布,不要在服务的调用过程中出现错误。
eg:
比如:我们的商品服务有2个,我们发布的时候,先发实例A,在发实例B。 假设我们要先发 A 实例,如果A实例已经有正在处理的请求,要正常处理完成,当A实例完全没有流量进入时,在关掉A实例,重启A实例。
二、实现步骤
1、使用 eureka 的 rest api 查询服务列表
发送GET请求,访问/eureka/appscurl --location --request GET 'http://localhost:8761/eureka/apps' \
--header 'Accept: Application/json' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)'
2、使用 eureka 的 rest api 将 服务的状态标记为DOWN。> 此时只是将要下线的服务标记为down了,但是这个服务并没有关掉,还是可以对外提供服务的。
> 在下个eureka client 拉取eureka server 上可用的服务列表时,不会拉取 down 的服务。
> 此时可能需要等待一定的时间(eureka.client.registry-fetch-interval-second=30 + 一定的业务处理时间) 后执行下方的步骤3,保证这台机器上的任务都执行完,没有外来的流量流入就可以关掉服务了。
> 不用再去执行 DELETE /appId/instanceId 这个请求,将这个服务从eureka server上下调,如果处理的慢的话,可能这个服务在下个心跳的时候会再次注册到 eureka server 上。
发送 PUT 请求,访问 /eureka/apps/appId/instanceId/status?value=DOWN。appId 见上图的appId
instanceId 见上图的instanceId
value=[DOWN | UP] DOWN标记服务不可用,UP标记服务可用。curl --location --request PUT 'http://localhost:8761/eureka/apps/PRODUCT-PROVIDER/product-provider:192.168.0.85:8083/status?value=DOWN' \
--header 'Accept: Application/json' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)'
3、正常关闭服务、启动服务
关闭: kill -15 pid
启动: java -jar xxx.java 等等
三、 eureka rest api
四、参考链接