服务优雅上下线优雅停机

一、目的

  1. 服务发生线程锁住,需要下线服务时,保证请求中的接口不受影响,执行完后,再下线服务

二、步骤

*kill -15时执行改钩子函数 优雅停机
1.当线程锁住
2.运维那边监控到,然后进行kill -15 进程ID
3.代码这边监听到关闭信号,先把容器权重设置为0,不允许新的请求进来.
4.然后为了保住容器其他请求中的接口不受影响,进行睡眠30s再关闭容器

三、代码实现

package com.dst.XXX.XXX;import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.dst.steed.common.util.DstSpringUtil;
import com.dst.steed.rabbit.annotation.SteedAmqpScan;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.util.StopWatch;import javax.annotation.Resource;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Optional;
import java.util.Properties;import static com.dst.lcb.base.DstSteedLcbBaseService.PACKAGE_NAME;/*** 服务启动** @author LWP* @since 2024/08/20*/
@Slf4j
@SpringBootApplication(scanBasePackages = {PACKAGE_NAME})
@EnableFeignClients(basePackages = PACKAGE_NAME + ".infrastructure.acl")
@MapperScan(basePackages = {PACKAGE_NAME + ".infrastructure.biz.**.mapper", PACKAGE_NAME + ".modules.mapper","generator.mapper"})
@SteedAmqpScan(basePackage = PACKAGE_NAME + ".infrastructure.mq")
public class DstSteedXXXXService implements CommandLineRunner, ApplicationContextAware {public static final String PACKAGE_NAME = "com.dst.XXX.XXX";@Autowiredprivate ConfigurableApplicationContext applicationContext;@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;public static void main(String[] args) {StopWatch stopWatch = new StopWatch();stopWatch.start();SpringApplication.run(DstSteedLcbBaseService.class, args);stopWatch.stop();log.info("【服务:" + DstSpringUtil.getAppName() +";环境:" + DstSpringUtil.getActiveProfile() +"】启动成功,耗时:" +new DecimalFormat("#.##").format(stopWatch.getTotalTimeSeconds()) + " 秒。");}/*** kill -15时执行改钩子函数  优雅停机* 1.线程锁住* 2.运维那边监控到,然后进行kill  -15 进程ID* 3.代码这边监听到关闭信号,先把容器权重设置为0,不允许新的请求进来.* 4.然后为了保住容器其他请求中的接口不受影响,进行睡眠30s再关闭容器*/@Overridepublic void run(String... args) {log.info("启动成功 !");Runtime.getRuntime().addShutdownHook(new Thread(() -> {log.info("收到服务关闭信号");stop();try {log.info("睡眠30秒");Thread.sleep(30000);} catch (InterruptedException e) {throw new RuntimeException(e);}applicationContext.close();}));}private void stop() {try {Properties properties = new Properties();properties.put(PropertyKeyConst.NAMESPACE, nacosDiscoveryProperties.getNamespace());properties.put(PropertyKeyConst.SERVER_ADDR, nacosDiscoveryProperties.getServerAddr());NamingService namingService = NacosFactory.createNamingService(properties);String serviceName = nacosDiscoveryProperties.getService();List<Instance> instanceList = namingService.getAllInstances(serviceName);Optional<Instance> currentInstance = instanceList.stream().filter(instance -> instance.getIp().equals(nacosDiscoveryProperties.getIp())).findFirst();currentInstance.ifPresent(instance -> {log.info("找到当前服务实例: {}", instance);instance.setWeight(0);try {namingService.registerInstance(serviceName, instance);log.info("Nacos 服务权重已设置为 0");} catch (NacosException e) {log.error("设置 Nacos 服务权重时发生错误", e);}});} catch (NacosException e) {log.error("获取 Nacos 命名服务时发生错误", e);}}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {if (applicationContext instanceof ConfigurableApplicationContext) {this.applicationContext = (ConfigurableApplicationContext) applicationContext;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听专家的,不如听国家的,网络安全究竟值不值得报?

考学选专业&#xff0c;或者跳槽选行业的&#xff0c;看这篇&#xff01; 如果你什么都不懂&#xff0c;家里也没有矿&#xff0c;那就紧跟国家大事和地方政策。 关于网络安全专业究竟是否值得报考? 要知道“二十大”、“十四五”等大会一直在提一个词叫做“数字中国建设”…

Linux:进程的概念,进程相关函数

一、进程的概念 1.进程 进程是系统进行资源分配和调度的一个独立单元&#xff0c;它是操作系统结构的基础。进程是程序的一次执行过程&#xff0c;包含了程序代码、当前活动、系统资源&#xff08;如CPU、内存、文件等&#xff09;的使用情况等信息。每个进程都有自己独立的内…

DevOps入门(上)

1: DevOps概念 &#xfeff;&#xfeff;DevOps: Development 和 Operations 的组合 DevOps 看作开发&#xff08;软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;三者的交集。 突出重视软件开发人员和运维人员的沟通合作&#xff0c;通过自动化流程来使…

React学习笔记(一)——react基础

目录 1. React 介绍 1.1 React是什么 1.2 React的优势 1.3 React的市场情况 2. 开发环境搭建 2.1 使用create-react-app快速搭建开发环境 2.2 react 项目文件说明 2.3 index.js项目入口文件 2.4 App.js 项目根组件 2.5 react 调试工具安装 3. JSX基础-概念和本质 3…

代驾系统源码开发中的用户体验优化:从设计到实现的全方位解析

在当今数字化时代&#xff0c;代驾服务已经成为城市生活中不可或缺的一部分。为了帮助开发者和企业快速搭建代驾服务平台&#xff0c;许多开源的代驾系统源码应运而生。这些源码不仅节省了开发时间&#xff0c;还为进一步的定制化开发提供了坚实的基础。本文将以“开源代驾系统…

docker 安装 oracle11g

#创建oracle11g docker run -d --name myoracle11g -p 1522:1521 akaiot/oracle_11g #登录到oracle,要先docker ps 查看具体的docker id docker exec -it 22222222 bash su root 密码&#xff1a;helowin # 设置环境变量 vi /etc/profile export ORACLE_HOME/home/oracle/ap…

Dubbo源码深度解析(七)

接上一篇博客《Dubbo源码深度解析(六)》&#xff0c;上篇博客主要从服务消费方开始讲起&#xff0c;主要讲&#xff1a;如果类中的属性或者方法&#xff0c;如果被DubboReference注解所修饰&#xff0c;Dubbo是怎么处理的&#xff0c;处理逻辑类似Spring框架提供的Autowired注解…

tomcat相关

一、部署安装tomcat 在10和20上安装tomcat [root10 ~]# dnf install java-1.8.0-openjdk.x86_64 -y #安装java环境 [root10 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/ #安装并启动tomcat [root10 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat…

一元函数泰勒展开

若函数f(x)在包含 x 0 x_0 x0​的某个开区间 (a,b)上具有(n 1)阶导数&#xff0c;那么对于任意 x ∈ ( a , b ) x \in (a,b) x∈(a,b)&#xff0c;有: f ( x ) ≈ f ( x 0 ) 0 ! f ′ ( x 0 ) 1 ! ( x − x 0 ) f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 ⋅ ⋅ ⋅ f ( n 1 ) ( …

SQLite 删除表

SQLite 删除表 SQLite 是一种轻量级的数据库管理系统,广泛用于各种应用程序中。在数据库管理过程中,删除表是一个常见的操作,用于移除不再需要的数据库表。本文将详细介绍如何在 SQLite 中删除表,包括使用 SQL 命令和图形界面工具的方法。 SQLite 删除表的 SQL 命令 在 …

Linux运维、Windows运维常用命令,保存起来当手册用

文章目录 一、centos基本命令1、升级内核到最新版本2、文件句柄数限制优化3、ssh、sftp、scp等远程命令4、find文件查找5、vi命令 二、windows常用操作 一、centos基本命令 1、升级内核到最新版本 # 1、查看内核版本 [rootlocalhost ~]# cat /etc/centos-release CentOS Linu…

C/C++|经典代码题(动态资源的双重释放与「按值传递、按引用传递、智能指针的使用」)

以下代码中你能看出其存在什么问题&#xff1f;如何修复&#xff0c;能给出几种方法&#xff1f;分别在什么场景下用哪种方法。 #include <iostream>class Buffer {public:Buffer() { std::cout << "Buffer created" << std::endl; }~Buffer() { s…

NC 完全二叉树结点数

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一棵完全…

社交巨头的下一步:Facebook的未来发展方向

作为全球最大的社交媒体平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;一直在不断推动其平台的技术创新和战略调整&#xff0c;以适应不断变化的市场需求和用户期望。随着技术的进步和社交媒体环境的演变&#xff0c;Facebook的未来发展方向正在显现出新的趋势和…

Oracle 数据库中的函数REGEXP_LIKE

REGEXP_LIKE 是 Oracle 数据库中的一个函数&#xff0c;它用于基于正则表达式模式匹配字符串。这个函数非常强大&#xff0c;允许你执行复杂的字符串搜索和匹配操作&#xff0c;比标准的 LIKE 语句更加强大和灵活。 语法 REGEXP_LIKE(source_string, pattern [, match_parame…

DC-DC 转换器中的压电谐振器:当前状态和限制

在小体积和高频下提高功率密度并减小电感器和变压器的尺寸是DC-DC转换器设计中的一大挑战。为了克服这些困难&#xff0c;压电谐振器&#xff08;PR&#xff09;通过利用潜在的压电效应&#xff0c;以振动模式而不是电模式存储能量。 即使 PR 的使用在效率和功率密度方面改进了…

轻松创作高质量的AI音乐——Suno API

Suno 歌曲生成 API 对接指南 随着人工智能技术的飞速发展&#xff0c;各类 AI 程序已如雨后春笋般涌现。AI 不再是遥不可及的存在&#xff0c;它的身影深入了人类工作与生活的每一个角落。其应用领域也愈加广泛&#xff0c;从初期的写作&#xff0c;到现如今的医疗、教育&…

【数据结构-距离和】力扣2602. 使数组元素全部相等的最少操作次数

给你一个正整数数组 nums 。 同时给你一个长度为 m 的整数数组 queries 。第 i 个查询中&#xff0c;你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次&#xff1a; 将数组里一个元素 增大 或者 减小 1 。 请你返回一个长度为 m 的数组 answer &#x…

WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印安卓库 简介 本插件主要用于旻佑热敏打印机打印标签&#xff0c;不支持票据打印。适用于旻佑的各型支持标签打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请…

C的动态内存管理 free()和malloc()的简单实现——free()根据内存地址便知释放内存的空间大小(原理详解)

malloc与free malloc 分配的内存是未初始化的&#xff0c;其中的字节内容是不确定的&#xff08;可能是随机值&#xff09;。 如果内存分配失败&#xff0c;malloc 返回一个空指针 NULL&#xff0c;可以通过检查返回值来判断是否分配成功。 void* malloc (size_t size); cal…