使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试

目录

    • 所需工具
    • 配置Jrebel 开启热部署
      • 准备jrebel服务端所需的`jrebel.jar`和`libjrebel64.so`/`libjrebel64.dylib`文件
    • 在idea中配置Docker(使用idea操作docker)
    • 撰写和配置Dockerfile发布镜像并运行容器
    • 开启远程Debug,使用Idea链接远程服务debug端口进行调试
    • 使用idea开发代码并随时热部署到容器中
          • `PS:在这儿为了操作简单,因此我把mvn打包项目添加到了Before Launch中,同时我也建议您这么做,毕竟很简单嘛!`
    • 测试
      • 测试jrebel的热部署
    • 如果有错误或不足的地方,请你多多留言指正。

所需工具

  1. 安装有Idea和Jrebel plugin的PC
  2. 安装有Docker的机器

PS: 经本人测试在MacOs 10.13、Idea 2019.2、Centos7、Jrebel 2019.2 、Docker18.06.3 上运行成功

配置Jrebel 开启热部署

  1. 选择需要部署的项目类型,这里我选择了SpringBoot2.x。你也可以选择使用外置Tomcat容器之类的项目
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第1张图片
  2. 选择后如下图所示
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第2张图片

ps:以上两步操作的目的是为了可以明确看到不同方式部署项目所需要的额外命令行参数

准备jrebel服务端所需的jrebel.jarlibjrebel64.so/libjrebel64.dylib文件

  1. 准备jrebel.jar
    这个jar包是jrebel server端运行所需的,我这里为了简单起见,就直接使用idea 的jrebel plugin的了。这个jar的路径可以从idea的Preferences中查看,具体如下图:
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第3张图片
  2. 拷贝这个jar到项目资源路径下并在.gitignore文件中添加**/jrebel.jar
    使用以上方式当然可行,但是我的做法是直接把它放到了远程静态资源中方便以后使用时通过网络直接获取。
    我这样做的目的是为了避免在接下来Docker为每个springCloud子工程打镜像时每次都需要复制这个jar到相应的目录
    在这里插入图片描述
  3. 拷贝libjrebel64.so到项目资源路径下并在.gitignore文件中添加**/libjrebel64.so
    这一步需要根据操作系统选择相应的文件,64位操作系统就选择64结尾的,32位操作系统就选择32结尾的;Linux选择.so后缀的,Mac选择.dylib结尾的,windows选择.dll结尾的
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第4张图片
    同样地我也将libjrebel64.so放置到了服务器上。

附上本人的地址:
jrebel.jar https://ali.scyuan.xyz/other/jrebel.jar
libjrebel64.so https://ali.scyuan.xyz/other/libjrebel64.so

在idea中配置Docker(使用idea操作docker)

关于这一步的操作参见CentOS7开启docker远程访问并在idea中连接使用
如果还没有安装docker可以参考安装Docker和docker-compose的脚本
如果有问题请留言联系我,以便及时解决。

撰写和配置Dockerfile发布镜像并运行容器

在这儿我选择了使用docker运行项目

  1. idea中配置如下
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第5张图片
  2. Dockerfile文件使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第6张图片
FROM openjdk:8-jre
ENV SERVER_PORT=80
ENV SPRING_CLOUD_CONFIG_LABEL=d2
ENV SPRING_CLOUD_CONFIG_PROFILE=d2
ENV EUREKA_URLS="eureka集群地址"
VOLUME /logs/
ADD target/app.jar /app.jar
ADD https://ali.scyuan.xyz/other/libjrebel64.so  /libjrebel64.so
ADD https://ali.scyuan.xyz/other/jrebel.jar  /jrebel.jar
EXPOSE $SERVER_PORT
ENTRYPOINT ["java",  "-jar", "-Xdebug", "-Xrunjdwp:server=y,transport=dt_socket,address=81,suspend=n","-agentpath:/libjrebel64.so","-Drebel.remoting_plugin=true", "-Djava.security.egd=file:/dev/./urandom", "/app.jar","--spring.cloud.config.label=${SPRING_CLOUD_CONFIG_LABEL}", 
"--spring.cloud.config.profile=${SPRING_CLOUD_CONFIG_PROFILE}", "--server.port=${SERVER_PORT}",
 "--eureka.client.serviceUrl.defaultZone=${EUREKA_URLS}"]
  • 在这儿或许你会有疑问,为何我不将这两个文件打包为一个包,然后一起下载呢?
  • 原因是因为ADD命令从网络下载文件时并不会自动解包,然而可能某些container中并没有解包指令,我也懒得安装了,所以就直接分开为两个文件了。毕竟为了简单嘛!

开启远程Debug,使用Idea链接远程服务debug端口进行调试

只要在命令行中增加如下命令

-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=远程调试端口,suspend=n

java -jar -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=远程调试端口,suspend=n app.jar

使用idea开发代码并随时热部署到容器中

  1. 允许指定项目使用热部署,操作如图所示 使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第7张图片

  2. 编写简单demo测试热部署,简简单单就好
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第8张图片

  3. 在idea中配置docker打包并发布项目到容器中

PS:在这儿为了操作简单,因此我把mvn打包项目添加到了Before Launch中,同时我也建议您这么做,毕竟很简单嘛!

使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第9张图片

  1. 构建镜像并运行

  2. 确保容器启动,项目启动成功如图

  • 日志可以在docker容器的log选项中看到,也可以使用下列命令行查看日志
docker logs -f -t --tail 日志显示行数 container_name  # 滚动查看尾部n行日志
docker logs -f container_name  # 滚动查看所有日志
  • 如果container启动失败,可以进入容器内查看所需文件是否正确被打包:
docker run -it --rm [--name container_name] imgge[:tag] bash  # 交互模式进入容器
……  # 更多命令请自行查阅文档


6. 服务启动后需要配置jrebel客户端连接到jrebel server,保证可以向server端通信

  • 添加server,并确保连接成功,即出现图中的 Connection Successful.
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第10张图片
  • 将项目与remote server绑定
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第11张图片

测试

测试jrebel的热部署

  1. 首先确保服务的debug端口和服务端口处于被防火墙放行的状态
  2. 访问服务接口确保正常访问
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第12张图片
  3. 修改代码,并热部署
    这一步操作中,一般在修改代码后,隔一段时间后jrebel就会自动检测到target下某些文件的修改并及时更新值远程项目中。
    或者手动编译下项目,command+F9+fn/command+shift+F9+fn/ctrl+F9/ctrl+shift+F9+fn.
    更新成功后jrebel console中会出现如下所示提示同步成功。再次访问时就已经变为最新内容了。
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第13张图片
  4. 测试远程调试
  • 查看自己的dubug端口,区别于服务端口
    在这里插入图片描述
  • 在项目的Edit configurations中增加remote debug配置
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第14张图片
  • 与服务的debug建立连接
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第15张图片
  • 访问服务并打断点调试,具体怎么debug就不说了
    使用Jrebel+Docker+Idea远程热部署SpringBoot2.x项目并远程调试_第16张图片

至此为止,恭喜已经成功地完成了所有步骤

如果有错误或不足的地方,请你多多留言指正。

你可能感兴趣的:(SpringCloud,Docker,SpringBoot,jrebel,SpringBoot,Docker,排查错误,调试,热部署)