Spring Boot2.x Eureka 主动下线服务与优雅停机(Graceful Shutdown)

参考

注意

  1. Spring Boot 还支持关闭事件监听,在监听事件内可以编写代码实现关闭前的清理工作。
  2. Eureka 主动下线方式有多种,本文 DiscoveryManager.getInstance().shutdownComponent(); 方式提示方法过时。
  3. 主动下线服务与优雅停机是两个东西,可以单独任意使用,只是写在了一篇文章中。

环境

环境 版本 说明
Windows 10
VS Code 1.85.1
Spring Boot Extension Pack v0.2.1 vscode插件
Extension Pack for Java v0.25.15 vscode插件
JDK 11
Spring Boot 2.3.12.RELEASE
spring-cloud-dependencies Hoxton.SR12 mvn依赖
spring-cloud-starter-netflix-eureka-client 未设置 mvn依赖
spring-cloud-starter-netflix-eureka-server 未设置 mvn依赖
spring-cloud-starter-openfeign 未设置 mvn依赖

Eureka主动下线服务

  1. 任意服务,开放任意接口,执行以下代码即可主动退出服务中心,并且不会再次主动加入服务中心:
    ...
    import com.netflix.discovery.DiscoveryManager;
    ...
    DiscoveryManager.getInstance().shutdownComponent();
    

优雅停机

准备

Spring Boot 2.3 + 新增内置功能,无需添加依赖。

  1. 修改 application.properties

    #开启优雅停机,默认是立即停机IMMEDIATE
    server.shutdown=graceful
    #缓冲器即最大等待时间
    spring.lifecycle.timeout-per-shutdown-phase=20s
    
  2. IndexController.java 测试。

    package com.xiaqiuchu.demo.controller;
    
    import org.springframework.web.bind.annotation.RestController;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Slf4j
    @RestController
    @RequestMapping("/")
    public class IndexController {
    
    	@RequestMapping(value = "index", method=RequestMethod.GET)
    	public String index() throws InterruptedException {
    		log.info("收到新请求");
    		// 模拟业务耗时处理流程
    		Thread.sleep(15 * 1000L);
    		//
    		return "hello";
    	}
    }
    

测试

  1. 运行项目,浏览器访问一次,然后 windows 下 Ctrl+c, linux 下执行 kill -2,再次访问。
  2. 测试得知,已存在的请求将会继续执行并正常返回(超出设置的等待时间则会强制结束),新请求会超时(不会进入控制器)。
posted @   夏秋初  阅读(416)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示