springboot + nginx 项目无感知发版

要点

  1. springboot项目

  2. spring-boot-starter-actuator插件

  3. 定制化tomcat关闭回调

  4. nginx 负载均衡(至少两台机器)

代码实现

1、引入pom

<dependencies><!--集成springmvc框架并实现自动配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>

2、定制化tomcat回调

CustomShutdown

/*** @author lixiaoyi* @description 定制shutdown 关闭逻辑*  1、 先暂停所有请求*  2、 等待现有线程处理完*  3、 关闭线程* @date 2021/7/22**/
@Slf4j
public class CustomShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {private static final int TIME_OUT = 30;private volatile Connector connector;@Overridepublic void customize(Connector connector) {this.connector = connector;}@Overridepublic void onApplicationEvent(ContextClosedEvent event) {/* 暂停所有请求 */this.connector.pause();/* 获取tomcat的线程池 */Executor executor = this.connector.getProtocolHandler().getExecutor();if (executor instanceof ThreadPoolExecutor) {try {ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;/* 关闭线程 (等待线程处理完之后)*/threadPoolExecutor.shutdown();if (!threadPoolExecutor.awaitTermination(TIME_OUT, TimeUnit.SECONDS)) {log.warn("当前应用等待超过最大时长{}秒,将强制关闭", TIME_OUT);/* Try shutDown Now*/threadPoolExecutor.shutdownNow();if (!threadPoolExecutor.awaitTermination(TIME_OUT, TimeUnit.SECONDS)) {log.error("强制关闭失败", TIME_OUT);}}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}

ShutdownConfig

@Configuration
public class ShutdownConfig {@Beanpublic CustomShutdown customShutdown() {return new CustomShutdown();}@Beanpublic ConfigurableServletWebServerFactory webServerFactory(final CustomShutdown customShutdown) {TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();tomcatServletWebServerFactory.addConnectorCustomizers(customShutdown);return tomcatServletWebServerFactory;}
}

测试例子

@RestController
public class TestController {@RequestMapping("/test")public String test() throws InterruptedException {System.out.println("test");Thread.sleep(30000);String s = System.currentTimeMillis()+"";System.out.println("返回结果:"+s);return s;}@RequestMapping("/test1")public String test1() {System.out.println("test1");return "test1";}
}

3、nginx配置

http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#gzip  on;upstream backend {server localhost:8888;server localhost:8889;}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {proxy_pass http://backend;}#error_page  404              /404.html;error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}}

操作流程

  1. 业务请求: http://localhost/test   30s 返回结果

  2. 注释 nginx 配置  server localhost:8888;

  3. 刷新nginx配置  nginx -s reload

  4. 关闭应用 http://localhost:8888/actuator/shutdown

  5. 重新启动关闭应用

  6. 启动完成 重复 2 3 4 5 步骤,第二步注释8889的机器 

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

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

相关文章

qmt量化交易策略小白学习笔记第4期【qmt如何获取获取行情数据--内置python使用方法】

内置python使用方法 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;需免费开通量化回测与咨询实盘权限&#xff0c;可以和博主联系&#xff01; 获取历史行情与实时行情…

Nginx如何禁止某个目录及子目录运行php文件

一、传统的方式 location ~* ^/(runtime|uploads|static|template|html)/.*.(php|php5|php7)$ {deny all; }这样只能防止指定目录运行php&#xff0c;如&#xff1a; html目录下&#xff0c;而html的子目录并没有并限制。 二、限制目录及子目录 location ~* ^/uploads(/.*\.p…

202203青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 下列关于函数的说法, 错误的是? ( ) A :函数是一种功能抽象的模块 B :使用函数的目的只是为了增加代码复用 C :函数的使用包括定义函数和调用函数 D :函数名可以是任何有效的 Python 标识符 正确答案:B 试题解析: 函数的相关概念 第 2 题 【单选题…

清华新突破||新研究揭示多智能体协作的秘密武器

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读点击订阅&#xff1a;人工智能论文解读合集 引言&#xff1a;多智能体协作中的挑战与机遇 在多智能体系统中&#xff0c;智能体需要通过协作来完成复杂的任务&#xff0c;这种协作涉及到通信…

【对角线遍历】python

没啥思路 class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:mlen(mat)nlen(mat[0])ret[]if len(mat)0:return retcount0#mn-1是对角线总数while count<mn-1:#x和y的和刚好是count数#偶数为右上走if count%20:xcount if(count<m)else (…

Linux 基本使用和 web 程序部署云端

目录 1.Linux发行版 2.Linux常用命令 ls pwd cd touch mkdir cat rm cp mv man vim grep ps netstat 绝对路径 vs 相对路径 使用 tab 键补全 使用 ctrl c 重新输入 粘贴与复制快捷键 3.Linux环境搭建 环境搭建方式 使用云服务器 4.搭建Java部署环境 …

《计算机网络微课堂》3-11 虚拟局域网 VLAN

本节课我们介绍虚拟局域网 VLAN 的基本概念。 ‍ 3.11.1 虚拟局域网 VLAN 概述 在之前课程中我们已经介绍过了以太网交换机自学习和转发帧的流程&#xff0c;‍‍以及为避免网络环路而产生的生成树协议。 以太网交换机工作在数据链路层&#xff0c;‍‍也包括物理层&#xf…

最大子矩阵+01矩阵

最大子矩阵 题目 思路 确定一个矩阵中的子矩阵&#xff0c;只需要确定矩阵对角线上两点的坐标即可&#xff0c; 在确定了子矩阵之后&#xff0c;还需要计算子矩阵中各元素之和&#xff0c;如果按照常规的循环方法来解决&#xff0c;时间复杂度是O(N^6)&#xff0c;对于本题20…

【Spring Cloud】在项目中使用OpenFeign

使用OpenFeign是为了简化HTTP客户端的调用&#xff0c;它提供了一种声明式的方式来调用HTTP接口。在Spring Cloud项目中&#xff0c;OpenFeign被广泛应用。下面是一个简单的示例&#xff0c;展示了如何在Spring Boot项目中使用OpenFeign。 步骤 1: 添加依赖 首先&#xff0c;…

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 &#xff08;1&#xff09;用户注册与用户登录 &#xff08;2&#xff09;手机搜索、手机比拼、手机个性化推荐 &#xff08;3&#xff09;点击搜索的手机图片会就用户行为&#xff0c;轮播展示用户行为&#xff0c;推荐点击次数靠前的手机 &#xff08;4&#xf…

​Java基础复习笔记 第16章:网络编程

1. 网络编程概述 1. 要想实现网络通信&#xff0c;需要解决的三个问题&#xff1a; - 问题1&#xff1a;如何准确地定位网络上一台或多台主机 - 问题2&#xff1a;如何定位主机上的特定的应用 - 问题3&#xff1a;找到主机后&#xff0c;如何可靠、高效地进行数据传输2. 实现网…

【云原生】K8s 管理工具 kubectl 详解(三)

金丝雀发布/灰度发布&#xff08;Canary Release&#xff09; 一、金丝雀发布简介 Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停&#xff08;pause&#xff09;”或“继续&#xff08;resume&#xff09;”更新操作。比如等待第一批新的Pod资源创…

c语言----函数

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理c语言中函数的相关知识点 适合有编程基础的人快速掌握。。。。 函数分类 系统函数: 系统内置的函数,include包含进入之后可以直接使用 用户函数: 用户自定义的函数&#xff0c;自己写。 用户函数…

软考高级之redis中使用zset实现延迟队列,你答对了么?

实现延迟队列的思路 zset的特性&#xff0c;带有分数的排序&#xff0c;以时间戳作为分数进行排序 添加任务 zdd取出任务 zrangbyscore执行任务 zrem 定时任务 public static void main(String[] args) {Jedis jedis new Jedis("ip", 6379);TimerTask task new …

Boost系列之asio库简易使用及遇到的问题(UDP)和思考

Boost系列之asio库简易使用及遇到的问题&#xff08;UDP&#xff09; 1、个人学习asio的一些步骤和看法 首先我都是直接文档怼上&#xff1a;Boost.Asio - 1.68.0 在看文档需要了解一下大概&#xff1b; Overview - 1.68.0 (boost.org)&#xff0c;Using Boost.Asio - 1.68…

localhost 和 127.0.0.1 有什么区别?

当前端开发人员在本地调试时&#xff0c;他们经常与 localhost 互动&#xff0c;只需运行npm run命令就可以在浏览器中打开他们的网页&#xff0c;地址栏显示类似于 http://localhost:xxx/index.html的内容。 许多人在使用它时可能没有思考两者之间的区别。 考虑到我过去与开发…

SDK之嵌入式C

简介 嵌入式系统是指内置于各种设备中的微型计算机系统,与外部环境紧密交互,能够完成特定功能的计算机系统。这类系统广泛应用于工业控制、消费电子、汽车电子、医疗设备等领域。 嵌入式系统与普通的桌面计算机系统有很大不同,它们通常具有以下特点: 资源受限 嵌入式系统的…

探秘NumPy的奥秘:元素级操作与广播机制

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、NumPy基础与元素级操作 元素级操作的引入 元素级操作详解 广播机制初探 二、NumPy矩…

Linux操作指令大全

目录 &#x1f349;引言 &#x1f349; 基础命令 &#x1f348;pwd &#x1f348;cd &#x1f348;ls &#x1f348;mkdir &#x1f348;rmdir &#x1f348;cp &#x1f348;mv &#x1f348;rm &#x1f349; 文件操作命令 &#x1f348;cat &#x1f348;tac …

C语言怎样利⽤好敏感的内存资源?

一、问题 内存是⼀个很敏感的资源&#xff0c;就像敏感肌肤⼀样&#xff0c;要百般呵护。同时&#xff0c;内存资源又很复杂&#xff0c;如何正确地使⽤内存资源不容易&#xff0c;能够正确并且合理地利⽤好内存资源就更不容易。 下⾯通过⼀个例⼦&#xff0c;来讲解怎样利⽤好…