Spring Boot(Cloud) 优雅停机
为了解决在微服务重启的过程中,可能出现一部分 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 10kill 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@Lazyprivate ServiceRegistry serviceRegistry;@Autowired@Lazyprivate 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(Cloud) 优雅停机相关推荐
- spring boot / cloud (七) 使用@Retryable来进行重处理
spring boot / cloud (七) 使用@Retryable来进行重处理 前言 什么时候需要重处理? 在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁 ...
- Spring Initializr 构建Spring Boot/Cloud工程
2019独角兽企业重金招聘Python工程师标准>>> 在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式 ...
- 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程(十五)
在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...
- Spring Boot/Cloud干货汇总(持续更新:20180226版)
抽空对本号推送的Spring相关内容做个汇总整理,包括: - Spring - Spring Boot - Spring cloud - 其他Spring干货内容 Spring Boot专题 基础入门 ...
- spring boot / cloud (二) 规范响应格式以及统一异常处理
spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...
- spring boot / cloud (十七) 快速搭建注册中心和配置中心
spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...
- 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...
- Spring Boot (16)---优雅的入门篇
Spring Boot (16)---优雅的入门篇 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做技术储备. ...
- Spring/Boot/Cloud系列知识(2)— — 代理模式
本文转自:https://blog.csdn.net/yinwenjie/article/details/77848285 代理模式是23种设计模式中的一种,属于一种结构模式.用一句大白话解释这个设计 ...
最新文章
- python 文件操作 open()与with open() as的区别(打开文件)
- OpenCV形态学运算
- Windows中断那些事儿
- windows10录制视频 电脑屏幕录像
- linux中的sg工具,sg3_utils工具windows系统下的使用
- mysql5.0免安装版_MySql5.0免安装版配置
- M1芯片,PS2022版真的来了。Photoshop 2022 for Mac中文版介绍安装教程,支持Monterey系统
- 《定时执行专家》V5.4软件使用手册
- Android开发之手机震动器
- 脑肠轴——看不见的Crosstalk
- Glyphs 2 for Mac(字体设计编辑软件)
- unity.生成表示地图信息的二维数组_Unity3D 中生成任意形状3D Texture amp; 体积云...
- 抖音种草品宣,抖音短视频种草是什么意思?
- pynq-z2 使用PL做流水灯
- Java生鲜电商平台-技术方案与文档下载
- UE-摄像机视角的切换
- MySQL数据库的MNA集群环境配置
- python-networkx库的使用1
- 前HP大中华区总裁孙振耀退休感言
- Unity开发Hololens2—环境配置和官方案例发布并部署到设备上
热门文章
- am335x otg配置
- C# 函数中(object sender, EventArgs e)参数是什么意思
- grep命令,或关系 与关系
- python对三维数组切片
- matlab 谱峰,MUSIC算法怎么求谱峰对应的角度值
- java 协方差矩阵_[zz]协方差矩阵的详细说明
- 利用定时/计数器TO从P1输入周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHZ
- SEO爱好者之“拿来主义”!
- 基于ASP.NET的电子商务网站管理系统_WEB管理系统_SQLServer数据库应用
- Ubuntu创建软连接