云原生时代高性能Java框架—Quarkus(一)
——— Quarkus&GraalVM介绍、创建并启动第一个项目
Quarkus系列博文
- Quarkus&GraalVM介绍、创建并启动第一个项目
- 构建Quarkus本地镜像、容器化部署Quarkus项目
- ...
Quarkus介绍
Quarkus 是一个为 Java 虚拟机(JVM)和原生编译(native compilation)而设计的全栈Kubernetes 原生 Java 框架,用于优化Java特别是Java项目的容器化,并使其成为serverless、云和 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 {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200) //2
.body(is("hello"));
}
}
- 通过使用@QuarkusTest注解运行程序,可以指示JUnit在测试之前启动应用程序。
- 检查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(一)的更多相关文章
- 云原生时代高性能Java框架—Quarkus(二)
--- *构建Quarkus本地镜像.容器化部署Quarkus项目* Quarkus系列博文 Quarkus&GraalVM介绍.创建并启动第一个项目 构建Quarkus本地镜像.容器化部署Q ...
- 🏆【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究
GraalVM 背景 新.旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript.人工智能之于Python,微服务风潮之于Golang等等.大家都清楚不太可能有哪门语言能在 ...
- 云原生时代,Java的危与机(周志明)
说明 本篇文章是转载自周志明老师的文章,链接地址:https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE 今天,25 岁的 Java 仍然是最具有统治力的编 ...
- 云原生时代的Java
原文链接(作者:周志明):https://time.geekbang.org/column/article/321185 公开课链接:https://time.geekbang.org/opencou ...
- Java云原生崛起微服务框架Quarkus入门实践
@ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...
- 进击的 Java ,云原生时代的蜕变
作者| 易立 阿里云资深技术专家 导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的.然而,本文的作者却认为云原生时代,Java 依然可以胜任&qu ...
- 云原生时代 给予.NET的机会
.NET诞生于与Java的竞争,微软当年被罚款20亿美元. Java绝不仅仅是一种语言,它是COM的替代者! 而COM恰恰是Windows的编程模型.而Java编程很多时候比C++编程要容易的多,更致 ...
- QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》
上周去听了QCon全球开发大会,其中有几场印象比较深刻的分享,除去几个比较概念化的话题,在Java技术演进这个Topic里的几个分享都是比较有干货的(但感觉工作中用不到) 首先是关于林子熠老师分享的冷 ...
- 进击的.NET 在云原生时代的蜕变
你一定看过这篇文章 <进击的 Java ,云原生时代的蜕变>, 本篇文章的灵感来自于这篇文章.明天就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Cor ...
随机推荐
- 【hdoj】哈希表题hdoj1425
hdoj1425 github链接 #include<cstdio> #include<cstring> using namespace std; const int offs ...
- SpringMVC 学习笔记(五)
47. 尚硅谷_佟刚_SpringMVC_文件上传.avi 参看博客https://www.cnblogs.com/hanfeihanfei/p/7931758.html相当的经典 我是陌生人关于Sp ...
- Python 简明教程 --- 16,Python 高阶函数
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 对于那些快速算法,我们总是可以拿一些速度差不多但是更容易理解的算法来替代它们. -- Douglas ...
- 深入理解JVM(③)虚拟机的类加载过程
前言 上一篇我们介绍到一个类的生命周期大概分7个阶段:加载.验证.准备.解析.初始化.使用.卸载.并且也介绍了类的加载时机,下面我们将介绍一下虚拟机中类的加载的全过程.主要是类生命周期的,加载.验证. ...
- 全网最深分析SpringBoot MVC自动配置失效的原因
前言 本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事 ...
- JsPlumb在react的使用方法及介绍
JsPlumb在react的使用方法及介绍 一.相关资料来源: 1.https://bitqiang.gitbooks.io/jsplumb/content/Chapter1_IMPORTS_AND_ ...
- (私人收藏)SQLite 全面手册以及教程
SQLite 全面手册以及教程 https://pan.baidu.com/s/1VKzCWjF79fAiOLjAlx-3zwnfkp SQLite 全面手册以及教程 SQLite 简介 SQLite ...
- 支持十万并发的黑科技-NIO
今天是猿灯塔“365天原创计划”第3天. 今天讲: 支持十万并发的黑科技-NIO 翻译过来就是:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致 ...
- JVM学习篇-第一篇
JVM学习篇-第一篇 JDK( Java Development Kit): Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...
- WIN10有线网络反复断开解决方法
最近家里台式机碰到一个奇怪的问题,开机之后有线网络就时断时续,右下角网络图标不停在小地球与小电脑之间切换.网上大概搜索了一下,貌似碰到这种问题的朋友不在少数,但大部分朋友碰到的都是无线网络居多.这里把 ...