【解决方案】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,分别对应响应中的