乐趣区

关于后端:quarkus实战之四远程热部署

欢送拜访我的 GitHub

这里分类和汇总了欣宸的全副原创 (含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《quarkus 实战》系列的第四篇,如题目所示,明天的工作是实现近程热部署实战
  • 作为一名 Java 程序员,以下场景置信您很相熟:
  1. 在本地电脑上:用 IDEA 写代码,编译构建成 jar 或者 docker 镜像
  2. 在服务器上:运行 jar 或者 docker 镜像
  3. 遇到问题时:通过热部署,使本地的改变立刻在服务器上失效,这一切都是主动的,无需打包部署等操作
  4. 就是下图这样:
  • 以上是常见的解决问题伎俩,如果咱们的代码是 quarkus 利用,也能这样近程调试吗?
  • 答案是能够,接下来咱们一起实战如何近程调试 quarkus 利用

牢记来自官网的正告

  • 如下图红框所示,来自官网的正告咱们肯定要牢记在心,近程热部署性能有 <font color=”red”> 微小安全隐患 </font>,不要用在生产环境:

    在服务器上的运行形式

  • 接下来的实战,为了省事儿,在服务器上的运行形式选用 docker,也就是说本地做好 docker 镜像后,运行在服务器的 docker 上

    demo 我的项目

  • 明天用到的 demo 我的项目非常简单,有个一般的 web 接口即可
  • 执行以下命令,创立名为 <font color=”blue”>hello-quarkus</font> 的 maven 工程

    mvn "io.quarkus:quarkus-maven-plugin:create" \
    -DprojectGroupId="com.bolingcavalry" \
    -DprojectArtifactId="hello-quarkus" \
    -DprojectVersion="1.0-SNAPSHOT" \
    -DclassName="HobbyResource" \
    -Dpath="actions"
  • 为了演示批改配置文件也能立刻失效的成果,把 HobbyResource.java 改成上面这样,留神注解 <font color=”blue”>ConfigProperty</font> 的作用是将指定配置的值注入润饰的成员变量中:

    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();
      }
    }
  • 关上文件 <font color=”blue”>application.properties</font>,减少以下三个配置,每个配置的作用请看正文:

    # 这是一个自定义属性,在业务代码中应用 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 导入等)
  • 执行以下命令启动镜像,留神环境变量 <font color=”blue”>QUARKUS_LAUNCH_DEVMODE</font> 是必须的,且值为 <font color=”red”>true</font>,这是开启近程热部署的要害:

    docker run \
    -i \
    --rm \
    -p 8080:8080 \
    -e QUARKUS_LAUNCH_DEVMODE=true \
    bolingcavalry/hello-quarkus-jar:0.0.7
  • 控制台输入如下图,利用胜利启动,红框中显示曾经进入热部署状态,随时能够承受近程调试同步过去的变动:
  • 验证服务是否失常,我这里服务器 IP 地址是 <font color=”blue”>192.168.50.27</font>,所以浏览器拜访 <font color=”red”>http://192.168.50.27:8080/actions</font>,后果如下图,合乎预期:
  • 接下来要尝试近程热部署了

    近程热部署

  • 接下来的操作是在本地开发电脑上进行的
  • 执行以下命令,启动本地与近程的同步模式:

    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
  • 由上述信息可见,此时本地与近程服务器的连贯已建设,能够尝试批改本地文件,看是否主动同步了
  • 批改配置文件 <font color=”blue”>application.properties</font>,将 <font color=”red”>greeting.message</font> 的值改为 <font color=”blue”>aaabbb</font>
  • 批改过后,<font color=”red”> 不会立刻同步 </font>,须要再次调用 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 文件的变动:
  • 至此,近程热部署性能操作实现,多把握一个实用技能对后续的学习和开发都有帮忙,心愿本篇能给您一些参考

欢送关注思否:程序员欣宸

学习路上,你不孤独,欣宸原创一路相伴 …

退出移动版