首页 > 其他分享 >Springboot + nacos + k8s 优雅停机

Springboot + nacos + k8s 优雅停机

时间:2024-09-12 17:54:54浏览次数:3  
标签:Springboot 停机 nacos springframework org import k8s log

需要处理的问题

  1. 至少有一个服务可用
    K8S 配置滚动部署策略
  2. 服务下线后不再被调度
    • 服务关闭时主动下线 nacos
    • 服务关闭时清理应用里的 loadbalance 实例列表缓存
  3. 之前进来的请求可以返回
    延迟下线,最大可能保证功能结束

业务服务配置 nacos 优雅停机

优雅停机配置与最大等待时间

server:
  shutdown: graceful

spring:
  lifecycle:
    timeout-per-shutdown-phase: 40s
  cloud:
    loadbalancer:
      # 负载均衡缓存配置
      cache:
        enabled: true 
        ttl: 10s   

监听器代码

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component
@Slf4j
public class NacosShutdownEvent implements ApplicationListener<ContextClosedEvent>, PriorityOrdered {

    @Resource
    private NacosServiceManager nacosServiceManager;

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @SneakyThrows
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 获取服务实例
        NamingService namingService = nacosServiceManager.getNamingService();
        List<Instance> instances = namingService.getAllInstances("claim");
        String service = nacosDiscoveryProperties.getService();
        String ip = nacosDiscoveryProperties.getIp();
        log.info("nacosDiscoveryPropertiesIP:{}", ip);
        for (Instance instance : instances) {
            String instanceIp = instance.getIp();
            log.info("instanceIp,{}", instanceIp);
            if (instanceIp.equals(nacosDiscoveryProperties.getIp())) {
                namingService.deregisterInstance(service, instance);
                log.info("deregisterInstance service,{},{}", service, ip);
            }
        }
        Thread.sleep(25 * 1000);
        log.info("end stop nacos");
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

网关

在网关配置过期时间

spring:
  cloud:
    loadbalancer:
      # 负载均衡缓存配置
      cache:
        enabled: true 
        ttl: 10s   

测试

使用jemeter 持续请求,观察在部署期间请求不报错
在这里插入图片描述

K8S

terminationGracePeriodSeconds:60s 这里的时间要大于springboot 里的睡眠时间

k8s 有停机前的处理步骤,可以在那里配置下线 + nacos 与睡眠等待,我采用的是springboot 监听器的方案,便于开发与观察。

其它

同样的方法,编写其他中间件,比如 kafka、xxl 的优雅停机逻辑,并且调整顺序,越小优先执行。

可以在关闭前打印当前活跃的 tomcat 容器中的线程数与队列,用于评估等待时间,待完善。

版本:
springboot 2.6.13
nacos 2.2.0

标签:Springboot,停机,nacos,springframework,org,import,k8s,log
From: https://blog.csdn.net/weixin_42490799/article/details/142063223

相关文章

  • 基于SpringBoot+Vue的酷听音乐系统设计与实现(SpringBoot+Vue+MySQL+Tomcat)
    文章目录前言系统演示录像论文参考代码运行展示图技术框架SpringBoot技术介绍系统测试系统测试的目的系统功能测试推荐选题:代码参考实现案例找我做程序,有什么保障?联系我们前言......
  • 基于Node.js+vue基于springboot的影视资讯管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,影视行业迎来了前所未有的繁荣期。海量影视资源的涌现,使得用户对于高效、便捷地获取影视资讯的需求日益增长。传统的影视资讯管理方式......
  • idea+docker远程一键部署springboot
     一、配置本机和服务器通过ssh连接 ssh-keygen-trsa会在 ~/.ssh/id_rsa.pub文件中生成公钥,把改文件的内容复制到服务器的~/.ssh/authorized_keys文件中,然后在本机使用 sshroot@<服务器IP>进行连接 二、配置idea通过ssh远程连接服务器 通过Keypair进行连接......
  • 在线教育|基于springboot+vue的在线教育系统(源码+数据库+文档)
    在线教育|在线教育系统目录基于springboot+vue的在线教育系统一、前言二、系统设计三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平......
  • 卫生健康系统|基于springboot+vue的智能推荐的卫生健康系统(源码+数据库+文档)
    卫生健康系统目录基于springboot+vue的智能推荐的卫生健康系统一、前言二、系统设计三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平......
  • 基于springboot+vue的师生健康信息管理系统(源码+数据库+文档)
    师生健康信息|师生健康信息管理系统目录基于springboot+vue的师生健康信息管理系统一、前言二、系统设计三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风......
  • 基于springboot+vue的学生宿舍管理系统
    摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,新生宿舍管理系统当然也不能排除在外。新生宿舍管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot框架构建的一个管理系统。整个开......
  • 基于springboot小区物业管理系统
    513Springboot的小区物业管理系统小区物业管理系统摘要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于小区物业管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了小区物业管理系统,它彻底改变了过去传统的管理方式,不仅......
  • k8s中的lables和matchlables的作用
    statefulset中的labels和matchlableslabels是一种键值对,可以被附加到任何Kubernetes资源(如Pods、Services、ConfigMaps等),用于为资源添加元数据。你可以使用labels对资源进行分组或标识,以方便管理和查询。labels通常添加在Pod或其他资源的metadata部分,可以用于......
  • 基于java+SpringBoot+Vue的小徐影城管理系统设计与实现
    开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis工具:IDEA/Ecilpse、Navicat、Maven系统简介小徐影城管理系统是一款基于Java、SpringBoot和Vue.js技术开发的影院管理系统,旨在为用户提供一个便捷、高效的在线购票和影院管理平台。系统通过B/S架构,实现了管理员和用......