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


Quarkus系列博文


Quarkus介绍

Quarkus 是一个为 Java 虚拟机(JVM)原生编译(native compilation)而设计的全栈Kubernetes 原生 Java 框架,用于优化Java特别是Java项目的容器化,并使其成为serverlessKubernetes 环境的高效平台。

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 {
@Test
public 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; @Test
public 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框架—Quarkus(二)

    --- *构建Quarkus本地镜像.容器化部署Quarkus项目* Quarkus系列博文 Quarkus&GraalVM介绍.创建并启动第一个项目 构建Quarkus本地镜像.容器化部署Q ...

  2. 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究

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

  3. 云原生时代,Java的危与机(周志明)

    说明 本篇文章是转载自周志明老师的文章,链接地址:https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE 今天,25 岁的 Java 仍然是最具有统治力的编 ...

  4. 云原生时代的Java

    原文链接(作者:周志明):https://time.geekbang.org/column/article/321185 公开课链接:https://time.geekbang.org/opencou ...

  5. Java云原生崛起微服务框架Quarkus入门实践

    @ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...

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

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

  7. 云原生时代 给予.NET的机会

    .NET诞生于与Java的竞争,微软当年被罚款20亿美元. Java绝不仅仅是一种语言,它是COM的替代者! 而COM恰恰是Windows的编程模型.而Java编程很多时候比C++编程要容易的多,更致 ...

  8. QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

    上周去听了QCon全球开发大会,其中有几场印象比较深刻的分享,除去几个比较概念化的话题,在Java技术演进这个Topic里的几个分享都是比较有干货的(但感觉工作中用不到) 首先是关于林子熠老师分享的冷 ...

  9. 进击的.NET 在云原生时代的蜕变

    你一定看过这篇文章 <进击的 Java ,云原生时代的蜕变>,  本篇文章的灵感来自于这篇文章.明天就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Cor ...

随机推荐

  1. 10.DRF-认证

    Django rest framework源码分析(1)----认证 一.基础 1.1.安装 两种方式: github pip直接安装 pip install djangorestframework ...

  2. 团队Github实践训练

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队Github实践训练 这个作业的目标 通过github实现团队协作编码 作业正 ...

  3. Kafka源码解析(二)---Log分析

    上一篇文章讲了LogSegment和Log的初始化,这篇来讲讲Log的主要操作有哪些. 一般来说Log 的常见操作分为 4 大部分. 高水位管理操作 日志段管理 关键位移值管理 读写操作 其中关键位移 ...

  4. 呼~~~~--历时几个星期终于搞好了HTTPS协议---阿里云

    打开网站加入阿里云官网 https://yundun.console.aliyun.com/?p=cas#/overview/cn-hangzhou 登陆查看自己的证书 没有点击购买证书 -- 选中对 ...

  5. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  6. 【Model Log】模型评估指标可视化,自动画Loss、Accuracy曲线图工具,无需人工参与!

    1. Model Log 介绍 Model Log 是一款基于 Python3 的轻量级机器学习(Machine Learning).深度学习(Deep Learning)模型训练评估指标可视化工具, ...

  7. linux下将多个ts文件合并为一个MP4文件

    1. 安装ffmpeg工具 sudo apt install ffmpeg 2. 确保所有ts文件无损坏后,确保当前目录(即存放ts文件的目录)无txt文件及mp4文件,在存放ts文件的目录下建立te ...

  8. dart快速入门教程 (7.4)

    7.12.多态 多态字面上理解就是多种状态,通俗的说,多态表现为父类定义一个方法不去实现,子类继承这个方法后实现父类的方法,这个方法有多种表现 // import 'person.dart'; voi ...

  9. Java中栈和堆讲解

    之前对JVM中堆内存和栈内存都是一直半解,今天有空就好好整理一下,用作学习笔记. 包括Java程序在内,任何程序在运行时都是要开辟内存空间的.JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区 ...

  10. 三.cmdb

    一.服务器管理: https://github.com/rfjer/autoAdmin/tree/master/apps/servers 一服务器信息收集方式: 1.物理服务器 跑脚本传(bash/a ...