一、需求

在我们项目发布的时候,如果我们的注册中心使用的是eureka,当我们有多个服务实例,在发布某个服务的时候希望达到平滑的发布,不要在服务的调用过程中出现错误。

eg:
比如:我们的商品服务有2个,我们发布的时候,先发实例A,在发实例B。 假设我们要先发 A 实例,如果A实例已经有正在处理的请求,要正常处理完成,当A实例完全没有流量进入时,在关掉A实例,重启A实例。

二、实现步骤

1、使用 eureka 的 rest api 查询服务列表

发送GET请求,访问/eureka/apps

curl --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)'

标记服务DOWN

3、正常关闭服务、启动服务

关闭: kill -15 pid
启动: java -jar xxx.java 等等

三、 eureka rest api

eureka rest api

四、参考链接

1、https://github.com/Netflix/eureka/wiki/Eureka-REST-operations


huan1993
207 声望31 粉丝

java工程师