02——springboot2——热部署

news2024/11/16 21:54:18

什么是热部署

  1. 简单说就是你程序代码修改了,现在要重新启动服务器才能加载刚刚新写的代码,如果每次修改代码都要重新启动服务器,这样就真的太麻烦了(运行一些稍微较大的项目,运行时间是很长的,所以每次修改要重新运行就要等待很长的时间)。修改代码后不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。
  2. 热部署的主要目的(针对学习):减少修改代码要重启服务的时间
  3. 热部署主要分两种情况:非springboot工程springboot工程的热部署,这两种实现热部署的方式是不一样的。

1、非springboot项目热部署实现原理

  1. 开发非springboot项目时,正常情况我们要制作一个web工程并通过tomcat启动,通常需要先安装tomcat服务器到磁盘中开发的程序配置发布到安装的tomcat服务器上。如果想实现热部署的效果,这种情况其实有两种做法,

    • 一种是在tomcat服务器的配置文件中进行配置,这种做法与你使用什么IDE工具无关,不管你使用eclipse还是idea都行。
    • 还有一种做法是通过IDE工具进行配置,比如在idea工具中进行设置,这种形式需要依赖IDE工具,每款IDE工具不同,对应的配置也不太一样。但是核心思想是一样的,就是使用服务器去监控其中加载的应用,发现产生了变化就重新加载一次。
  2. 非springboot项目实现热部署简单的思路(实际设计要比这复杂一些):例如启动一个定时任务,任务启动时记录每个文件的大小,以后每5秒比对一下每个文件的大小是否有改变,或者是否有新文件。如果没有改变,放行,如果有改变,刷新当前记录的文件信息,然后重新启动服务器,这就可以实现热部署了。当然,这个过程肯定不能这么做,比如我把一个打印输出的字符串"abc"改成"cba",比对大小是没有变化的,但是内容缺实变了,所以这么做肯定不行,只是给大家打个比方,而且重启服务器这就是冷启动了,不能算热部署,理解一下思路即可。

  3. 非Spring Boot项目的热部署实现原理,主要涉及到类加载器的自定义和动态替换机制(了解):

      1. 类加载器的作用:Java类的加载是由Java虚拟机(JVM)通过类加载器(ClassLoader) 来完成的。类加载器负责将.class文件的二进制数据加载到内存中,并进行链接(包括验证、准备和初始化等阶段),最终形成一个可以被JVM直接使用的Java类型。在JVM中,每个类只能被加载一次,并且由加载它的类加载器负责维护该类的唯一性。
      1. 热部署的需求:热部署是指在应用程序运行时,能够动态地替换或更新已加载的类文件,而无需重启整个应用程序。这对于提高开发效率、减少部署时间具有重要意义。
      1. 实现热部署的原理:在非Spring Boot项目中实现热部署,通常需要自定义类加载器,并通过某种机制来检测和替换已加载的类。以下是具体的实现步骤:
        • 1、 自定义类加载器:由于JVM中每个类只能被其加载的类加载器唯一识别,因此要实现热部署,就需要创建一个新的类加载器来加载更新后的类文件。自定义类加载器通常需要继承自java.lang.ClassLoader类,并重写其findClass或loadClass方法,以便控制类的加载过程。
      • 2、 检测和替换类文件:在自定义类加载器中,需要实现一种机制来检测和识别哪些类文件已经被更新。这可以通过文件系统的监听(可以实现一个监听器)、时间戳比较或其他方式来实现。一旦检测到类文件更新,就需要使用新的类加载器来加载这些类文件,并替换掉旧的类加载器及其加载的类。
      • 3、 替换已加载的类:由于JVM的类加载机制,直接替换已加载的类是非常困难的。一种可行的方案是,**在应用程序中维护一个引用到自定义类加载器的映射表,当需要替换某个类时,通过该映射表找到对应的类加载器,并使用它来重新加载类文件。然而,这种方式需要应用程序的显式支持,并且可能会涉及到复杂的类加载和卸载逻辑。**另一种更为简单但可能不够彻底的方法是,在检测到类文件更新后,重启应用程序的某个部分或整个应用程序,以便使用新的类加载器来加载更新后的类文件。这种方法虽然简单,但可能会影响到应用程序的可用性和性能。
      • 工具和框架的支持:虽然非Spring Boot项目没有像Spring Boot DevTools这样的内置热部署支持,但可以通过使用第三方工具或框架来实现类似的功能。例如,JRebel是一款商业化的Java开发工具,它提供了强大的热部署功能,可以在不重启JVM的情况下动态加载类的更改。
      • 注意事项:热部署可能会带来一些潜在的问题,如类加载冲突、内存泄漏等,因此需要谨慎使用。
  • 在生产环境中,通常不建议使用热部署,因为它可能会引入不可预测的行为和性能问题。在生产环境中,更推荐使用传统的部署方式,即重新构建和重新启动应用程序。

2、springboot项目热部署实现原理

  1. 基于springboot开发的web工程其实有一个显著的特征:就是tomcat服务器内置服务器是以一个对象的形式在spring容器中运行的
    • 本来我们期望于tomcat服务器加载程序后由tomcat服务器盯着程序,你变化后我就重新启动重新加载,但是现在tomcat和我们的程序是平级的了,都是spring容器中的组件,这下就麻烦了,缺乏了一个直接的管理权,那该怎么做呢?
    • 简单,再搞一个程序X在spring容器中盯着你原始开发的程序A不就行了吗?确实,搞一个盯着程序A的程序X就行了,如果你自己开发的程序A变化了,那么程序X就命令tomcat容器重新加载程序A就OK了。并且这样做有一个好处,spring容器中东西不用全部重新加载一遍,只需要重新加载你开发的程序那一部分就可以了,这下效率又高了,挺好。
      • 怎么搞出来这么一个程序X,肯定不是我们自己手写了,springboot早就做好了,搞一个坐标导入进去就行了。

2.1、手动启动热部署

步骤①:导入开发者工具对应的坐标(启动热部署的工具)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

步骤②:在修改代码后,点击该按钮构建项目(可以使用快捷键<CTR>L+<F9>激活此功能)

在这里插入图片描述

  • 底层原理(重启与重载

    • 一个springboot项目在运行时实际上是分两个过程进行的,根据加载的东西不同,划分成base类加载器与restart类加载器
      • base类加载器:用来加载jar包中的类,jar包中的类和配置文件由于不会发生变化,因此不管加载多少次,加载的内容不会发生变化。
      • restart类加载器:用来加载开发者自己开发的类、配置文件、页面等信息,这一类文件受开发者影响
    • 当springboot项目启动时,base类加载器执行,加载jar包中的信息后,restart类加载器执行,加载开发者制作的内容当执行构建项目后,由于jar中的信息不会变化,因此base类加载器无需再次执行,所以仅仅运行restart类加载即可,也就是将开发者自己制作的内容重新加载就行了,这就完成了一次热部署的过程。(也可以说热部署的过程实际上是重新加载restart类加载器中的信息)
  • 手动启动热部署总结

      1. 使用开发者工具(添加依赖)可以为当前项目开启热部署功能
      1. 使用构建项目操作对工程进行热部署
  • 上述过程每次进行热部署都需要开发者手工操作,不管是点击按钮还是快捷键都需要开发者手工执行。这种操作的应用场景主要是在开发调试期,并且调试的代码处于不同的文件中,比如服务器启动了,我需要改4个文件中的内容,然后重启,等4个文件都改完了再执行热部署,使用一个快捷键就OK了。

    • 但是如果现在开发者要修改的内容就只有一个文件中的少量代码,这个时候代码修改完毕如果能够让程序自己执行热部署功能,就可以减少开发者的操作,也就是自动进行热部署

2.2、自动启动热部署

  1. 自动热部署其实就是设计一个开关,打开这个开关后,IDE工具就可以自动热部署。因此这个操作和IDE工具有关,以下以idea为例设置idea中启动热部署
  • 步骤①:设置自动构建项目

    • 打开【File】,选择【settings…】,在面板左侧的菜单中找到【Compile】选项,然后勾选【Build project automatically】:
      在这里插入图片描述
  • 步骤②:允许在程序运行时进行自动构建

    • 使用快捷键【Ctrl】+【Alt】+【Shit】+【/】打开维护面板,选择第1项【Registry…】(这个是原来的寻找方法,已经找不到compiler.automake.allow.when.app.running这个选项了)
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

勾选上上面的那个框,这样程序在运行的时候就可以进行自动构建了,实现了热部署的效果。

  • 问题1:如果你每敲一个字母,服务器就重新构建一次,这未免有点太频繁了,所以idea设置当idea工具失去焦点5秒后进行热部署。其实就是你从idea工具中切换到其他工具时进行热部署,比如改完程序需要到浏览器上去调试,这个时候idea就自动进行热部署操作。

  • 问题2:现在已经实现了热部署了,但是到企业开发的时候你会发现,为了便于管理,在你的程序目录中除了有代码,还有可能有文档,如果你修改了一下文档,这个时候会进行热部署吗?不管是否进行热部署,这个过程我们需要自己控制才比较合理。

2.3、参与热部署监控的文件范围配置

  1. 通过修改项目中的文件,你可以发现其实并不是所有的文件修改都会激活热部署的,原因在于在开发者工具中有一组配置,当满足了配置中的条件后,才会启动热部署,配置中默认不参与热部署的目录信息如下
  • /META-INF/maven
  • /META-INF/resources
  • /resources
  • /static
  • /public
  • /templates

以上目录中的文件如果发生变化,是不参与热部署的。如果想修改配置,可以通过application.yml文件进行设定哪些文件不参与热部署操作

spring:
  devtools:
    restart:
      # 设置不参与热部署的文件或文件夹
      exclude: static/**,public/**,config/application.yml
  • 热部署监控的文件范围配置:1. 通过配置可以修改不参与热部署的文件或目录
  • 问题:热部署功能是一个典型的开发阶段使用的功能,到了线上环境运行程序时,这个功能就没有意义了。能否关闭热部署功能呢?答案是肯定的,线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能。

2.4、关闭热部署

  1. 线上环境运行时是不可能使用热部署功能的,所以需要强制关闭此功能,通过配置可以关闭此功能。
spring:
  devtools:
    restart:
      enabled: false
  1. 如果担心配置文件层级过多导致相符覆盖最终引起配置失效,可以提高配置的层级,在更高层级中配置关闭热部署。例如在启动容器前通过系统属性设置关闭热部署功能
@SpringBootApplication
public class SSMPApplication {
    public static void main(String[] args) {
        System.setProperty("spring.devtools.restart.enabled","false");
        SpringApplication.run(SSMPApplication.class);
    }
}

其实上述担心略微有点多余,因为线上环境的维护是不可能出现修改代码的操作的,这么做唯一的作用是降低资源消耗,毕竟那双盯着你项目是不是产生变化的眼睛只要闭上了,就不具有热部署功能了,这个开关的作用就是禁用对应功能。

  • 如何关闭热部署(总):通过配置可以关闭热部署功能降低线上程序的资源消耗

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

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

相关文章

docker - 镜像操作(拉取、查看、删除)

文章目录 1、docker search --help&#xff08;用于显示 Docker 搜索命令的帮助信息&#xff09;2、docker pull&#xff08;拉取镜像&#xff09;3、docker images (查看镜像)3.1、docker images --help&#xff08;用于显示 Docker 镜像管理相关命令的帮助信息&#xff09;3.…

【C++】——vector深度剖析模拟实现

低头赶路&#xff0c;敬事如仪 目录 1、模拟vector 1.1底层结构 1.2构造析构 1.3尾插扩容 1.4迭代器 1.5增删查改 1.6模拟中的注意事项 2、vector模拟补充 2.1迭代器区间构造问题 2.2memcpy深浅拷贝问题 2.3动态二维数组的模拟及遍历 1、模拟vector 想要模拟实现自…

即梦PixelDance:从追赶到领跑,一跃成为全球AI竞赛的领航者!

今年2月份&#xff0c;OpenAI发布了全新的文生视频模型Sora&#xff0c;那一次的发布&#xff0c;成功开启了AI视频生成的ChatGPT时刻。 看到Sora的发布视频&#xff0c;我相信有很多小伙伴和我一样被深深得震撼了&#xff01; 只需一个指令就可以生成一段逼近真实的视频&…

NBOUND 2024:与AI 一起推动业务增长

在2024年&#xff0c;我们的企业有幸参加了INBOUND大会&#xff0c;这是HubSpot为期三天的动态会议&#xff0c;专注于探讨营销、销售和人工智能领域的最新趋势和策略。作为HubSpot的合作伙伴&#xff0c;我们在这里不仅学习和分享&#xff0c;更见证了如何通过AI推动增长的无限…

【DAY20240926】智能时隙选择器

文章目录 要点元模型和本地模型的关系lstm模型更新Q-learning选择策略&#xff1a;ϵ-greedy动作空间&#xff08;&#x1d44e;&#x1d461;&#x1d456;−1∈{add,stay,minus}&#xff09;: 要点 The intelligent time slot selector is composed of a meta model on the …

提升并行效率的Python多处理模块指南

在Python中&#xff0c;multiprocessing 模块提供了强大的多进程支持&#xff0c;能够帮助我们充分利用多核CPU资源来实现并行计算。相比传统的多线程模式&#xff0c;Python的多进程模式更加高效&#xff0c;因为它可以避免Python的全局解释器锁&#xff08;GIL&#xff09;对…

一个超强大的Python数据探索工具

在数据分析的过程中&#xff0c;快速掌握数据集的基本特征是必不可少的一步。虽然 Pandas 提供了方便的 df.describe() 方法来生成数据摘要&#xff0c;但随着数据类型和分析需求的多样化&#xff0c;这一方法的局限性逐渐显现。Skimpy 作为一个新兴的 Python 包&#xff0c;旨…

基于mybatis-plus创建springboot,添加增删改查功能,使用postman来测试接口出现的常见错误

1 当你在使用postman检测 添加和更新功能时&#xff0c;报了一个500错误 查看idea发现是&#xff1a; Data truncation: Out of range value for column id at row 1 通过翻译&#xff1a;数据截断&#xff1a;表单第1行的“id”列出现范围外值。一般情况下&#xff0c;出现这个…

什么是Agent智能体?

你好&#xff0c;我是三桥君 近期&#xff0c;从各大厂商的年度大会到多个大型AI峰会&#xff0c;三桥君明显感受到行业风气的转变。这些会议不仅展示了众多AI Agent的实际应用案例&#xff0c;还有专家们对未来发展的预测。一时间&#xff0c;“Agent”这个词成为了热门词汇&…

Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制

技术背景 在操作系统领域&#xff0c;很多核心技术掌握在国外企业手中。如果过度依赖国外技术&#xff0c;在国际形势变化、贸易摩擦等情况下&#xff0c;可能面临技术封锁和断供风险。开发国产操作系统可以降低这种风险&#xff0c;确保国家关键信息基础设施的稳定运行。在一…

多态的遗留问题以及C++中杂项,C++面试题

C面试题 1.什么是虚函数&#xff1f;什么是纯虚函数 虚函数&#xff1a;在类的继承中&#xff0c;基类中的函数前加virtual声明的函数就是虚函数。 虚函数实现了运行的多态&#xff0c;同一函数调用在不同对象中表现出不同的行为 纯虚函数&#xff1a;在基类中声明但没有实…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

软件无线电3-微相E316和HackRF实现FM调制解调

前面介绍了基于Matlab、矢量信号器和HackRF One实现射频下的FM调制解调&#xff0c;今天分享的内容是用微相E316替代矢量信号器完成发射工作。注意本文仅用于科研和学习&#xff0c;私自搭建电台属于违法行为。 1.概述 微相E316和HackRF One实现FM调制解调测试框图如1所示&am…

离散化 ---( 求区间和)

什么是离散化&#xff1f; 离散化是将连续的数值范围映射到有限的、离散的数值集合的过程。在许多情况下&#xff0c;数据可能会存在多个重复值或范围较大的连续值。为了简化处理&#xff0c;尤其是处理区间查询和增量问题时&#xff0c;我们可以将这些值转换为一组有限的、唯一…

【重学 MySQL】四十、SQL 语句执行过程

【重学 MySQL】四十、SQL 语句执行过程 select 语句的完整结构select 语句执行顺序SQL 语句执行原理 select 语句的完整结构 SELECT 语句是 SQL&#xff08;Structured Query Language&#xff09;中用于从数据库表中检索数据的核心语句。一个完整的 SELECT 语句结构可以包括多…

Linux系统部署Mysql8.x修改密码并且设置远程连接

配置yum仓库配置yum仓库 # 更新密钥 rpm import https:repo.mysql.com/RPM-GPG-KEY- mysql-2023 # 安装Mysql8.x版本 yum库 rpm -Uvh https:dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm 由于MySQL并不在CentOS的官方仓库中&#xff0c;所以我们通过上述rp…

跟李沐学AI:自注意力和位置编码

自注意力 自注意力机制&#xff08;Self-Attention Mechanism&#xff09;&#xff0c;也被称为内部注意力&#xff08;Intra-attention&#xff09;或并行注意力&#xff08;Parallel Attention&#xff09;&#xff0c;是一种在深度学习模型中用于处理序列数据的机制。它允许…

新版pycharm如何导入自定义环境

我们新的版本的pycharm的ui更改了&#xff0c;但是我不会导入新的环境了 我们先点击右上角的add interpreter 然后点击添加本地编译器 先导入这个bat文件 再点击load 我们就可以选择我们需要的环境了

解决毕业论文难题!推荐7款AI自动生成论文工具网站

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是七款值得推荐的AI自动生成论文工具网站&#xff0c;特别推荐千笔-AIPassPaper。…

arthas简单应用

背景说明 项目上某个接口响应时间过长&#xff0c;需要查看方法耗时情况进行优化 安装配置 访问下载页进行下载&#xff1a;下载 | arthas 调整文件位置进行解压缩 - 查看arthas帮助命令&#xff08;非必须&#xff0c;官网文档更详细&#xff09; C:\tools\arthas\4.0.1\b…