Spring Boot(Cloud) 优雅停机
双鬼带单
共 1945字,需浏览 4分钟
· 2021-11-01
为了解决在微服务重启的过程中,可能出现一部分 http 请求处理失败的问题,提供一下方案
拟用方案:
第一步:重启前先从主动将服务剔除,并等待一段时间
第二步:停止服务并重启
该方案主要考虑因为服务下线的瞬间,如果服务信息更新不及时,导致复杂均衡算法依然转发到已经停掉的实例上发生一些服务不可用的情况
在每个项目增加一个接口(例如 /discovery/deregister
),在项目重启的脚本中主动调用接口剔除这个服务,shell 大致改动如下:
function stop()
{
echo "deregister [${PROJECT}]."
curl -X POST "127.0.0.1:${SERVER_PORT}/discovery/deregister"
echo ""
echo "deregister [${PROJECT}] then sleep 10 seconds."
sleep 10
kill xxxxxxxxxxxxxxxxxxxx
}
接口代码示例
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("discovery")
@Slf4j
public class DeregisterInstanceController {
@Autowired
@Lazy
private ServiceRegistry serviceRegistry;
@Autowired
@Lazy
private Registration registration;
@PostMapping("deregister")
public void deregister() {
log.info("deregister serviceName:{}, ip:{}, port:{}",
registration.getServiceId(),
registration.getHost(),
registration.getPort());
try {
serviceRegistry.deregister(registration);
} catch (Exception e) {
log.error("deregister error", e);
}
}
}
二、Spring Boot 自带的优雅停机方案要求 Spring Boot 的版本大于等于 2.3
在配置文件中增加如下配置:
application.yaml
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 10s
当使用 server.shutdown=graceful
启用时,在 Web 容器关闭时,Web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。缓冲器默认是 30s, 具体项目时间根据具体情况而定
不同 web 容器优雅停机行为区别
容器停机行为取决于具体的 web 容器行为
web 容器名称 | 行为说明 |
---|---|
tomcat 9.0.33+ | 停止接收请求,客户端新请求等待超时。 |
Reactor Netty | 停止接收请求,客户端新请求等待超时。 |
Undertow | 停止接收请求,客户端新请求直接返回 503。 |
两者一同使用效果更加
评论
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0
Spring Boot 优雅实现多租户架构
来源:blog.csdn.net/u010349629/article/details/130737253👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0
小哈学Java
1448
美团一面:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
点击关注公众号,Java 干货及时推送↓推荐阅读:铜三铁四,怒拿 35K * 14 薪!作者:小亮哥Ya链接:https://juejin.cn/post/7080441168462348319大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Au
Java技术栈
0
C# 优雅的处理 TCP 数据
前言Tcp是一个面向连接的流数据传输协议,用人话说就是传输是一个已经建立好连接的管道,数据都在管道里像流水一样流淌到对端。那么数据必然存在几个问题,比如数据如何持续的读取,数据包的边界等。Nagle's算法Nagle 算法的核心思想是,在一个 TCP 连接上,最多只能有一个未被确认的小数据包(小于
dotNET全栈开发
1075
Spring Boot + MybatisX,真香!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
9854
手动实现 Spring Boot 日志链路追踪,无需引入组件,日志定位更方便!
来源:blog.csdn.net/qq_35387940/article/details/125062368👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0
小哈学Java
10
Spring 6 正式“抛弃” feign
来源:juejin.cn/post/7173271507047546893完成一个 DemoGetExchange(HttpExchange)注解UserApiService 实例的创建其他特性为什么需要 Spring Reactive Web 的依赖总结近期,Spring 6 的第一个 GA 版本发布了,其...
我是程序汪
0
SpringBoot 集成 EasyExcel 3.x 优雅实现 Excel 导入导出
来源:blog.csdn.net/qq991658923/article/details/128153012介绍EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel...
我是程序汪
0