Java云原生框架Quarkus初探
Java云原生框架Quarkus初探
Quarkus 介绍
Quarkus 是一个云原生,容器优先的Java应用框架,它号称是超音速和亚原子的框架,主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制,
根据Java库和标准精心打造的框架。主要有以下特性:
- 容器优先。Quarkus为GraalVM和HotSpot定制应用程序。令人惊讶的快速启动时间,令人难以置信的低RSS内存(不仅仅是堆的大小!),在Kubernetes等容器协调平台中提供近乎即时的扩展和高密度的内存利用。使用一种称之为编译时启动的技术。
- 统一指令式和响应式。在开发应用程序时,将熟悉的指令式和响应式代码风格结合起来。
- 基于Java社区和标准。Quarkus提供了一个有凝聚力的、有趣的、全栈式的框架,它利用了各类不断增长的50多个常用的最好的库。所有这些都在一个标准的主干上,让Java开发人员能够快速上手应用。
- Kube-Native。Quarkus和Kubernetes的组合为创建可伸缩、快速和轻量级的应用程序提供了理想的环境。Quarkus通过工具、预构建集成、应用程序服务等显著提高了开发人员的生产率。
- 对于Spring框架开发人员友好.Quarkus 的 Spring API 兼容性包括 Spring DI、Spring Web 和 Spring Data JPA。同时也在计划其他 Spring API,如 Spring Security 和 Spring Config。在 JVM 上运行时,Quarkus 应用程序几乎可以利用任何 Java 库。只要不使用 Java 反射,这些Java库就可以编译为原生。
安装Quarkus
官方推荐通过CLI方式安装。
- Linux/MacOS 和 Windows WSL 用户按以下方式安装。
curl -Ls https://sh.jbang.dev | bash -s - trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio
- Windows Powershell 用户以下方式安装。
iex "& { $(iwr https://ps.jbang.dev) } trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/"
iex "& { $(iwr https://ps.jbang.dev) } app install --fresh --force quarkus@quarkusio"
- 个人还是比较喜欢使用SDKMAN来管理安装Java相关软件,Windows用户安装SDKMAN需要WSL、Cygwin或者MinGW.
sdk install quarkus
安装成功后在命令行下输入:quarkus -- version
将显示版本号 x.y.z.Final
表示安装成功。
创建和运行Quarkus应用
- 使用Quarkus CLI 或者Maven 创建应用
quarkus create rw-getstarted-quarkus && cd rw-getstarted-quarkus
mvn io.quarkus.platform:quarkus-maven-plugin:3.2.3.Final:create \-DprojectGroupId=org.wangyun \-DprojectArtifactId=rw-getstarted-quarkus \-Dextensions='resteasy-reactive'
cd rw-getstarted-quarkus
作为一个老派的Java开发人员,我选择Maven的方式创建应用,可以充分使用国内Maven资源让下载更快.
- 在rw-getstarted-quarkus目录下运行Quarkus应用
quarkus dev 或者 ./mvnw compile quarkus:dev
第一次运行需要时间比较长,需要从maven仓库下载大量的依赖,需要保持充分的耐心,如遇下载失败请多试几次,http默认监听端口是8080,直到看到如下界面。
3. 使用实时修改应用生效
默认生成的代码
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 RESTEasy Reactive - Rxx Wang";}
}
以上代码运行后如下图:
直接用文本编辑器或者IDE修改以下代码
package org.wangyun;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 RESTEasy Reactive - Rxx Wang";}@GET@Produces(MediaType.TEXT_PLAIN)@Path("/greeting/{name}")public String greeting(String name) {return "hello " + name;}
}
刷新浏览器后直接生效,如下图。
测试Quarkus应用
可以使用任何的Javar测试框架来测试Quarkus应用,Quarkus默认支持Junit5进行单元测试,同时集成了REST-Assured测试框架进行验证REST服务接口。
在刚才使用Quarkus脚手架生成项目的同时也生成了测试用例,如GreetingResourceTest和GreetingResourceTest。执行mvn test
即可看到以下测试执行信息。
[INFO] Running org.wangyun.GreetingResourceTest
2023-08-12 11:44:24,724 INFO [io.quarkus] (main) rw-getstarted-quarkus 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.3.Final) started in 0.742s. Listening on: http://localhost:8083
2023-08-12 11:44:24,734 INFO [io.quarkus] (main) Profile test activated.
2023-08-12 11:44:24,734 INFO [io.quarkus] (main) Installed features: [cdi, resteasy-reactive, smallrye-context-propagation, vertx]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.456 s - in org.wangyun.GreetingResourceTest
2023-08-12 11:44:25,211 INFO [io.quarkus] (main) rw-getstarted-quarkus stopped in 0.012s
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.412 s
[INFO] Finished at: 2023-08-12T11:44:25+08:00
[INFO] ------------------------------------------------------------------------
需要注意运行了REST-Assured测试框架时会启动一个Servlet容器,默认使用的测试端口是8081,如果被占用会提示测试失败。在application.properties文件修改默认测试端口即可测试通过,具体例子如下:
quarkus.http.test-port=8083
quarkus.http.test-ssl-port=8446
为了加速应用开发流程,Quarkus支持实时编码。当应用运行在开发模式时,也可以将实时编码和持续测试结合,可以在DevUI或者控制台的命令行中执行测试用例,让代码修改和代码测试执行更快捷。具体可参考以下:
== Continuous Testing[r] - Re-run all tests
[f] - Re-run failed tests
[b] - Toggle 'broken only' mode, where only failing tests are run (disabled)
[v] - Print failures from the last test run
[p] - Pause tests
[o] - Toggle test output (disabled)
也可在Dev UI上面执行:
具体的测试代码如下:
package org.wangyun;import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;import java.util.UUID;import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;@QuarkusTest
public class GreetingResourceTest {@Testpublic void testHelloEndpoint() {given().when().get("/hello").then().statusCode(200).body(is("Hello from RESTEasy Reactive - Rxx Wang"));}@Testpublic void testGreetingEndpoint() {String uuid = UUID.randomUUID().toString();given().pathParam("name", uuid).when().get("/hello/greeting/{name}").then().statusCode(200).body(is("hello " + uuid));}
}
构建Quarkus应用
Quarkus 支持将应用程序编译为原生可执行文件,再将原生的可执行文件打包到一个容器中,天然地支持了Serverless和云原生应用。构建一个原生可执行文件需要使用GraalVM的发行版,在执行打包之前需要需设置GRAALVM_HOME
环境变量,建议代码版本与Graalvm版本保持一致。编译后应用程序的原生可执行文件将包含应用程序代码、所需的库、Java API 和一个缩小版的虚拟机。较小的虚拟机基础提高了应用程序的启动时间和最小的磁盘占用。
可通过以下命令执行构建:
quarkus build --native
或
./mvnw install -Dnative
构建产生了 target/getting-started-1.0.0-SNAPSHOT-runner 。可以用以下方式运行应用程序: ./target/getting-started-1.0.0-SNAPSHOT-runner。
另外在没有安装GraalVM的情况下创建一个Linux可执行文件,但需要依赖一个工作的容器运行环境如Docker或者podman. 为了避免对GraalVM的版本依赖,Quarkus提供了一个非常方便的方法,通过利用容器运行时(如Docker或podman)来创建一个原生Linux可执行文件。完成这项任务的最简单方法是执行:
quarkus build --native --no-tests -Dquarkus.native.container-build=true
或
./mvnw install -Dnative -DskipTests -Dquarkus.native.container-build=true
部署Quarkus应用
Quarkus应用支持像一个标准Java应用程序一样部署,同时支持作为本地可执行文件部署。
应用程序创建原生(二进制)可执行文件之后,提供了一个具备快速启动时间和消耗更少内存的应用程序。针对现在容器化部署的场景,Quarkus提供了非常方便的镜像制作方式,提供了一个完整的Dockerfile, 只需要简单修改几处配置即可完成制作。动生成的项目在 src/main/docker 目录中提供了一个 Dockerfile.xxxxx,如Dockerfile.native-micro 内容如下:
FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
可以用以下方法构建docker镜像:
docker build -f src/main/docker/Dockerfile.native-micro -t quarkus-quickstart/getting-started .
用以下方式运行:
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
总结
Quarkus 作为一个全新的云原生和微服务框架,通过编译成本地运行的方式,对比传统的Java应用程序有着天然的运行性能优势,且占用较少的内存资源。同时又兼容常用的Java框架,降低了Java程序员的学习成本,让Java程序员可以快速上手开发应用。但是要看到目前业界采用并大规模部署的并不多,跟传统的Java程序兼容性还存在一定的问题,社区相对传统的Spring成熟度也有一些距离。对于一些新应用且对性能要求高的应用值得考虑。
相关文章:

Java云原生框架Quarkus初探
Java云原生框架Quarkus初探 Quarkus 介绍 Quarkus 是一个云原生,容器优先的Java应用框架,它号称是超音速和亚原子的框架,主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制, 根据Java库和…...

ElasticSearch相关概念
文章目录 前提倒排索引MySQL、ES的区别和关联IK分词器索引库mapping属性索引库的crud 文档的crudRestClientDSL查询DSL 查询种类DSL query 基本语法 搜索结构处理排序分页高亮RestClient 前提 开源的搜索引擎,从海量数据中快速找到需要的内容。(分词检索…...

微服务实战项目-学成在线-项目部署
微服务实战项目-学成在线-项目部署 1 什么是DevOps 一个软件的生命周期包括:需求分析阶、设计、开发、测试、上线、维护、升级、废弃。 通过示例说明如下: 1、产品人员进行需求分析 2、设计人员进行软件架构设计和模块设计。 3、每个模块的开发人员…...

封装form表单
目录 1. 源码 2. 其他页面引用 ps:请看完看明白再复用 1. 源码 <template><div style"width: 100%; height: 100%" class"form-condition"><!-- 普通表单 --><el-card shadow"hover" class"cardheigh…...

程序员如何利用公网远程访问查询本地硬盘【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…...

算法|Day42 动态规划10
LeetCode 121.买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天…...

vmalert集成钉钉告警
vmalert通过在alert.rules中配置告警规则实现告警,告警规则语法与Prometheus兼容,依赖Alertmanager与prometheus-webhook-dingtalk实现钉钉告警,以下步骤: 1、构建vmalert 从源代码构建vmalert: git clone https://…...

深入解析 MyBatis 中的 <foreach> 标签:优雅处理批量操作与动态 SQL
在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中,<foreach>标签无疑是一个强大的工具,它使得…...

LeGO-Loam代码解析(二)--- Lego-LOAM的地面点分离、聚类、两步优化方法
1 地面点分离剔除方法 1.1 数学推导 LeGO-LOAM 中前端改进中很重要的一点就是充分利用了地面点,那首先自然是提取 对地面点的提取。 如上图,相邻的两个扫描线束的同一列打在地面上如 点所示,他们的垂直高度差 ,水平距离差 ,计算垂直高度差和水平高度差…...

程序员如何利用公网打造低成本轻量化的搜索和下载平台【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…...

构建可远程访问的企业内部论坛
文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy,安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道,发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…...

2023河南萌新联赛第(六)场:河南理工大学-C 旅游
2023河南萌新联赛第(六)场:河南理工大学 https://ac.nowcoder.com/acm/contest/63602/C 文章目录 2023河南萌新联赛第(六)场:河南理工大学题意解题思路代码 题意 小C喜欢旅游,现在他要去DSH旅…...

C语言 常用工具型API ----------strchr()
函数原型 char *strchr(const char *str, int c) 参数 str-- 要被检索的 C 字符串。 c-- 在 str 中要搜索的字符。 功能 在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置 头文件 #include <string.h> 返回值 返回一…...

建造者模式的理论与实现
本文实践代码仓库:https://github.com/goSilver/my_practice 文章目录 一、定义二、作用三、实现四、总结 一、定义 建造者模式是一种创建复杂对象的设计模式。它将一个复杂对象的构建过程分解为多个简单的步骤,并且允许按照特定的顺序来构建对象。通过…...

非计算机科班如何顺利转码进入计算机领域?
文章目录 如何规划才能实现转码?计算机岗位发展前景?现阶段转码 总结 🎉欢迎来到Java学习路线专栏~探索非计算机科班如何顺利转码进入计算机领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客dz…...

【C++类和对象】类有哪些默认成员函数呢?(下)
文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…...

springboot自定义banner的输出与源码解析
文章目录 一、介绍二、演示环境三、自定义banner1. 文本2. 图片3. placeholder占位符4. 关闭banner 四、源码分析1. 关闭banner2. banner模式3. banner打印器4. 打印banner① 获取banner② 打印banner 5. 版本号占位符的解析器6. 文本格式占位符的解析器7. 应用标题占位符的解析…...

LeetCode 141.环形链表
文章目录 💡题目分析💡解题思路🔔接口源码💡深度思考❓思考1❓思考2 题目链接👉 LeetCode 141.环形链表👈 💡题目分析 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中…...

Spring-Bean的生命周期
目录 生命周期汇总 细分生命周期 1.实例化 2.属性赋值(依赖注入) 3.Aware接口 4.BeanPostProcessor接口 5.初始化 6.销毁 测试验证 类结构 业务类 测试类 生命周期汇总 Spring Bean 的生命周期见下图 (一定记忆好下图&#x…...

Cat(3):客户端集成—简单案例
接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…...

虚拟机/双系统Ubuntu扩容
虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具:sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照,不然gg了…...

Nginx搭建本地服务器,无需购买服务器即可测试vue项目打包后的效果
一.前言 本文是在windows环境(Linux环境下其实也大同小异)下基于Nginx实现搭建本地服务器,手把手教你部署vue项目。 二.Nginx入门 1)下载安装 进入Nginx官网下载,选择stable版本下的windows版本下载即可 2)…...

SpringBoot 接口调用出现乱码解决 中文乱码
SpringBoot 接口调用出现乱码解决 package com.cxjg.mvc.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springfra…...

JDBC封装与设计模式
什么是 DAO ? Data Access Object(数据存取对象) 位于业务逻辑和持久化数据之间实现对持久化数据的访问 DAO起着转换器的作用,将数据在实体类和数据库记录之间进行转换。 ----------------------------------------------------- DAO模式的组成部分 …...

小程序扫描二维码获取网址,通过Jsoup进行解析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、Jsoup是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 vx开发小程序使用扫一扫时不同二维码展示的东西不一样,需要进行解析 提示&a…...

Kubernetes+EFK构建日志分析平台
目录 Elasticsearch产品介绍 Fluentd 工作原理 Kibana产品介绍 一、环境准备 前三个主机都要操作 1、主机初始化配置 2、部署docker环境 2、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml …...
客服如何减轻工作压力?浅析客服压力管理方法
在现代商业领域中,客服是一项非常重要的工作,负责根据客户需求提供解决方案。客服工作不仅需要一定的专业知识和技能,还需要面对各种复杂、多变的情况,并拥有强大的应对压力的能力。客服从业人员的工作压力往往非常大,…...

知识储备--基础算法篇-二分搜索
1.前言 最近准备开始刷算法题了,搜了很多相关的帖子,下面三个很不错, 计算机视觉秋招准备过程看这个:计算机视觉算法工程师-秋招面经 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/399813916 复习深度学习相关…...

【MySQL系列】表内容的基本操作(增删查改)
「前言」文章内容大致是对MySQL表内容的基本操作,即增删查改。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表内容的增删查改1.1 Create1.1.1 单行数据全列插入1.1.2 多行数据指定列插入1.1.3 插入否则更新1.1.4 数据替换 1.2 Ret…...

docker搭建LNMP
docker安装 略 下载镜像 nginx:最新版php-fpm:根据自己需求而定mysql:根据自己需求定 以下是我搭建LNMP使用的镜像版本 rootVM-12-16-ubuntu:/docker/lnmp/php/etc# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0…...