springCloud+consul优雅停机
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | duanxz
来源 | urlify.cn/Ij2IBj
之前的方案:先调用待更新的模块的shutdown的Endpoint,这是springboot的功能实现,consul上可见服务确实下线了,再kill掉进程。但是还会有一些请求被转发到该节点上,导致少量的错误。
总结的几种:
1、直接kill方式关闭服务进程
2、向注册中心发送取消注册命令
3、发指令给注册中心,改变指定微服务的服务状态
4、客户端主动通知注册中心下线
5、设置指定模块的服务的状态,可通过状态变更来实现再eureka的上下线
1、直接kill方式关闭服务进程
kill -9 没有善后
kill -15 有善后 会发送down状态到eureka server
kill java进程【不建议】
这种方式简单粗暴,直接造成的影响就是部分模块调用时出错,如果有多台服务器的话,一台一台地重启还是可以的,前提是调用端得有自己的重试策略,比如使用Feign作为客户端调用接口的话可以配置ribbon的重试策略,而且被调用方得做好幂等策略,防止重试调用时出现重复数据的问题。
2、向注册中心发送取消注册命令
2.1、eureka
向eureka 注册中心发送delete 请求,只是取消注册服务, 当发送心跳时还是会注册到eureka
格式为 eureka地址/eureka/apps/服务名称/实例名称
请求方式为delete
下面是取消注册一个服务的例子。
下图是用postman 发送delete请求
2.2、consul
PUT 请求
http://10.200.110.100:8500/v1/agent/service/deregister/tag-10-200-110-100-8778
参考《consul之:常用API接口》
3、发指令给注册中心,改变指定微服务的服务状态
3.1、eureka
通过eureka变更服务状态的方式实现服务上下线,不会再发送心跳注册到eureka server
3.2、consul
PUT方式:http://10.200.110.100:8500/v1/agent/service/maintenance/tag-10-200-110-100-8778?enable=true&reason=sprint40
参考《consul之:常用API接口》
执行完成后,consul的控制台如下:
观察/tag-10-200-110-100-8778的实时日志,看新请求进来后,再停机
4、客户端主动通知注册中心下线
4.1、eureka
客户端主动通知注册中心下线,下线后不会再注册到eureka了
如果你的eureka客户端是是一个spring boot应用,可以通过调用以下代码通知注册中心下线。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.netflix.discovery.DiscoveryManager;
import com.shm.common.model.RespVO;
import com.shm.common.util.RespUtil;
@RestController
public class OfflineController {
@RequestMapping(value = "/offline", method = RequestMethod.GET)
public RespVO