热部署的那些事

本贴最后更新于 1355 天前,其中的信息可能已经时异事殊

一、起因

马上就大四了,准备写个能够拿得出手的项目面试时候用,恰好现在也在实训,然后准备开始写项目,然后想起来,之前用 eclipse 的时候 eclipse 可以热部署,虽然用 idea 好长时间了,但是发现我以前用 idea 没有在意过这个问题,每次都是重启项目,哪怕做个很小的更改也是在不断的重启项目。现在一想,自己的好多时间都用在了重启项目上去了,然后就有了这篇文章。

二、基础知识:

使用场景

本地调试、线上发布、频繁的部署、启动耗时长的无法停止的服务应用。

eg:我们在开发比较大的系统的时候,很多时候在 debug 的时候修改了代码然后就重启服务,但是有的大的服务每次启动都会耗时很长,这时候本地调试的热部署就出现了。

eg:有时候想过这样的一个问题吗?例如英航系统需要全年不间断的运行,但是银行系统真的就不需要升级或者优化吗?在升级期间下线所有服务吗?这时候热部署就出现了。

优点

  • 无论本地还是线上都适用,无需重启服务
  • 能够提高开发、调试的效率
  • 能够提高发布、运维的效率,降低运维的成本

热部署与热加载

类加载过程:

java 类加载过程.png

类加载器特点

  • 由 AppClass Loader(系统类加载器)开始加载指定的类
  • 类加载器加载任务交给其父,如果其父找不到,再自己去加载。
  • Bootstrap Loader(启动类加载器)是最顶级的类加载器

热加载五个阶段:

  • 加载:找到类的静态存储结构后加载到虚拟机中,然后转化方法区为运行时的数据结构,生产 Class 对象。用户可以自定义类加载器参与进来
  • 验证: 确保字节码是安全的,以保证不会对虚拟机造成危害,可以通过 java 虚拟机的一些参数来限制一些验证。但有可能会对虚拟机安全有所损害。
  • 准备 : 确定内存布局,初始化类遍历,只是赋初始值,并不是会执行程序自己的赋值操作。
  • 解析:将符号应用变为直接引用
  • 初始化:调用程序自定义代码,eg;程序真实赋值进行初始化。

共同点: 不重启服务器就能够部署相符,都是基于 java 类加载器实现的

部署方式:

热部署在服务器运行时候重启加载项目

热加载在运行时候重新加载 class

实现原理:

热部署直接加载整个应用,需要耗费更多的时间

热加载依赖 java 类加载机制,在容器运行时候通过重新加载来改变类的信息

安全性:

热加载直接修改 java 虚拟机中的字节码的信息,造成难以监控,无法记录代码逻辑的变化,越注重安全的应用风险越高。热部署更多的是在生产环境中使用,热加载则更多的是在开发环境中使用。

三、idea 自带热部署

其实 idea 也有自带的热部署,我们在部署的时候讲发布模式改为 exploded 而不是 war 模式

image.png

设置 VM option:

image.png

接下来简单说一下 war 与 exploded 区别:

war 模式下,每次重启都会讲工程打包为 war 包。然后讲 war 包推送给 tomcat 运行。在发布后更改项目中的东西,由于没有重启重新打包,所以资源不会更新。

exploded 模式下获取的是 target 所在路径,之后跟新 target 下的 class 文件后就会起到更新的作用。

四、idea 插件 jrebel 热部署

jrebel 是我最推荐的插件,贼好用,比起其他的来,简直是方便快捷。接下来说一下下载与破解(PS:不得用于商用,仅做个人学习使用,如果有钱还是必须要支持一下正版的,毕竟作为程序员都理解)

安装:

在 IDEA>Setting>Plugins 下搜索 Jrebel

image.png

然后 install,好了以后重启,这就安装结束了,接下来说一下破解(再次声明:只作为个人学习使用,有钱的请支持正版)

破解之前需要两个东西:

image.png

这是我下载的,下载之后直接打开可以看见:

image.png

然后不要关闭。接着打开 GUID 的网页,复制 GUID

image.png

接下来在 idea 中 File>Setting>JRebel&XRebel

image.png

选择 Team URL

第一行填写:http:127.0.0.1:8888/生成的 GUID

第二行填写邮箱:test@123.com

image.png

之后可以看见有限期 180 天

image.png

设置自动编译功能:File>Setting>Builder>Compiler

image.png

保存退出后安 shift+Ctrl+Alt+/。选择 Registry。之后勾选 compiler.automake.allow.when.app.running

image.png

接下来你就可以看见原来的地方多了几个东西

image.png

然后第一个是 run,第二个是 debug。你点第一个运行。热部署就实现了

五、springboot 热部署

在 springboot 中由 springloaded 与 spring-boot-devtools 两种热部署方式

springloaded

在 build>plugins>plugin>dependencies> 下面引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
    <version>1.2.6.RELEASE</version>
</dependency>

之后通过配置运行环境或者 mvn spring-boot:run 运行(个人不喜欢,所以不写具体步骤了不喜欢原因如下)

存在问题: 配置略显麻烦,每次使用时候,只能在原有代码中修改(eg:修改返回值之类)如果新添加方法或者其他的就会无效需要重新运行。

spring-boot-devtools

直接在 maven 中添加依赖:

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

如果是 springboot 项目,然后没有插件,这个方式是最为推荐的,最大的优点简单。直接设置 optional 为 true 就 OK。

end

今天就到此为止

  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 159 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    273 引用 • 679 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...