一、起因
马上就大四了,准备写个能够拿得出手的项目面试时候用,恰好现在也在实训,然后准备开始写项目,然后想起来,之前用 eclipse 的时候 eclipse 可以热部署,虽然用 idea 好长时间了,但是发现我以前用 idea 没有在意过这个问题,每次都是重启项目,哪怕做个很小的更改也是在不断的重启项目。现在一想,自己的好多时间都用在了重启项目上去了,然后就有了这篇文章。
二、基础知识:
使用场景
本地调试、线上发布、频繁的部署、启动耗时长的无法停止的服务应用。
eg:我们在开发比较大的系统的时候,很多时候在 debug 的时候修改了代码然后就重启服务,但是有的大的服务每次启动都会耗时很长,这时候本地调试的热部署就出现了。
eg:有时候想过这样的一个问题吗?例如英航系统需要全年不间断的运行,但是银行系统真的就不需要升级或者优化吗?在升级期间下线所有服务吗?这时候热部署就出现了。
优点
- 无论本地还是线上都适用,无需重启服务
- 能够提高开发、调试的效率
- 能够提高发布、运维的效率,降低运维的成本
热部署与热加载
类加载过程:
类加载器特点:
- 由 AppClass Loader(系统类加载器)开始加载指定的类
- 类加载器加载任务交给其父,如果其父找不到,再自己去加载。
- Bootstrap Loader(启动类加载器)是最顶级的类加载器
热加载五个阶段:
- 加载:找到类的静态存储结构后加载到虚拟机中,然后转化方法区为运行时的数据结构,生产 Class 对象。用户可以自定义类加载器参与进来
- 验证: 确保字节码是安全的,以保证不会对虚拟机造成危害,可以通过 java 虚拟机的一些参数来限制一些验证。但有可能会对虚拟机安全有所损害。
- 准备 : 确定内存布局,初始化类遍历,只是赋初始值,并不是会执行程序自己的赋值操作。
- 解析:将符号应用变为直接引用
- 初始化:调用程序自定义代码,eg;程序真实赋值进行初始化。
共同点: 不重启服务器就能够部署相符,都是基于 java 类加载器实现的
部署方式:
热部署在服务器运行时候重启加载项目
热加载在运行时候重新加载 class
实现原理:
热部署直接加载整个应用,需要耗费更多的时间
热加载依赖 java 类加载机制,在容器运行时候通过重新加载来改变类的信息
安全性:
热加载直接修改 java 虚拟机中的字节码的信息,造成难以监控,无法记录代码逻辑的变化,越注重安全的应用风险越高。热部署更多的是在生产环境中使用,热加载则更多的是在开发环境中使用。
三、idea 自带热部署
其实 idea 也有自带的热部署,我们在部署的时候讲发布模式改为 exploded 而不是 war 模式
设置 VM option:
接下来简单说一下 war 与 exploded 区别:
war 模式下,每次重启都会讲工程打包为 war 包。然后讲 war 包推送给 tomcat 运行。在发布后更改项目中的东西,由于没有重启重新打包,所以资源不会更新。
exploded 模式下获取的是 target 所在路径,之后跟新 target 下的 class 文件后就会起到更新的作用。
四、idea 插件 jrebel 热部署
jrebel 是我最推荐的插件,贼好用,比起其他的来,简直是方便快捷。接下来说一下下载与破解(PS:不得用于商用,仅做个人学习使用,如果有钱还是必须要支持一下正版的,毕竟作为程序员都理解)
安装:
在 IDEA>Setting>Plugins 下搜索 Jrebel
然后 install,好了以后重启,这就安装结束了,接下来说一下破解(再次声明:只作为个人学习使用,有钱的请支持正版)
破解之前需要两个东西:
- 反代理软件:去 GitHub 上下载:https://github.com/ilanyu/ReverseProxy/releases/tag/v1.4
- GUID(一会用):在线生成网址:
这是我下载的,下载之后直接打开可以看见:
然后不要关闭。接着打开 GUID 的网页,复制 GUID
接下来在 idea 中 File>Setting>JRebel&XRebel
选择 Team URL
第一行填写:http:127.0.0.1:8888/生成的 GUID
第二行填写邮箱:test@123.com
之后可以看见有限期 180 天
设置自动编译功能:File>Setting>Builder>Compiler
保存退出后安 shift+Ctrl+Alt+/。选择 Registry。之后勾选 compiler.automake.allow.when.app.running
接下来你就可以看见原来的地方多了几个东西
然后第一个是 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
今天就到此为止
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于