欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是《quarkus实战》系列的第四篇,如标题所示,今天的任务是完成远程热部署实战
- 作为一名Java程序员,以下场景相信您很熟悉:
- 在本地电脑上:用IDEA写代码,编译构建成jar或者docker镜像
- 在服务器上:运行jar或者docker镜像
- 遇到问题时:通过热部署,使本地的改动立即在服务器上生效,这一切都是自动的,无需打包部署等操作
- 就是下图这样:
- 以上是常见的处理问题手段,如果咱们的代码是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文件的变化:
- 至此,远程热部署功能操作完成,多掌握一个实用技能对后续的学习和开发都有帮助,希望本篇能给您一些参考
欢迎关注思否:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。