在发布新版本时,如果直接终止进程,正在处理的请求将会中断,可能导致数据不一致。优雅关闭机制能够确保应用处理完当前请求后再停止,从而保障数据完整性。

一、Spring Boot 优雅关闭配置
配置过程非常简单,只需在 application.yml 文件中添加以下两行配置即可实现优雅关闭:
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s
当Spring Boot接收到停止信号后,会等待正在处理的请求全部完成(最长等待30秒),然后才真正退出进程。需要注意的是,timeout-per-shutdown-phase 参数可根据业务需求进行调整,如果某些请求处理时间较长,可以适当延长超时时间。
二、手动降级机制
降级的核心在于提供一个可动态控制的开关,能够随时决定某个功能是否启用兜底逻辑。以下 DegradeService 类是一个轻量级的实现,它使用 ConcurrentHashMap 存储降级规则,并通过 enableDegrade 和 disableDegrade 方法实现动态切换。
@Component
public class DegradeService {
private final Map degradeRules = new ConcurrentHashMap<>();
public boolean isDegrade(String key) {
return degradeRules.getOrDefault(key, false);
}
public void enableDegrade(String key) {
degradeRules.put(key, true);
}
public void disableDegrade(String key) {
degradeRules.put(key, false);
}
public T execute(String key, Supplier supplier, T fallback) {
if (isDegrade(key)) return fallback;
return supplier.get();
}
}
使用时,调用 execute 方法,传入业务逻辑和降级结果,一旦降级开启,直接返回 fallback,避免核心链路崩溃。
三、熔断降级接口
在实现手动降级之后,还需要一个对外暴露的接口来触发降级开关,以便运维人员或监控系统能够灵活调用。以下 Controller 提供了两个HTTP端点:
@RestController
public class DegradeController {
@Autowired
private DegradeService degradeService;
@PostMapping("/degrade/enable")
public ResultVO> enable(@RequestParam String key) {
degradeService.enableDegrade(key);
return ResultVO.success("已开启: " + key);
}
@PostMapping("/degrade/disable")
public ResultVO> disable(@RequestParam String key) {
degradeService.disableDegrade(key);
return ResultVO.success("已关闭: " + key);
}
}
通过这种方式,当线上出现异常或流量高峰时,可以发送请求 /degrade/enable?key=xxx 快速开启降级,待系统恢复正常后再调用 /degrade/disable 关闭降级。结合优雅关闭机制,能够有效应对大部分发布和故障场景。
