V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liubx
V2EX  ›  Java

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

  •  
  •   liubx · 2020-08-14 09:58:27 +08:00 · 2995 次点击
    这是一个创建于 1549 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在我使用的方法是:

     DiscoveryManager.getInstance().shutdownComponent();
    

    但是被标记为过时了。

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

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

    16 条回复    2020-08-17 14:13:23 +08:00
    qwerthhusn
        1
    qwerthhusn  
       2020-08-14 10:17:07 +08:00
    kill -15
    qwerthhusn
        2
    qwerthhusn  
       2020-08-14 10:17:21 +08:00
    不行就暴力点,kill -9
    liubx
        3
    liubx  
    OP
       2020-08-14 10:19:56 +08:00
    @qwerthhusn 这样不是会访问到挂了实例吗?我这样做过,发现会有缓存。有十几秒的时间
    gdtdpt
        4
    gdtdpt  
       2020-08-14 10:44:59 +08:00
    @liubx kill -15 是不会的,springboot 会向 eureka 发送完服务下线的消息才停止。
    earther01
        5
    earther01  
       2020-08-14 13:53:40 +08:00
    我理解,eureka client 是有本地缓存的,所以不管用哪种方法通知 eureka server 某服务下线,都要等 client 的缓存失效才能防止路由到到下线服务的情况
    zliea
        6
    zliea  
       2020-08-14 14:14:32 +08:00
    curl -X POST ${manangement.service.host}${manangement.service.port}/actuator/shutdown
    zliea
        7
    zliea  
       2020-08-14 14:16:25 +08:00
    好吧,看错了,是 springcloud 。。。。。。
    luzhh
        8
    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
        9
    luzhh  
       2020-08-14 14:35:27 +08:00
    @luzhh #8 没注意看,不小心 at 了两位 v 友😂
    user9121
        10
    user9121  
       2020-08-14 14:56:37 +08:00
    先用 service-registry 标注服务为 out_of_service 然后等待 eureka server 的缓存,eureka client 的缓存,fegin(rebbon)缓存过期(默认一共是 90 秒),然后 stop.然后部署,健康检查,没问题就继续下一台
    neuliuxi
        11
    neuliuxi  
       2020-08-14 15:09:19 +08:00
    用 eureka 作为注册中心,下线后一定会有一个过期时间,只是时间长短的问题,所以你需要配置服务的超时、重试,甚至于熔断降级
    BBCCBB
        12
    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
        13
    amon  
       2020-08-14 15:30:59 +08:00
    参考官方文档,有提供 rest 接口。
    https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
    amoyiki
        14
    amoyiki  
       2020-08-14 15:35:03 +08:00
    借个楼。 我也有遇到类似这方面的,主要是 docker swarm 更新服务后有一小段时间服务不可用。
    理想场景:
    docker health 检查正常后再注册到 eureka 上。下线时,先下线服务,等旧请求全部处理完后,eureka 下线。再隔个十几秒关闭容器。
    不知道各位有没有这样的解决方案
    liubx
        15
    liubx  
    OP
       2020-08-17 09:39:11 +08:00
    @neuliuxi 请问是在网关做,重试和熔断吗?
    qwerthhusn
        16
    qwerthhusn  
       2020-08-17 14:13:23 +08:00
    不过我感觉 eureka 的取消注册实例好像不管用,即使关了自我保护模式,服务下线了,还是会请求到
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2810 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:14 · PVG 17:14 · LAX 01:14 · JFK 04:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.