springcloud 服务下线,有什么好方法吗?

2020-08-14 09:58:27 +08:00
 liubx

现在我使用的方法是:

 DiscoveryManager.getInstance().shutdownComponent();

但是被标记为过时了。

还有种方法是使用 springboot-actuator 的/actuator/service-registry这个接口。

请问,有什么更好的方法吗?

2830 次点击
所在节点    Java
16 条回复
qwerthhusn
2020-08-14 10:17:07 +08:00
kill -15
qwerthhusn
2020-08-14 10:17:21 +08:00
不行就暴力点,kill -9
liubx
2020-08-14 10:19:56 +08:00
@qwerthhusn 这样不是会访问到挂了实例吗?我这样做过,发现会有缓存。有十几秒的时间
gdtdpt
2020-08-14 10:44:59 +08:00
@liubx kill -15 是不会的,springboot 会向 eureka 发送完服务下线的消息才停止。
earther01
2020-08-14 13:53:40 +08:00
我理解,eureka client 是有本地缓存的,所以不管用哪种方法通知 eureka server 某服务下线,都要等 client 的缓存失效才能防止路由到到下线服务的情况
zliea
2020-08-14 14:14:32 +08:00
curl -X POST ${manangement.service.host}${manangement.service.port}/actuator/shutdown
zliea
2020-08-14 14:16:25 +08:00
好吧,看错了,是 springcloud 。。。。。。
luzhh
2020-08-14 14:34:12 +08:00
我之前用 consul,用下面的代码可以从注册中心移除当前实例,我当时是写了个接口,请求接口从之后再 shutdown
```
private ConsulClient consulClient;
private ConsulRegistration consulRegistration;

@Autowired
public ConsulServiceController(ConsulClient consulClient, ConsulRegistration consulRegistration) {
this.consulClient = consulClient;
this.consulRegistration = consulRegistration;
}

@RequestMapping(value = "/service/leave")
public Boolean leave() {
consulClient.agentServiceDeregister(consulRegistration.getInstanceId());
return true;
}

```
当然用 kill -15 效果是一样的
luzhh
2020-08-14 14:35:27 +08:00
@luzhh #8 没注意看,不小心 at 了两位 v 友😂
ashe900501
2020-08-14 14:56:37 +08:00
先用 service-registry 标注服务为 out_of_service 然后等待 eureka server 的缓存,eureka client 的缓存,fegin(rebbon)缓存过期(默认一共是 90 秒),然后 stop.然后部署,健康检查,没问题就继续下一台
neuliuxi
2020-08-14 15:09:19 +08:00
用 eureka 作为注册中心,下线后一定会有一个过期时间,只是时间长短的问题,所以你需要配置服务的超时、重试,甚至于熔断降级
BBCCBB
2020-08-14 15:26:31 +08:00
http://www.appblog.cn/2019/11/21/Spring%20Boot%202.0%20%E4%B9%8B%E4%BC%98%E9%9B%85%E5%81%9C%E6%9C%BA/

参考这个呢, 先从 eureka 下线, 再把 servlet 容器暂停, 等处理完剩下的请求就可以销毁了.
amon
2020-08-14 15:30:59 +08:00
参考官方文档,有提供 rest 接口。
https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
amoyiki
2020-08-14 15:35:03 +08:00
借个楼。 我也有遇到类似这方面的,主要是 docker swarm 更新服务后有一小段时间服务不可用。
理想场景:
docker health 检查正常后再注册到 eureka 上。下线时,先下线服务,等旧请求全部处理完后,eureka 下线。再隔个十几秒关闭容器。
不知道各位有没有这样的解决方案
liubx
2020-08-17 09:39:11 +08:00
@neuliuxi 请问是在网关做,重试和熔断吗?
qwerthhusn
2020-08-17 14:13:23 +08:00
不过我感觉 eureka 的取消注册实例好像不管用,即使关了自我保护模式,服务下线了,还是会请求到

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX