SpringCloud微服务项目-无感知动态调整服务实例数量以及更新代码(代码无侵入)

之前写了一篇文章介绍,应用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。