• 基于 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 下的命令

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

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

    4. 启动服务

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

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

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

### 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

# 服务启动(阻塞)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. 下载安装包,确保容器启动用户有权限访问该路径
curl -O http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip
  1. 下载好后可以通过 FTP/SFTP 工具上传至服务器,在 CentOS 下使用 unzip 进行解压,得到 jrebel 文件夹
unzip jrebel-stable-nosetup.zip
  1. 设置密码(进入到 jrebel 目录)
java -jar jrebel.jar -set-remote-password <password># 例如,设置密码为 12341234java -jar jrebel.jar -set-remote-password 12341234
  1. 激活服务端(进入到 jrebel/bin 目录,执行脚本)

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

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

./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

./activate.sh <activation-code>

1563239243081

### 2. 配置本地 JRebel

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

1563239986427

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

1563240819085

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

1563240728219

  1. 服务器端启动服务
  • 启动参数
-agentpath:[/path/to/JRebel Agent] -Drebel.remoting_plugin=true
  • 热部署启动
# 远程热部署 启动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.jarjava -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. 说明启动了远程热部署
Listening for transport dt_socket at address: 50052019-07-16 09:15:20 JRebel:  Starting logging to file: /root/.jrebel/jrebel.log2019-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 prevented2019-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 远程调试与部署
  • [ ] 远程调试,服务阻塞怎么办

## 参考资料

本文由mdnice多平台发布


用户bPc8bBJ
23 声望3 粉丝