基于 SpringBoot & IDEA & JRebel 玩转远程热部署与远程调试

前言

在 SpringBoot 开发过程中,当我们在 Debug 我们的工程时,随便修改一段代码逻辑、修改接口路由、新增一个工具类等等情况下,都需要我们重新启动工程。反复的修改逻辑,反复的重启,这是相当痛苦的过程。当工程越来越大的时候,效率将变得特别低下,大部分的时间就是在不断的重启项目、编译包、部署包。

近期在研究基于 SpringBoot + IDEA 远程调试功能,可以通过 remote-debug 方式对测试环境中的 JVM 中的代码进行调试。所谓的远程调试就是,在本地代码可以调试服务器上的代码,模拟真实环境的请求(前提是本地的代码必须和远程服务器运行的代码一致)。在这种调试环境下,只能修改少量基本的业务代码,例如新增一个函数则都无法生效。

这里强力推荐 JRebel 插件,JRebel 是一款热部署插件。当项目在 Debug 的时候,修改某一个 Java文件时,JRebel 就可以解决在项目运行状态 debug 状态下任意修改 Java文件并动态反馈到运行的项目中。JRebel 有两个非常酷的特性,(一)支持热部署(二)支持远程热部署

查阅大量资料,总算对配置非常清晰,决定详细整理以供备忘,也系统可以帮助小白更快的实现远程部署与远程调试!

配置环境说明

这里以我的配置环境为例,进行

一、远程调试配置

1. 右上角点击,Edit Configurations,点击 + 号,创建 Remote 应用

1563194200137

2. 填写远程服务器信息

  • Name:应用名
  • Host:服务器地址
  • Port:5005

1563194304996

3. 复制 Command line arguments for remote JVM 下的命令

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

说明:自此,已经获得了启动远程服务的参数,命令将在启动的时候来使用

4. 启动服务

我们知道 SpringBoot 通过 Maven 打包后会生成 jar 包,服务端我们通过 jar -jar 的方式启动。通过上一步我们获得了服务端启动的配置参数命令,我们可以执行一下命令启动我的服务。

1
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 webapp.jar

我们可以用如下命令进行验证是否监听成功

1
netstat -anp | grep 5005

5. 远程调试

选择我们配置的远程调试项,点击 Debug 即可进行远程调试。

1563194804383

1563194936470

启动完成,对需要 Debug 的代码打上断点,剩下的操作步骤就是访问远程服务器对应的业务请求,本地就会同步Debug。

😎 自此,可以尽情的开始远程调试工作了!

但是在使用远程调试的过程中,如果进行了断点,会出现服务阻塞的情况。如何解决这样的问题,将在下面进行描述。

二、热部署

这里将引入 JRebel 插件,可以实现对本地的服务和远程的服务进行热部署。本节将主要针对本地热部署进行配置。

1. IDEA 中安装 Jrebel 插件

File -> Settings -> Plugins -> Search plugins in marketplace

搜索 JRebel for IntelliJ 安装即可,离线安装包下载地址:JRebel for IntelliJ - Plugins | JetBrains

1563195324070

安装完成后,重启 IDEA 生效。此时在 Settings 面板中会出现 JRebel 的选项卡

1563195374877

2. 激活 JRebel 插件

(一)官方 Active Code 方式激活(只可使用10天)

  1. 进入官网 Evaluate JRebel,填写完整信息

1563195929214

  1. 点击 Register 获取激活码

1563195961612

此时即可获取你的激活码,复制保存到本地,后续将会用到。

  1. JRebel 插件激活

点击 help -> JRebel -> Activaction -> Activation code,将我们网页上获取到的 Activation code 粘贴后,点击 Activate JRebel 即可激活。

1563196093481

激活成功后在 JRebel 配置面板中,会显示 VALID 标志,即说明激活成功了。

1563196236960

此时,你已经获取到了试用版的 JRebel 的使用权限,即可实现本地热部署的功能,可以进行第 3 步配置。(其他激活方式请参考:Activation — JRebel 2019.x documentation,若想要永久破解,请往下阅读。)

(二)永久和谐方式

本人用户正版软件,推荐尽可能使用正版,如果想要 cracked(和谐)可以参考以下配置说明

在这里我们将通过 JRebel 的 Team URL(connect to online licensing service) 方式进行和谐(cracked)。

  1. 由于网络稳定性考虑,这里我们将搭建自己的 license server for JRebel

具体的搭建过程可以参考 Gitee 上的这位作者的仓库配置说明:JrebelLicenseServerforJava: A license server for Jrebel。当然同时,这里我也将提供一个打包完成的 jar 包,直接上传至服务器运行即可。

JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies

1
2
3
4
5
# 服务启动(阻塞)
java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -port 8081

# 服务启动(后台),推荐使用这种方式
nohup java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -port 8081 &

浏览器中打开链接 http://192.168.72.131:8081 ,出现如下界面则服务端配置成功。

1563284703729

如果是团队协作推荐搭建在一台内部都能够访问的服务器。

这里我使用的 JRebel 是 JRebel for IntelliJ v2019.1.4 版本的,我们可以通过如下 URL 进行注册

  • http://host:8081/{guid},其中 GUID 可以通过在线工具自己生成一个,用于区分不同的用户,而 GUID 基本上是不会出现重复的情况。生成GUID - 程序员在线工具
  • 在此处,我可以通过 http://192.168.72.131:8081/bc1fdd38-9be0-4251-a619-e14a4a6c21b9任意一个邮箱 进行和谐(这里我们先准备好这两个参数即可)
  1. 在 Team URL 中填入以上两个参数,即可实现激活

1563285310324

1563285346373

在 file->settings->plugins->JRebel 中查看是否已显示激活,激活后显示 valid,图标为绿色。此时可以点击 Work offline 实现离线的验证,离线下有效期为半年时间,半年后可以重新认证即可。若是 online 则实时会往服务端进行匹配验证。推荐使用 Work offline 方式!

1563285389975

  1. 补充:这里我们主要使用自己搭建 Server 的方式进行验证,这里也提供一些网上第三方的服务平台。在网络可达的情况下,免去搭建的烦恼。

在和谐的过程中,参考的一些资料:

3. 设置 IDEA 为自动编译

  1. 由于 JRebel 是实时监控 class 文件的变化来实现热部署的,所以在 IDEA 环境下需要打开自动编译功能才能实现随时修改,随时生效。

1563196516607

  1. 按住 Ctrl + Alt + Shift + / 弹出,选择 Registry 后勾选

1563196625339

1563196598708

4. Debug 启动服务

选择 SpringBoot 的入口类,右键选择 Debug with JRebel,等待启动完成即可

1563196770320

1563197215671

5. 本地热部署

此时可以修改或者增加代码,通过 Ctrl + Shift + F9 即可实现重新编译热部署。此时再也不需要每增加一个函数体、类都需要进行重启的操作,大大提升了 SpringBoot 开发调试的效率。

🤩 自此,我们已经学会了本地热部署的方式,需要远程调试与热部署方式进行配合调试请往下阅读。

三、远程热部署

在本节,将针对远程热部署与调试进行说明,搭建一个高效的开发测试环境。

配置远程热部署服务,主要步骤如下:

  1. 在服务器安装 JRebel
  2. 配置本地 JRebel
  3. 在服务器用 JRebel 启动专案
  4. 本地新增远端服务器进行热部署

1. 配置服务器 JRebel

官方配置文档:JRebel remote server support in IntelliJ IDEA — JRebel 2019.x documentation

  1. 下载安装包,确保容器启动用户有权限访问该路径
1
curl -O http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip
  1. 下载好后可以通过 FTP/SFTP 工具上传至服务器,在 CentOS 下使用 unzip 进行解压,得到 jrebel 文件夹
1
unzip jrebel-stable-nosetup.zip
  1. 设置密码(进入到 jrebel 目录)
1
2
3
4
java -jar jrebel.jar -set-remote-password <password>

# 例如,设置密码为 12341234
java -jar jrebel.jar -set-remote-password 12341234
  1. 激活服务端(进入到 jrebel/bin 目录,执行脚本)

在激活服务端中,JRebel 也提供了 3 种激活方式,详细地址:Activation — JRebel 2019.x documentation

在这里我们通过 With license server URL as an argument 方式,具体脚本如下

1
./activate.sh http://192.168.72.131:8081/bc1fdd38-9be0-4251-a619-e14a4a6c21b9 frank_lin@whu.edu.cn

1563286046514

With evaluation license activation code as an argument

1
./activate.sh <activation-code>

1563239243081

2. 配置本地 JRebel

  1. Startup 初始化配置,点击确认

1563239986427

  1. JRebel Panel 窗口,将需要热部署的项目打包,生成 rebel.xmlrebel-remote.xml,如下图:

1563240819085

  1. 通过 maven package 重新打包生成 jar 包,上传至服务器

1563240728219

  1. 服务器端启动服务
  • 启动参数
1
-agentpath:[/path/to/JRebel Agent] -Drebel.remoting_plugin=true
  • 热部署启动
1
2
3
4
5
6
7
8
# 远程热部署 启动
java -agentpath:/root/commom/jrebel/lib/libjrebel64.so -Drebel.remoting_plugin=true -jar webapp.jar

# 远程热部署+远程调试 启动
java -agentpath:/root/commom/jrebel/lib/libjrebel64.so -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Drebel.remoting_plugin=true -jar webapp.jar


java -agentpath:/var/www/jrebel/lib/libjrebel64.so -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Drebel.remoting_plugin=true -jar webapp.jar -port 8083

详细官网配置说明:Server configuration — JRebel 2019.x documentation

1563239798406

启动日志如下,即说明启动成功

  • Listening for transport dt_socket at address: 5005 说明启动了远程调试
  • JRebel started in remote server mode. 说明启动了远程热部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Listening for transport dt_socket at address: 5005
2019-07-16 09:15:20 JRebel: Starting logging to file: /root/.jrebel/jrebel.log
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel: #############################################################
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel: JRebel Agent 2019.1.4 (201907051008)
2019-07-16 09:15:20 JRebel: (c) Copyright 2007-2019 Rogue Wave Software, Inc.
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel: Over the last 1 days JRebel prevented
2019-07-16 09:15:20 JRebel: at least 0 redeploys/restarts saving you about 0 hours.
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel: JRebel started in remote server mode.
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel:
2019-07-16 09:15:20 JRebel: #############################################################
  1. 本地 JRebel -> Remote Servers 添加远程服务器

1563240185570

  1. 点击 Test Connection,点击 OK 确认

1563240386725

  1. 此时即可点击右上角 “远程热部署” 按钮后,通过 Ctrl + Shift + F9 即可实现重新编译热远程部署

1563241396567

可以先远程热部署后,再点击远程调试 Debug,即可实现先热部署再调试,大大加快开发效率。

😄 自此,所有的配置过程都结束了!即可开始尽情享受,JRebel 远程热部署和远程调试~ 实现真正的热部署,无论是改了代码片段还是配置文件,都可以做到不用重新启动就生效!

TODO

文档还有很多不足的地方,这是接下来会更新的部分

  • [ ] 基于 Docker 远程调试与部署
  • [ ] 远程调试,服务阻塞怎么办

参考资料