【解决方案】SpringCloud项目优雅发版、部署

背景

SpringCloud分布式项目,部署在多个节点上。一般的发版方式是,使用Kill -15 pid,逐一地关闭、部署、重启。

但中间涉及到一个问题,当执行kill命令时,服务虽然关闭,但Eureka那里依然保存着这台服务器的IP,请求依然会跑到这台服务器上。

直到持续数十秒后,Eureka将该服务的IP剔除掉。

如果请求量大,会导致大量请求在发版的过程中出现异常。所以要想到一个更优雅的方式来部署服务。

方案一:

调用Eureka的接口,让Eureka自动剔除该服务IP。

获取服务的AppID和InstanceID,分别对应响应中的<app>和instanceId

curl -X GET 
  http://IP:port/eureka/apps/

从可用服务列表中剔除该服务

curl -X PUT 
  http://IP:port/eureka/apps/AppID/InstanceID/status?value=DOWN 

将该服务加到可用服务列表中

curl -X PUT 
  http://IP:port/eureka/apps/AppID/InstanceID/status?value=UP 

方案二 :

调用服务接口,服务向Eureka报告为不可用状态

项目中增加配置,重点是service-registry

management.endpoints.web.exposure.include=health,info,service-registry

部署前执行命令

curl -X POST 
  http://IP:port/actuator/service-registry?status=DOWN 
  -H content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8 

部署后执行命令

curl -X POST 
  http://IP:port/actuator/service-registry?status=UP 
  -H content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8 

参考文档

[1]: [2]: [3]: [4]: [5]: [6]:

背景 SpringCloud分布式项目,部署在多个节点上。一般的发版方式是,使用Kill -15 pid,逐一地关闭、部署、重启。 但中间涉及到一个问题,当执行kill命令时,服务虽然关闭,但Eureka那里依然保存着这台服务器的IP,请求依然会跑到这台服务器上。 直到持续数十秒后,Eureka将该服务的IP剔除掉。 如果请求量大,会导致大量请求在发版的过程中出现异常。所以要想到一个更优雅的方式来部署服务。 方案一: 调用Eureka的接口,让Eureka自动剔除该服务IP。 获取服务的AppID和InstanceID,分别对应响应中的 和instanceId curl -X GET http://IP:port/eureka/apps/ 从可用服务列表中剔除该服务 curl -X PUT http://IP:port/eureka/apps/AppID/InstanceID/status?value=DOWN 将该服务加到可用服务列表中 curl -X PUT http://IP:port/eureka/apps/AppID/InstanceID/status?value=UP 方案二 : 调用服务接口,服务向Eureka报告为不可用状态 项目中增加配置,重点是service-registry management.endpoints.web.exposure.include=health,info,service-registry 部署前执行命令 curl -X POST http://IP:port/actuator/service-registry?status=DOWN -H content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8 部署后执行命令 curl -X POST http://IP:port/actuator/service-registry?status=UP -H content-type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8 参考文档 [1]: [2]: [3]: [4]: [5]: [6]:
经验分享 程序员 微信小程序 职场和发展