Quarkus初体验:动态加载和原生部署
在前面的文章《尝试官方的第一个SpringNative 0.11程序》中提到过Quarkus这门技术。这里就简单演示一下它的两个主要功能:Live Coding和Native Build。所谓Live Coding就是热部署,改了代码插件会自动编译打包,省的我们点来点去了;第二个Native Building是Quaukus框架的目标,就是生成目标机器直接可以运行的文件。
项目搭建
跟SpringBoot一样,Quarkus也提供了模板项目在线生成,可以到 https://code.quarkus.io/ 先来创建一个项目。为了简单,我们可以选择一个web端点依赖 Jax-rs 就行:

下载下来用IDEA打开。选择一个高版本的Java,我这里使用jdk 17

之后的操作为了方便,我使用Linux系统,因为我不少必要的环境变量没在win下面配置,而WSL里面是配好的。
Live Coding
不同于JRebel,Quarkus的热部署能力十分强大,甚至修改了pom.xml都不用重启。我们来体验一下。
在IDEA的控制台中输入wsl进入Linux:

进入刚才下载项目的根目录,下面和pom.xml同级有.mnvw这个文件,这是maven的包装文件。执行命令
./mvnw compile quarkus:dev
就会启动项目并进入living coding 模式:

正常应该是几秒启动(我本地是2秒多),启动后是这样的

项目里面有一个Resource(和Spring的Controller一样,不过这里用的JAX-RS不是Spring MVC),用来暴露端点:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy";
}
}
再开一个wsl窗口,通过curl命令来看一下输出:

功能正常!接下来我们引入lombok依赖,并修改代码,看一下Quarkus如何热部署。在pom.xml中增加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
写好后保存,Quarkus就能探测到然后自动执行maven下载依赖。然后我们在Resource类上增加@Log注解并打印一行日志:
import lombok.extern.java.Log;
@Log
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
log.info("快刷新");
return "Hello RESTEasy";
}
}
再次在第二个窗口进行curl请求,这个窗口的返回一样,然后回到启动项目的窗口可以看到日志:

功能体验完了,要退出可以在第一个窗口点击q。
Native Building
接下来体验原生打包能力。
在项目根目录执行命令
./mvnw package -Pnative
或者用mvn package -Pnative也一样。同Spring Native的打包过程一样,这个过程特别费时间也特别占内存,我本地等了2分钟半才结束(比起Spring Native的8分钟还是要快),可能每次时间也不一样,而且差别极大。
如果使用Gradle,打包命令是
./gradlew build -Dquarkus.package.type=native
进入打包目录target,执行生成的本地可执行文件runner,这次只要两百毫秒就起来了(外网那些人测试说几毫秒几十毫秒,不知道到底啥样的机器)。

同样通过curl请求,可以看到响应和日志:

推荐阅读:《Kubernetes Native Microservices with Quarkus and MicroProfile》
Quarkus初体验:动态加载和原生部署的更多相关文章
- echart初体验 动态加载数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- canvas初体验之加载图片
上一篇的介绍主要是画一些基本的图案,这一篇主要是加载图案. canvas加载图片主要分为两个步骤: 1.获取图片资源. 2.将图片资源画到画布上. 1.1获取图片资源,canvasAPI为我们提供了多 ...
- 爱之初体验---编译加载内核模块hello
1. hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h ...
- goloader - golang动态加载的实现
github地址:https://github.com/dearplain/goloader 这里有以前的一些思路:http://www.cnblogs.com/dearplain/p/8145985 ...
- golang动态加载原生代码思路
golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- js动态加载以及确定加载完成的代码
利用原生js动态加载js文件到页面,并在确定加载完成后调用相关function var otherJScipt = document.createElement("script") ...
- Android动态加载学习笔记(一)
前言 上周五DPAndroid小分队就第二阶段分享内容进行了讨论,结果形成了三个主题:性能优化.动态加载.内核远离.我选择的是第二项——动态加载.在目前的Android开发中,这一部分知识还是比较流行 ...
- [AngularJS] 使用AngularAMD动态加载Service
[AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...
- [AngularJS] 使用AngularAMD动态加载Controller
[AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...
随机推荐
- Typecho博客网站迁移:MySQL ➡️ MarialDB
目录 1. 引言 2. Typecho的自定义配置迁移 3. 数据库迁移:MySQL- > MarialDB 3.1 在原服务器中备份并导出数据库文件 3.2 将"backupdb.s ...
- python教程6.6-发送邮件smtplib
实现步骤: Python对SMTP⽀持有 smtplib 和 email 两个模块, email 负责构造邮件, smtplib 负责发送邮件,它对smtp协议进⾏了简单的封装. 简单代码示例: 发送 ...
- 4G EPS 中的小区选择
目录 文章目录 目录 前文列表 小区选择 RSRP(参考信号接收功率) RSRQ(参考信号接收质量) RSSI(接收信号强度指示) SINR(信号与干扰加噪声比) 前文列表 <4G EPS 中的 ...
- Java计算百分比保留整数
1.Java计算百分比保留整数的方法步骤 在Java中计算百分比并保留整数,通常涉及以下步骤: (1)计算原始数值与基准数值的百分比(通常使用 (原始数值 / 基准数值) * 100 的公式). (2 ...
- web component基础概念及使用
概念和使用 作为开发者,我们都知道尽可能多的重用代码是一个好主意.这对于自定义标记结构来说通常不是那么容易 - 想想复杂的HTML(以及相关的样式和脚本),有时您不得不写代码来呈现自定义UI控件,并且 ...
- 基于 ESP8266_RTOS_SDK 驱动 DHT11
概述 DHT11模块使用一根data线实现信号触发以及数据反馈,信号格式参考如下 https://zhuanlan.zhihu.com/p/347904660 本文使用GPIO中断的方式采集反馈数据 ...
- 记录一次由nginx配置引发出来的一系列的缓存问题
问题描述: 在做一个企业微信的移动端项目时,每次修改代码后并且打包.部署完毕,再次打开页面总是会有上一次的缓存,一开始以为是cookie和webStorage缓存导致的,然后每次清除还是有缓存,后来把 ...
- Linux内核Kernel启动过程
在上一篇计算机启动过程文章中介绍了计算机启动的基本流程,本篇文章主要介绍Linux内核Kernel的启动过程. 一.内核启动的基本流程 sequenceDiagram participant Boot ...
- c++ Primer Plus 第六版学习记录
立个flag,一天看20页,一个半月看完!!! 第一章 预备知识 高效简洁.面向对象.泛型编程 汇编不具有通用性,换一个处理器可能就要重新写一套! 编译器(是一个程序)负责解决这个问题,把一份高级语言 ...
- QuartusII调用 PLL_IP核方法(Mega Wizard)
[基本信息] 要求:调用PLL-IP核,50Mhz晶振输入,输出四路时钟不同信号:100Mhz,25Mhz,50Mhz(90°相位),50Mhz(20%占空比). 芯片型号:cyclone Ⅳ EP4 ...