——— Quarkus&GraalVM介绍、建立并启动第一个项目java
Quarkus系列博文数据库
Quarkus 是一个为 Java 虚拟机(JVM)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。编程
Quarkus 可与经常使用 Java 标准、框架和库协同工做,例如 Eclipse MicroProfile、Apache Kafka、RESTEasy(JAX-RS)、Hibernate ORM(JPA)、Spring、Infinispan、Camel 等。bash
Quarkus 的依赖注入解决方案基于 CDI(上下文和依赖注入),且包含一个扩展框架来扩展功能并将其配置、引导并集成到您的应用中。添加扩展就像添加依赖项同样容易;或者,您可使用 Quarkus 工具。服务器
此外也是引人注目的一个特色,它还向 GraalVM(一种通用虚拟机,用于运行以多种语言(包括 Java 和 JavaScript)编写的应用)提供正确信息,以便对应用进行原生编译。intellij-idea
Rad Hat列出了一下清单来代表使用Quarkus的好处:检查清单框架
Quarkus与传统技术栈对比curl
来自官方的一张图,展现了使用Quarkus框架开发项目和使用传统框架开发的一些运行时数据明细对比,能够看到Quarkus项目在JVM中运行时所消耗的内存和接口响应能力要明显好于传统的Java技术栈。而将Quarkus编译成本地可执行文件(本地镜像)以后,其优点能够说很是明显了。maven
GraalVM是一种高性能的虚拟机,它能够显著的提升程序的性能和运行效率,很是适合微服务。其设计初衷是实现能够运行不一样语言(Java、JavaScript、基于LLVM的语言(例如C和C ++)以及其余动态语言)编写的应用程序。它消除了不一样编程语言之间的隔阂,并实现了多语言共享运行时的互操做性。它能够独立运行,也能够在OpenJDK,Node.js或Oracle数据库的上下文中运行。编程语言
对于Java应用程序,GraalVM能够带来不少有价值的好处:更快地运行它们,经过脚本语言(JavaScript, R, Python...)提供可扩展性或建立提早编译的本机映像(native-image)。
更多关于GraalVM的信息可参考:此篇文章。
本文咱们使用SDKMAN来安装GraalVM。SDKMAN是一款用于在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具。它提供了一个方便的命令行界面(CLI)和API,用于安装,切换,删除和列出候选人。它之前被称为Groovy enVironment Manager (GVM),受到了很是有用的RVM和rbenv工具的启发,该工具在Ruby社区中普遍使用。
运行以下命令进行安装:
$ curl -s "https://get.sdkman.io" | bash $ source "$HOME/.sdkman/bin/sdkman-init.sh"
运行以下命令,验证是否已安装ADKMAN:
$ sdk version
运行以下命令:
$ 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项目
点击菜单栏File>New>Project... 建立新项目
点击Next,并填写适当的信息,Next>Next...,建立完毕。
运行以下命令,建立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")); } }
默认状况下,测试将在端口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变得更加本地化,不论是项目的体量方面仍是资源消耗和运行效率方面都有显著提高。