——— Quarkus&GraalVM介绍、创建并启动第一个项目


Quarkus系列博文

  • Quarkus&GraalVM介绍、创建并启动第一个项目
  • 构建Quarkus本地镜像、容器化部署Quarkus项目

Quarkus介绍

Quarkus 是一个为 Java 虚拟机(JVM)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。

Quarkus 可与常用 Java 标准、框架和库协同工作,例如 Eclipse MicroProfile、Apache Kafka、RESTEasy(JAX-RS)、Hibernate ORM(JPA)、Spring、Infinispan、Camel 等。

Quarkus 的依赖注入解决方案基于 CDI(上下文和依赖注入),且包含一个扩展框架来扩展功能并将其配置、引导并集成到您的应用中。添加扩展就像添加依赖项一样容易;或者,您可以使用 Quarkus 工具。

此外也是引人注目的一个特点,它还向 GraalVM(一种通用虚拟机,用于运行以多种语言(包括 Java 和 JavaScript)编写的应用)提供正确信息,以便对应用进行原生编译。

Rad Hat列出了一下清单来表明使用Quarkus的好处:检查清单

Quarkus与传统Java框架对比

Quarkus与传统技术栈对比

来自官方的一张图,展示了使用Quarkus框架开发项目和使用传统框架开发的一些运行时数据明细对比,可以看到Quarkus项目在JVM中运行时所消耗的内存和接口响应能力要明显好于传统的Java技术栈。而将Quarkus编译成本地可执行文件(本地镜像)之后,其优势可以说非常明显了。

GraalVM简介

GraalVM是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务。其设计初衷是实现可以运行不同语言(Java、JavaScript、基于LLVM的语言(例如C和C ++)以及其他动态语言)编写的应用程序。它消除了不同编程语言之间的隔阂,并实现了多语言共享运行时的互操作性。它可以独立运行,也可以在OpenJDK,Node.js或Oracle数据库的上下文中运行。

对于Java应用程序,GraalVM可以带来很多有价值的好处:更快地运行它们,通过脚本语言(JavaScript, R, Python…)提供可扩展性或创建提前编译的本机映像(native-image)。

更多关于GraalVM的信息可参考:此篇文章。

GraalVM安装

本文我们使用SDKMAN来安装GraalVM。SDKMAN是一款用于在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具。它提供了一个方便的命令行界面(CLI)和API,用于安装,切换,删除和列出候选人。它以前被称为Groovy enVironment Manager (GVM),受到了非常有用的RVM和rbenv工具的启发,该工具在Ruby社区中广泛使用。

安装SDKMAN

运行如下命令进行安装:

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

运行如下命令,验证是否已安装ADKMAN:

$ sdk version

安装GraalVM

运行如下命令:

$ sdk list java

可以看到SDKMAN列出了所支持的所有Java发行版

我们找到GraalVM的发行版

截至编写本文时,GraalVM的最新版本为20.1.0.r11-grl,所以我们会安装此版本。运行如下命令安装GraalVM:

$ sdk install java 20.1.0.r11-grl

至此,GraalVM安装完毕!我们可以运行如下命令来判断GraalVM是否已安装:

$ java -version

创建项目

我们有多种方式创建Quarkus项目

使用Intellij IDEA创建Quarkus项目

点击菜单栏File>New>Project… 创建新项目

点击Next,并填写适当的信息,Next>Next…,创建完毕。

使用Maven命令行创建Quarkus项目

运行如下命令,创建Quarkus项目:

mvn io.quarkus:quarkus-maven-plugin:1.6.0.Final:create \-DprojectGroupId=org.acme \-DprojectArtifactId=getting-started \-DclassName="org.acme.getting.started.GreetingResource" \-Dpath="/hello"
cd getting-started

至此,创建项目完毕!

启动项目

我们使用IDEA打开项目

Quarkus并没有类似Spring Boot、Helidon之类框架一样的启动类,我们需要通过运行Maven命令来启动项目。

在IDEA控制台运行如下命令来启动项目:

./mvnw compile quarkus:dev

启动成功!

当然每次运行命令行会显得不便,我们可以通过如下配置来配置项目快捷启动:

点击左上角"+“图标添加一个Maven配置如左边栏,在右边栏中的Command line中填入"compile quarkus:dev”,点击OK。

此时可以点下下图所示图标来便捷启动项目

运行测试

打开项目中的测试类,看到如下代码:

@QuarkusTest  //1
public class ExampleResourceTest {@Testpublic void testHelloEndpoint() {given().when().get("/hello").then().statusCode(200) //2.body(is("hello"));}
}
  1. 通过使用@QuarkusTest注解运行程序,可以指示JUnit在测试之前启动应用程序。
  2. 检查HTTP响应状态代码和内容。

默认情况下,测试将在端口8081上运行,以免与正在运行的应用程序冲突。Quarkus自动将RestAssured配置为使用此端口。如果要测试其他路径,则可以使用@TestHTTPResource注解将被测试的URL直接注入到测试类的字段中。该字段的类型可以是字符串,URL或URI。我们需要为该注解指定测试路径的值。例如,如果我要测试映射到/myservlet的Servlet,只需在测试中添加以下内容:

@QuarkusTest
public class ExampleResourceTest {@TestHTTPResource("/myservlet")URL testUrl;@Testpublic void testHelloEndpoint() {given().when().get(testUrl).then().statusCode(200) .body(is("hello"));}
}

可以通过在项目配置文件中配置quarkus.http.test-port属性控制测试端口。 Quarkus还创建了一个名为test.url的系统属性,该属性值将被设置成基础测试URL(BasePath)。

总结

我们进入了云原生、微服务的时代,我们告别了大型单体应用的庞大和复杂,并且收获了微服务带来的极大的好处 。但是一些问题也开始接踵而至。随着微小服务的增多,曾经在单个应用上发生的多余无用依赖、Java项目与生俱来的启动过程缓慢、JIT优化问题扩散到了每个微服务上面。而且传统的Java EE规范并没有微服务的模式解决方案,问题很迫切需要解决。幸运的事,随着Quarkus、Helidon等等一些新型Java开发框架的出现缓解了这个局面(以及目前Spring生态也开始了对GraalVM的大力支持),他们使Java变得更加本地化,不管是项目的体量方面还是资源消耗和运行效率方面都有显著提升。

云原生时代高性能Java框架—Quarkus(一)相关推荐

  1. 【Java核心技术大会 PPT分享】张家驹:云原生时代的Java — Quarkus及其最新进展...

    导读:云原生时代的Java - Quarkus及其最新进展 Java核心技术大会2022 云原生时代的Java - Quarkus及其最新进展 张家驹:红帽大中华区首席架构师 (Chief Archi ...

  2. 云原生时代的 Java 虚拟机

    GraalVM 背景 新.旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript.人工智能之于Python,微服务风潮之于 Golang 等等.大家都清楚不太可能有哪门语言 ...

  3. 云原生时代,Java 的危与机

    今天,25 岁的 Java 仍然是最具有统治力的编程语言,长期占据编程语言排行榜的首位,拥有一千二百万的庞大开发者群体,全世界有四百五十亿部物理设备使用着 Java 技术,同时,在云端数据中心的虚拟化 ...

  4. GraalVM - 云原生时代的 Java 笔记

    GraalVM - 云原生时代的 Java 笔记 前言 GraalVM 诞生的背景 GraalVM Graal Compiler Benefits of JIT Creating a Native I ...

  5. 云原生时代的流水线框架 Argo

    作者 | FogDong(才云) 来源 | K8sMeetup社区 头图 | 下载于视觉中国 流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本 ...

  6. 云原生时代,Java还有优势么?

    1.最近,很多后端工程师都在讨论,Rust.Go和Java这三门语言的对比.虽然我们经常拿PHP是世界上最好的语言来开玩笑.但具体到工作里,确实语言的选择非常重要,这一定程度上会直接决定一个工程师薪资 ...

  7. 云原生时代,Java还是Go?

    Java曾经著名的座右铭:"一次编写,到处运行",已经很过时了,因为现在我们只想在容器里运行代码.在容器里,一个 "Just in time "的编译器意义不大 ...

  8. 进击的 Java ,云原生时代的蜕变

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 易立 来源 | 公众号「阿里巴巴云原生」 导读:云原生时代的来临,与Java 开发 ...

  9. 阿里技术专家:进击的 Java ,云原生时代的蜕变

    作者| 易立 阿里云资深技术专家 导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的.然而,本文的作者却认为云原生时代,Java 依然可以胜任&qu ...

最新文章

  1. APICloud创始人兼CEO刘鑫:论API经济和企业移动战略
  2. 用shell打印下面这句话中字母数小于6的单词
  3. 学习——JavaWeb05:JSP入门
  4. 一句命令行检查cpu个数
  5. 分析了 Stack Overflow、Reddit 等 9 个榜单,Python 第一的地位稳了!
  6. PATB1017 A除以B
  7. ftp服务器最简单的搭建和配置
  8. 13. PHP 数组
  9. C语言常用库函数(含详细用法))
  10. 图形学基础|深度缓冲(DepthBuffer)
  11. 中国电信天翼物联网平台CTWing学习笔记(1)——设备接入(TCP协议)
  12. 如何从福彩官网抓取 双色球历史数据
  13. 国外cpa广告联盟EMU-lead-cpa联盟详解(2)im搭建
  14. c语言中j%2什么意思,C语言中if(j%2) continue;
  15. python实现微信群友统计器
  16. html文字段落缩进,CSS text-indent段落首行文字缩进分享
  17. 02-网络为什么要分层
  18. 互点流量,互刷排名,刷下拉刷联想-胖虎图图-互动点击系统
  19. java如何打印棋盘_java打印国际象棋棋盘的方法|chu
  20. 【会议分享】2022年电子,通信与控制工程国际研讨会(SECCE 2022)

热门文章

  1. LDA文本主题模型的学习笔记
  2. 订餐网站服务器配置,网上订餐模块介绍
  3. 紫光华山20款服务器升级到E5 V4,永久性内存是亮点
  4. 使用upgrade-insecure-requests的问题
  5. 机器学习入门(十六):SVM——线性 SVM,间隔由硬到软
  6. 数据透视表之在数据透视表中进行计算
  7. 使用客户管理系统分析企业数据
  8. nodejs require模块找不到的两种解决办法
  9. ros找不到包的两种原因
  10. 新风系统风速推荐表_新风系统该如何选择管径、计算风速与全压?知道