使用Jrebel+Docker+Idea遠程熱部署SpringBoot2.x項目並遠程調試

所需工具

  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容器之類的項目
    選擇部署項目類型
  2. 選擇後如下圖所示
    選擇SpringBoot2.x爲例

ps:以上兩步操作的目的是爲了可以明確看到不同方式部署項目所需要的額外命令行參數

準備jrebel服務端所需的jrebel.jarlibjrebel64.so/libjrebel64.dylib文件

  1. 準備jrebel.jar
    這個jar包是jrebel server端運行所需的,我這裏爲了簡單起見,就直接使用idea 的jrebel plugin的了。這個jar的路徑可以從idea的Preferences中查看,具體如下圖:
    jrebel.jar路徑
  2. 拷貝這個jar到項目資源路徑下並在.gitignore文件中添加**/jrebel.jar
    使用以上方式當然可行,但是我的做法是直接把它放到了遠程靜態資源中方便以後使用時通過網絡直接獲取。
    我這樣做的目的是爲了避免在接下來Docker爲每個springCloud子工程打鏡像時每次都需要複製這個jar到相應的目錄
    在這裏插入圖片描述
  3. 拷貝libjrebel64.so到項目資源路徑下並在.gitignore文件中添加**/libjrebel64.so
    這一步需要根據操作系統選擇相應的文件,64位操作系統就選擇64結尾的,32位操作系統就選擇32結尾的;Linux選擇.so後綴的,Mac選擇.dylib結尾的,windows選擇.dll結尾的
    在這裏插入圖片描述
    同樣地我也將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中配置如下
    在這裏插入圖片描述
  2. Dockerfile文件在這裏插入圖片描述
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. 允許指定項目使用熱部署,操作如圖所示 標題

  2. 編寫簡單demo測試熱部署,簡簡單單就好
    在這裏插入圖片描述

  3. 在idea中配置docker打包併發布項目到容器中

PS:在這兒爲了操作簡單,因此我把mvn打包項目添加到了Before Launch中,同時我也建議您這麼做,畢竟很簡單嘛!

在這裏插入圖片描述

  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.
    在這裏插入圖片描述
  • 將項目與remote server綁定
    在這裏插入圖片描述

測試

測試jrebel的熱部署

  1. 首先確保服務的debug端口和服務端口處於被防火牆放行的狀態
  2. 訪問服務接口確保正常訪問
    在這裏插入圖片描述
  3. 修改代碼,並熱部署
    這一步操作中,一般在修改代碼後,隔一段時間後jrebel就會自動檢測到target下某些文件的修改並及時更新值遠程項目中。
    或者手動編譯下項目,command+F9+fn/command+shift+F9+fn/ctrl+F9/ctrl+shift+F9+fn.
    更新成功後jrebel console中會出現如下所示提示同步成功。再次訪問時就已經變爲最新內容了。
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 測試遠程調試
  • 查看自己的dubug端口,區別於服務端口
    在這裏插入圖片描述
  • 在項目的Edit configurations中增加remote debug配置
    在這裏插入圖片描述
  • 與服務的debug建立連接
    在這裏插入圖片描述
  • 訪問服務並打斷點調試,具體怎麼debug就不說了
    在這裏插入圖片描述

至此爲止,恭喜已經成功地完成了所有步驟

如果有錯誤或不足的地方,請你多多留言指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章