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

2023年 7月 12日 23.5k 0

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

    前言

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

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

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

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

    配置环境说明

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

    • 框架:SpringBoot 2.1.6
    • 工具:IntelliJ IDEA 2019.1.3 x64
    • 服务器:CentOS Linux release 7.6.1810
    • JDK:Java 1.8
    • JRebel
      • 官网:JRebel, XRebel & QRebel By ZeroTurnaround | JRebel.com
      • 文档:JRebel — JRebel 2019.x documentation

    一、远程调试配置

    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天)

  • 进入官网 Evaluate JRebel,填写完整信息
  • 1563195929214

  • 点击 Register 获取激活码
  • 1563195961612

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

  • 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)。

  • 由于网络稳定性考虑,这里我们将搭建自己的 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任意一个邮箱 进行和谐(这里我们先准备好这两个参数即可)

  • 在 Team URL 中填入以上两个参数,即可实现激活
  • 1563285310324

    1563285346373

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

    1563285389975

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

    • beer_tools for jrebel

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

    • JRebel永久破解激活方法 - songfei_dream的专栏
    • idea离线使用jrebel(亲测可用) - lzt099的博客 - CSDN博客
    • Jrebel在Idea中使用 - 鹰眼eagle-故障主动识别 - 3MS知识管理社区
    • JrebelLicenseServerforJava: A license server for Jrebel & JetBrains products, it also support JRebel for Android and XRebel.
    • IDEA+Jrebel实现热部署和远程调试 - ManageOne云服务保障 - 3ms知识管理社区

    3. 设置 IDEA 为自动编译

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

  • 按住 Ctrl + Alt + Shift + / 弹出,选择 Registry 后勾选
  • 1563196625339

    1563196598708

    4. Debug 启动服务

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

    1563196770320

    1563197215671

    5. 本地热部署

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

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

    三、远程热部署

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

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

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

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

  • 下载安装包,确保容器启动用户有权限访问该路径
  • curl -O http://dl.zeroturnaround.com/jrebel-stable-nosetup.zip
    
    • 由于,使用 SpringBoot 2.x,必须要下载安装最新版的 JRebel

    • 也可以通过官网地址:JRebel Release Archive | JRebel.com,进行下载

  • 下载好后可以通过 FTP/SFTP 工具上传至服务器,在 CentOS 下使用 unzip 进行解压,得到 jrebel 文件夹
  • unzip jrebel-stable-nosetup.zip
    
  • 设置密码(进入到 jrebel 目录)
  • java -jar jrebel.jar -set-remote-password # 例如,设置密码为 12341234java -jar jrebel.jar -set-remote-password 12341234
    
  • 激活服务端(进入到 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 
    

    1563239243081

    2. 配置本地 JRebel

  • Startup 初始化配置,点击确认
  • 1563239986427

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

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

  • 服务器端启动服务

    • 启动参数
    -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:  #############################################################
    
  • 本地 JRebel -> Remote Servers 添加远程服务器
  • 1563240185570

  • 点击 Test Connection,点击 OK 确认
  • 1563240386725

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

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

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

    TODO

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

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

    参考资料

    • Intellij IDEA基于Springboot的远程调试 - 程序新视界 - CSDN博客
    • IDEA + Spring Boot + JRebel 热部署不能自动编译的解决方案和启动的几种方式 - github.com/duanluan - CSDN博客
    • IntelliJ IDEA热部署插件JRebel免费激活图文教程(持续更新)_心得技巧_积微成著
    • JRebel遠端熱部署springboot教程 - IT閱讀
    • 微服务开发神器–JRebel 插件破解和实现本地/远程热部署教程(IntelliJ IDEA版) - 掘金
    • JRebel远程热部署springboot教程 - whz的博客 - CSDN博客

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论