将本地的改动极速同步到远程服务端,并自动生效,掌握此技能,开发调试会更高效

欢迎访问我的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文件的变化:

  • 至此,远程热部署功能操作完成,多掌握一个实用技能对后续的学习和开发都有帮助,希望本篇能给您一些参考

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

quarkus实战之四:远程热部署的更多相关文章

  1. 使用 JRebel 进行远程热部署

    JRebel支持热部署,和远程热部署,本文我们来搭建一下远程热部署. 一.服务器安装 JRebel 1.官网下载最新的 JRebel 安装包,下载链接:https://zeroturnaround.c ...

  2. maven tomcat7 远程热部署

    在maven项目开发中,一般推荐使用jetty进行开发调试.但是在项目发布的时候要求使用tomcat7作为发布服务器,为此在maven中配置了tomcat7插件,以支持项目在外部tomcat7进行远程 ...

  3. 利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码

    首先要在eclipse 中启用 启用以后在 resource 中生成了 rebel-remote.xml 然后build,把生成的jar包放到服务器上. 然后用下面的命令启动 java -agentp ...

  4. Jrebel 远程热部署[Idea]

    服务器端 客户端-idea remote module 在服务器端,Tomcat的webapps下新建项目文件夹,如: demo/WEB-INF/classes/[jrebel.xml]

  5. IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot

    1 概述 所谓热部署,对于Java应用程序来说,就是在运行时更新Java类文件.IDEA可以使用自带的Spring Boot热部署的方式进行本地/远程热部署,或者使用JRebel进行本地/远程热部署, ...

  6. 热部署只知道devtools吗?JRebel不香吗?

    持续原创输出,点击上方蓝字关注我 目录 前言 JRebel收费怎么破? 什么是本地热部署? 什么是远程热部署? JRebel和devtools的区别 如何安装JRebel? 如何本地热部署? 如何远程 ...

  7. 【SpringBoot】SpringBoot热部署和配置文件自动注入实战

    ========================3.SpringBoot热部署devtool和配置文件自动注入实战 ============================ 1.SpringBoot2 ...

  8. SpringBoot工程+热部署进行远程调试

    本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom ...

  9. SpringBoot实战(三)代码热部署

    每次代码改动后都需要重新手动Run项目,心累,在网上找了下,发现SpringBoot提供了热部署的方案,改动代码后自动编译打包,现在将热部署的配置方法记下来: 第一步:在pom.xml中添加依赖,导入 ...

  10. SpringBoot热部署(实战)详解

    热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应 ...

随机推荐

  1. Python-psycopg2的简单使用

    一.简介 psycopg2 库是 python 用来操作 postgreSQL 数据库的第三方库. 二.安装 1.执行如下命令安装 pip3 install psycopg2 2.使用Pycharm安 ...

  2. 玩一玩 Ubuntu 下的 VSCode 编程

    一:背景 1. 讲故事 今天是五一的最后一天,想着长期都在 Windows 平台上做开发,准备今天换到 Ubuntu 系统上体验下,主要是想学习下 AT&T 风格的汇编,这里 Visual S ...

  3. .NET周报 【4月第5期 2023-04-30】

    国内文章 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用! https://www.cnblogs.com/NMSLanX/p/17326728.html 大家好,为了使开源项目的维护 ...

  4. 张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)

    张量(Tensor):Tensor = multi-dimensional array of numbers 张量是一个多维数组,它是标量,向量,矩阵的高维扩展 ,是一个数据容器,张量是矩阵向任意维度 ...

  5. 2015年5月最新win7纯净版系统(32位)补丁最新

    下载地址: http://yunpan.cn/cVN9e679hZ2Pe   访问密码 203a 一.系统安装工具 √ 自由天空最新万能驱动 √ 一键GHOST备份还原系统 √ 硬盘安装系统安装器,增 ...

  6. Ansible 常用基础模块

    Ansible 常用基础模块 目录 Ansible 常用基础模块 Ansible的执行 Ansible ad-hoc ad-hoc模式的使用场景 ad-hoc模式的命令使用 ad-hoc结果返回颜色 ...

  7. 【由浅入深学MySQL】- MySQL连接查询详解

    本系列为:MySQL数据库详解,为千锋教育资深Java教学老师独家创作 致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解.如果感觉对大家有帮助的话,可以[点个关注]持续追更~ ...

  8. 2022-09-22:以下go语言代码输出什么?A:5、B:不能编译;C:运行时死锁。 package main import ( “fmt“ “time“ ) func main

    2022-09-22:以下go语言代码输出什么?A:5.B:不能编译:C:运行时死锁. package main import ( "fmt" "time" ) ...

  9. 2020-11-16:手写代码:leetcode第406题。假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

    福哥答案2020-11-16: ①排序.按照[身高]降序排列.如果[身高]一样,按照[人数]升序排列.②插入.遍历这个队列,按照[人数]插入相应位置. 采用leetcode里的代码,golang代码如 ...

  10. 2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。

    2021-04-04:给定一个非负数组arr,和一个正数m. 返回arr的所有子序列中累加和%m之后的最大值. 福大大 答案2021-04-04: 自然智慧即可. 1.递归,累加和. 2.动态规划,累 ...