quarkus實戰之四:遠端熱部署

2023-07-24 09:00:29

將原生的改動極速同步到遠端伺服器端,並自動生效,掌握此技能,開發偵錯會更高效

歡迎存取我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 本文是《quarkus實戰》系列的第四篇,如標題所示,今天的任務是完成遠端熱部署實戰
  • 作為一名Java程式設計師,以下場景相信您很熟悉:
  1. 在本地電腦上:用IDEA寫程式碼,編譯構建成jar或者docker映象
  2. 在伺服器上:執行jar或者docker映象
  3. 遇到問題時:通過熱部署,使原生的改動立即在伺服器上生效,這一切都是自動的,無需打包部署等操作
  • 就是下圖這樣:

  • 以上是常見的處理問題手段,如果咱們的程式碼是quarkus應用,也能這樣遠端偵錯嗎?

  • 答案是可以,接下來咱們一起實戰如何遠端偵錯quarkus應用

牢記來自官方的警告

  • 如下圖紅框所示,來自官方的警告咱們一定要牢記在心,遠端熱部署功能有巨大安全隱患,不要用在生產環境:

在伺服器上的執行方式

  • 接下來的實戰,為了省事兒,在伺服器上的執行方式選用docker,也就是說本地做好docker映象後,執行在伺服器的docker上

demo專案

  • 今天用到的demo專案非常簡單,有個普通的web介面即可
  • 執行以下命令,建立名為hello-quarkus的maven工程
mvn "io.quarkus:quarkus-maven-plugin:create" \
  -DprojectGroupId="com.bolingcavalry" \
  -DprojectArtifactId="hello-quarkus" \
  -DprojectVersion="1.0-SNAPSHOT" \
  -DclassName="HobbyResource" \
  -Dpath="actions"
  • 為了演示修改組態檔也能立即生效的效果,把HobbyResource.java改成下面這樣,注意註解ConfigProperty的作用是將指定設定的值注入修飾的成員變數中:
package com.bolingcavalry;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;

@Path("/actions")
public class HobbyResource {

    @ConfigProperty(name = "greeting.message")
    String message;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return message + ", Hello RESTEasy " + LocalDateTime.now();
    }
}
  • 開啟檔案application.properties,增加以下三個設定,每個設定的作用請看註釋:
# 這是一個自定義屬性,在業務程式碼中使用ConfigProperty註解取得其值
greeting.message=message from configuration
# 遠端偵錯時用到的引數,可變jar,也就是支援熱部署的jar
quarkus.package.type=mutable-jar
# 遠端偵錯時用到的引數,為了安全起見,需要指定密碼
quarkus.live-reload.password=changeit
  • 以上就是所有專案程式碼了

製作docker映象

  • 在pom.xml所在目錄執行以下命令,完成普通的編譯構建:
mvn clean package -U -DskipTests
  • 再執行以下命令,根據剛才編譯的結果製作docker映象,注意,這是基於jar+jdk的映象,不是二進位制可執行檔案的映象:
docker build \
-f src/main/docker/Dockerfile.jvm \
-t bolingcavalry/hello-quarkus-jar:0.0.7 .
  • 您需要做些操作以便伺服器能執行這個映象,例如匯出為tar,然後在伺服器匯入,或者推播到某個映象倉庫,讓伺服器從倉庫pull等都可以
  • 我這裡的做法是推播到hub.docker.com上,您可以按照自己的實際情況選擇用哪種方式

在伺服器執行

  • 接下來的操作是在伺服器上進行的
  • 首先確保伺服器可以使用這個映象(存取映象倉庫、或者用tar匯入等)
  • 執行以下命令啟動映象,注意環境變數QUARKUS_LAUNCH_DEVMODE是必須的,且值為true,這是開啟遠端熱部署的關鍵:
docker run \
-i \
--rm \
-p 8080:8080 \
-e QUARKUS_LAUNCH_DEVMODE=true \
bolingcavalry/hello-quarkus-jar:0.0.7
  • 控制檯輸出如下圖,應用成功啟動,紅框中顯示已經進入熱部署狀態,隨時可以接受遠端偵錯同步過來的變化:
  • 驗證服務是否正常,我這裡伺服器IP地址是192.168.50.27,所以瀏覽器存取http://192.168.50.27:8080/actions,結果如下圖,符合預期:
  • 接下來要嘗試遠端熱部署了

遠端熱部署

  • 接下來的操作是在本地開發電腦上進行的
  • 執行以下命令,啟動本地與遠端的同步模式:
mvn quarkus:remote-dev -Dquarkus.live-reload.url=http://192.168.50.27:8080
  • 控制檯輸出如下:
[INFO] Compiling 2 source files to /Users/will/temp/202203/01/001/hello-quarkus/target/test-classes
Listening for transport dt_socket at address: 5005
2022-03-02 08:52:44,299 INFO  [org.jbo.threads] (main) JBoss Threads version 3.4.2.Final
2022-03-02 08:52:45,488 INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 1532ms
2022-03-02 08:52:46,402 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending quarkus-app-dependencies.txt
2022-03-02 08:52:46,418 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending quarkus-run.jar
2022-03-02 08:52:46,424 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending app/hello-quarkus-1.0-SNAPSHOT.jar
2022-03-02 08:52:46,453 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Connected to remote server
  • 由上述資訊可見,此時本地與遠端伺服器的連線已建立,可以嘗試修改本地檔案,看能否自動同步了
  • 修改組態檔application.properties,將greeting.message的值改為aaabbb
  • 修改過後,不會立即同步,需要再次呼叫web介面才會觸發同步,去重新整理瀏覽器,如下圖,發現本地修改的組態檔已經同步到伺服器,並且生效了:
  • 看本地控制檯輸出以下內容,提示了同步的詳情:
2022-03-02 08:57:40,568 INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (Remote dev client thread) File change detected: /Users/will/temp/202203/01/001/hello-quarkus/src/main/resources/application.properties
2022-03-02 08:57:40,572 INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (Remote dev client thread) Restarting quarkus due to changes in application.properties, HobbyResource.class.
2022-03-02 08:57:41,138 INFO  [io.qua.dep.QuarkusAugmentor] (Remote dev client thread) Quarkus augmentation completed in 564ms
2022-03-02 08:57:41,143 INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (Remote dev client thread) Live reload total time: 1.082s 
2022-03-02 08:57:41,556 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending lib/deployment/.io.quarkus.quarkus-resteasy-common-spi-2.7.1.Final.jar.baiduyun.uploading.cfg
2022-03-02 08:57:41,640 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending quarkus-run.jar
2022-03-02 08:57:41,649 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending app/hello-quarkus-1.0-SNAPSHOT.jar
2022-03-02 08:57:41,676 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending dev/app/application.properties
  • 此時去看伺服器上的控制檯,也有資訊輸出,如下圖紅框,應用在收到同步的內容後,內部自動重啟了(注意,是內部重啟,docker容器並未發生變化):
  • 剛才嘗試的是修改組態檔,現在試試修改原始碼,改動如下圖紅框:
  • 瀏覽器存取服務的web服務,如下圖,改動已經生效:
  • 開發電腦的控制檯輸出同步資訊,這次是class檔案:
2022-03-02 09:05:56,243 INFO  [io.qua.dep.QuarkusAugmentor] (Remote dev client thread) Quarkus augmentation completed in 520ms
2022-03-02 09:05:56,248 INFO  [io.qua.dep.dev.RuntimeUpdatesProcessor] (Remote dev client thread) Live reload total time: 0.985s 
2022-03-02 09:05:56,610 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending dev/app/com/bolingcavalry/HobbyResource.class
2022-03-02 09:05:56,804 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending quarkus-run.jar
2022-03-02 09:05:56,811 INFO  [io.qua.ver.htt.dep.dev.HttpRemoteDevClient] (Remote dev client thread) Sending app/hello-quarkus-1.0-SNAPSHOT.jar
  • 再看伺服器的控制檯,再次重啟應用,紅框中顯示接受到class檔案的變化:
  • 至此,遠端熱部署功能操作完成,多掌握一個實用技能對後續的學習和開發都有幫助,希望本篇能給您一些參考

歡迎關注部落格園:程式設計師欣宸

學習路上,你不孤單,欣宸原創一路相伴...