Quarkus初探
Quarkus初探
- 背景
- 安装Quarkus
- 安装Quarkus CLI
- 创建Quarkus项目
- 运行Quarkus
- 初探代码
- 修改一下代码
- 数据持久化
- 创建PanacheEntiry
- 写入数据
- 读取数据
- Dev Service
- 使用外部数据库
- 区分dev和prod
- 构建native应用(依赖Graalvm)
背景
最早是在Infoq上了解到Quarkus这个框架,内部集成了Vertx,对native-image有着非常好的支持,启动速度非常快,占用内存很小(相较于Springboot),最近有时间就来体验一下。
安装Quarkus
Quarkus也是基于Java的微服务框架,所以想要体验Quarkus需要满足以下条件:
- JDK 17+,配置配置好了JAVA_HOME
- Apache Maven 3.9.6
- docker或podman(可选)
- Quarkus CLI(可选)
- Graalvm(可选,用于构建Native应用)
安装Quarkus CLI
Quarkus CLI中提供了很多命令,可以帮助我们快速的创建、运行Quarkus项目。这两天体验下来Quarkus CLI应该是主要对mvn的各类命令进行了集成,Quarkus CLI的命令相较于mvn来说更加便捷,也是推荐大家安装体验一下。目前官方支持以下几种安装方式:
- JBang - for Linux, macOS and Windows
- SDKMAN! - for Linux and macOS
- Homebrew - for Linux and macOS
- Chocolatey - for Windows
- Scoop - for Windows
我目前这台机器是通过SDKMAN来管理JDK版本的,这里选择了使用SDKMAN进行安装
sdk install quarkus
安装完成之后验证一下
quarkus --version
3.9.2
创建Quarkus项目
通过quarkus执行以下命令
quarkus create app org.acme:getting-started-dev-services \--extension='rest'
cd getting-started-dev-services
或者通过maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.9.2:create \-DprojectGroupId=org.acme \-DprojectArtifactId=getting-started-dev-services \-Dextensions='rest'
cd getting-started-dev-services
如果想要创建一个gradle项目,可以追加以下参数 -DbuildTool=gradle 或 -DbuildTool=gradle-kotlin-dsl
对于使用windows的同学,有以下两点需要注意:
- 如果使用cmd,不要使用
\分割命令,所有命令都要放在同一行中 - 如果使用PowerShell,-D的参数需要使用双引号括起来,e.g.
"-DprojectArtifactId=getting-started-dev-services"
运行Quarkus
quarkus devor
./mvnw quarkus:devor
./gradlew --console=plain quarkusDev
正常启动后可以看到如下信息:
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2024-04-10 11:22:05,350 INFO [io.quarkus] (Quarkus Main Thread) code-with-quarkus 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.9.2) started in 0.842s. Listening on: http://localhost:80802024-04-10 11:22:05,351 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
然后我们在浏览器里访问 http://localhost:8080/hello,应该可以看到如下信息
Hello from Quarkus REST
初探代码
我们使用IDE打开刚刚创建的项目,可以看到只有一个很简单的类GreetingResource
package org.acme;import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;@Path("/hello")
public class GreetingResource {@GET@Produces(MediaType.TEXT_PLAIN)public String hello() {return "Hello from Quarkus REST";}
}
相交于Springboot来说,这里不需要定义一个Application启动类,再增加一个Controller,一个简简单单的GreetingResource就完成了所有的功能,这里使用到的注解也都是jakarta的标准注解。
修改一下代码
public String hello(@RestQuery String name) {return "Hello " + name;
}
然后我们访问http://localhost:8080/hello?name=Bloom
这时我们会看到这样一条消息: Hello Bloom.
quarkus dev模式支持代码热部署,在我们修改代码之后无需重启,调试修改的时候会非常方便。
对应的我们修改一下单元测试 src/test/java/org/acme/GreetingResourceTest.java,将
.body(is(“Hello from Quarkus REST”));
修改为
.body(containsString(“Hello”));
不然下次启动会报错(quarkus默认启动时会先执行单元测试)
数据持久化
在进行这一步之前,建议把我们本地的容器服务启动(docker或podman)起来,看看接下来会发生什么
创建PanacheEntiry
quarkus extension add hibernate-orm-panache jdbc-postgresql
或者
./mvnw quarkus:add-extension -Dextensions=‘hibernate-orm-panache jdbc-postgresql’
官方示例提供的是postgresql,你也可以替换为mysql。
创建一个Greeting.java
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;@Entity
public class Greeting extends PanacheEntity {public String name;
}
Panache是一个基于Hibernate的orm框架,PanacheEntity(类似于Spring-Data中的JpaRepository)中提供了大量的方法方便我们进行CRUD的操作
写入数据
@GET
@Transactional
@Produces(MediaType.TEXT_PLAIN)
public String hello(@QueryParam("name") String name) {Greeting greeting = new Greeting();greeting.name = name;greeting.persist();return "Hello " + name;
}
这里只是一个示例,在正式的代码中,GET请求不应该向后端服务写入数据
读取数据
@GET
@Path("names")
@Produces(MediaType.TEXT_PLAIN)
public String names() {List<Greeting> greetings = Greeting.listAll();String names = greetings.stream().map(g-> g.name).collect(Collectors.joining (", "));return "I've said hello to " + names;
}
来试一下效果, 先访问 http://localhost:8080/hello?name=Bloom, 再访问 http://localhost:8080/hello/names.
我们就能看到: “I’ve said hello to Bloom”.
Dev Service
进行到这里,你肯定会有很多疑问,我本地都没有PG数据库,项目中也没有任何数据库相关的配置,为什么没有报错?这一切都是怎么发生的?
这时你可以打开自己的Docker desktop或者使用docker ps的命令,你就会发现有一个PG的数据库实例正在运行
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38c07eab6549 postgres:14 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:61089->5432/tcp kind_yalow
这一切都是Dev Service为我们做的,由于我们添加了jdbc-postgresql的依赖,Dev Service就为我们启动了一个postgresql的容器,方便我们更加快速的进行项目搭建。
另外,在dev模式下,处于Dev Services管理的数据库,Quarkus会使用drop-and-create的模式,所以我们每次修改代码重启服务之后,之前保存的数据都会丢失。在某些情况下,这种模式会很不方便,Quarkus也提供了一种机制来进行数据的初始化
我们可以创建一个sql文件src/main/resources/import.sql
INSERT INTO Greeting(id, name)
VALUES (nextval('Greeting_SEQ'), 'Alice');
INSERT INTO Greeting(id, name)
VALUES (nextval('Greeting_SEQ'), 'Bob');
这样每次quarkus启动时都会将这些数据初始化进去
使用外部数据库
如果我们已经搭建好了一个数据库,我们可以在src/main/resources/application.properties中增加如下配置
# configure your datasource
quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = leopold
quarkus.datasource.password = bloom
quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/mydatabase
区分dev和prod
如果你想在开发和测试环境中使用Dev Service,在生产环境使用外包数据库,可以通过一个%prod的前缀来区分
# configure your datasource
%prod.quarkus.datasource.db-kind = postgresql
%prod.quarkus.datasource.username = leopold
%prod.quarkus.datasource.password = bloom
%prod.quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/mydatabase
构建native应用(依赖Graalvm)
Quarkus一大亮点是对native-image有着非常好的支持,想要体验native-image需要先安装Graalvm,你可以通过官网或者SDKMAN进行安装和配置。
quarkus build --native
./mvnw install -Dnative
编译的过程会比较长,编译完成之后会在target文件夹下生成一个getting-started-dev-services-1.0.0-SNAPSHOT-runner的可执行文件,可以直接启动。
需要注意的是,通过native构建出来的可执行程序会失去跨平台的特性,因此在一个平台上构建出来的native-image往往无法在其他平台运行,最好的方式是通过docker等容器进行部署。
目前Graalvm有一个实验性的功能,在Linux平台来构建跨平台的应用,具体可以参考
https://www.graalvm.org/jdk21/reference-manual/native-image/guides/build-static-executables/#prerequisites-and-preparation
相关文章:
Quarkus初探
Quarkus初探 背景安装Quarkus安装Quarkus CLI 创建Quarkus项目运行Quarkus初探代码修改一下代码 数据持久化创建PanacheEntiry写入数据读取数据 Dev Service使用外部数据库区分dev和prod 构建native应用(依赖Graalvm) 背景 最早是在Infoq上了解到Quarku…...
90天玩转Python-02-基础知识篇:初识Python与PyCharm
90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装&…...
List操作的一些常见问题
1. Arrays.asList转换基本类型数组 在实际的业务开发中,我们通常会进行数组转List的操作,通常我们会使用Arrays.asList来进行转换,但是在转换基本类型的数组的时候,却出现转换的结果和我们想象的不一致。 import java.util.Arra…...
如何使用Java和RabbitMQ实现延迟队列?
前言 今天我们使用Java和RabbitMQ实现消息队列的延迟功能。 前期准备,需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列?-CSDN博客 今天讲的是依赖RabbitMQ的延迟插件实现…...
AI论文速读 | TF-LLM:基于大语言模型可解释性的交通预测
论文标题: Explainable Traffic Flow Prediction with Large Language Models 作者:Xusen Guo, Qiming Zhang, Mingxing Peng, Meixin Zhu(朱美新)*, Hao (Frank)Yang(杨昊) 机构:香港科技大学(广州),约翰…...
智慧矿山视频智能监控与安全监管方案
一、行业背景 随着全球能源需求的日益增长,矿业行业作为国民经济的重要支柱,其发展日益受到广泛关注。然而,传统矿山管理模式的局限性逐渐显现,如生产安全、人员监管、风险预警等方面的问题日益突出。因此,智慧矿山智…...
2024春算法训练4——函数与递归题解
一、前言 感觉这次的题目都很好,但是E题....(我太菜了想不到),别人的题解都上百行了,晕; 二、题解 A-[NOIP2010]数字统计_2024春算法训练4——函数与递归 (nowcoder.com) 这种题目有两种做法:…...
【C++】C++知识点复习
牛客cpp:牛客网在线编程 2024年4月10日:BC1—>BC8 BC4:浮点数精度保留 问题:不加入fixed输入0.359813,最后得到0.36,并不是强制保留0.360。这种写法会保留小数点后三位精度,但是最后输出会省略掉最后…...
SpringBoot+Vue,轻松实现网页版人脸登录与精准识别
目录 1、技术介绍 2、技术原理 2.1、人脸检测 ①参考模板法 ②人脸规则法 2.2、人脸跟踪 2.3、人脸比对 ①特征向量法 ②面纹模板法 识别过程 案例 一、springboot后端项目 1,拉取项目后,导入相关依赖jar包 2,执行sql文件夹下面…...
深入浅出 -- 系统架构之垂直架构
当业务复杂度增加、访问量逐渐增大出现高并发时,单体架构无法满足需求,可以根据业务功能对系统进行拆分,以提高访问效率。 垂直架构介绍 1.垂直架构一般是因为单体架构太过于庞大而进行的拆分,拆分后各个系统应满足独立运行互相不…...
深入浅出 -- 系统架构之微服务架构选型参考图
技术选型架构图 是一个用于展示项目中所采用的各种技术和组件之间关系的图表。 它通常包括以下几个部分: 1. 项目名称和描述:简要介绍项目的背景和目标。 2. 技术栈:列出项目中使用的主要技术和工具,如编程语言、框架、数据库…...
Java 使用 ant.jar 执行 SQL 脚本文件
Java 使用 ant.jar 执行 SQL 脚本文件,很简单。 在 pom.xml 中导入 ant 依赖 <dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.11</version> </dependency>sql 脚本文件…...
【随笔】Git 高级篇 -- 快速定位分支 ^|~(二十三)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
git环境切换
文章目录 一. 操作步骤:1.查看全局设置3.Git 切换本地git设置4.切换仓库并推送 一. 操作步骤: 1.查看全局设置 $ Git config --global --list credential.https://codeup.aliyun.com.providergeneric user.namebiejiahao user.emailxxxxxxxxqq.com3.Gi…...
hyperf websocket
composer require hyperf/websocket-server 配置 Server 修改 config/autoload/server.php,增加以下配置。 <?phpreturn [servers > [[name > ws,type > Server::SERVER_WEBSOCKET,host > 0.0.0.0,port > 9502,sock_type > SWOOLE_SOCK_TCP…...
用Echarts词云数据可视化热词表白
目录 1、使用前准备 2、准备工作 3、盒子搭建 4、整体展现 1、使用前准备 找到表白对象(重中之重!),不要一见钟情(个人觉得:一见钟情属于见色起意!),因为数据可视化需…...
VUE 实现路由的基本原理
路由 基本概念 在前端技术早期,所有页面的跳转通过更改url,浏览器页面刷新获取新的页面内容,这种粗糙的交互方式,一直等待优化。 后来,改变发生了——Ajax 出现了,它允许人们在不刷新页面的情况下发起请求࿰…...
Android 11 添加系统属性
在初识Android 属性一文中提到,系统会默认加载以下文件 /system/etc/prop.default /system/build.prop /system_ext/build.prop /vendor/default.prop /vendor/build.prop /odm/etc/build.prop /product/build.prop /factory/factory.prop要弄清楚我们应该在哪里添…...
docker 创建容器过程
结合下图,本文讨论docker 创建容器过程: START└── [用户通过Docker Client发出指令]└── (1) docker run 或 docker create 命令├── (2) Docker Client与Docker Daemon建立通信连接└── (3) Docker Daemon接收到创建容器请求├── (4) 检查…...
OSI七层网络攻击行为及防范手段
2020年3月3日,360安全大脑披露美国中央情报局攻击组织(APT-C-39)对我国大型互联网公司、政府部门及相关企业进行长达11年的网络攻击渗透,该组织所使用的网络武器和CIA“Vault7”项目中的网络武器完全吻合。如今随着互联网技术的蓬…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
