热部署的那些事

一、起因

马上就大四了,准备写个能够拿得出手的项目面试时候用,恰好现在也在实训,然后准备开始写项目,然后想起来,之前用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,好了以后重启,这就安装结束了,接下来说一下破解(再次声明:只作为个人学习使用,有钱的请支持正版)

破解之前需要两个东西:

在这里插入图片描述

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

在这里插入图片描述

然后不要关闭。接着打开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。



❤️往期精选:❤️
mybatis从0到1–学mybatis看这一篇就足够
小白学设计模式–单例模式(singleton)
Redis进阶:主从复制–小白的进阶教程(理论:一文搞懂主从复制)


❤️ 如有错误欢迎指出❤️
❤️ 点击访问更多个人博客 www.wslhome.top❤️

❤️每天进步一点点 ❤️

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sirwsl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值