之前写了一篇文章介绍,应用SpringCloud的多个服务实例的情况下,怎样无感知的更新实例代码。 连接:https://www.jianshu.com/p/9d29b3d0e394但是由于需要在每个服务实例上增加一个接口,对服务不是特别友好,今天再来介绍一种不侵入代码的方法,可以更加灵活优雅
Eureka的服务状态Status
UP, // Ready to receive traffic 正常可用状态
DOWN, // Do not send traffic- healthcheck callback failed
STARTING, // Just about starting- initializations to be done - do not send traffic
OUT_OF_SERVICE, // Intentionally shutdown for traffic
UNKNOWN;
实现思路
当有多个服务实例时,可以将其中一个服务实例的状态设置为OUT_OF_SERVICE,这样该实例将不会再接受服务请求,正在执行的服务线程会执行完毕,等没有服务请求到该服务实例时,就可以kill掉进程,部署新的代码了,这样逐个更换服务实例,直到将所有的实例代码完成更新,而客户端的请求不会在此期间中断。
-示例
curl -i -X PUT http://localhost:8761/eureka/apps/client1/127.0.0.1:client1:8081/status?value=OUT_OF_SERVICE
注意事项
因为eureka上的服务更新有缓存的作用,有时更新不是很及时,如果服务OUT_OF_SERVICE的状态下,杀掉进程马上重启,可能eureka集群还没有感知到服务的关闭状态,导致新启动的服务还是被认为是OUT_OF_SERVICE状态,可以在kill掉进程以后,再通知eureka删除服务,这样当服务重新启动就会以新的状态注册上去, 或者调整缓存和心跳时间,让eureka快速感知到服务的关闭。
curl -i -X DELETE http://localhost:8761/eureka/apps/client1/127.0.0.1:client1:8081/status