应“云”而生的 Java 框架:Hello, Quarkus
Wikipedia上有关 Quarkus 的信息还很少,只有一句简单的介绍:
Quarkus 是专为 OpenJDK HotSpot 和 GraalVM 定制的全栈 Kubernetes 原生 Java 应用程序框架。与如 Spring 之类的其他框架相比,它提供了较小的内存占用并缩短了启动时间。它允许结合命令式和非阻塞响应式编程。
从 Quarkus 的官网,可以看到其有几个特性:
- 容器优先
- 统一了命令式和响应式编程
- 开发者友好
- 最佳品种的库及标准
更多 Quarkus 可以参考官网的介绍及文档。今天主要就是跑一下 Quarkus 的 Hello world
。
放一张官网的图:
环境准备
- 基于 Java 11 的 GraalVM
- Maven 3.6.2+
笔者使用的是 macos 10.15.4,GraalVM 和 Maven 建议通过 sdkman 进行安装。
$ sdk install java 21.0.0.2.r11-grl #如果已使用其他 java 版本,可以使用命令 sdk use java 21.0.0.2.r11-grl 进行切换
$ sdk install maven 3.6.3
验证安装
$ java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment GraalVM CE 21.0.0.2 (build 11.0.10+8-jvmci-21.0-b06)
OpenJDK 64-Bit Server VM GraalVM CE 21.0.0.2 (build 11.0.10+8-jvmci-21.0-b06, mixed mode, sharing)
$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/addo/.sdkman/candidates/maven/current
Java version: 11.0.10, vendor: GraalVM Community, runtime: /Users/addo/.sdkman/candidates/java/21.0.0.2.r11-grl
Default locale: en_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.4", arch: "x86_64", family: "mac"
快速开始
创建项目
创建 quarkus 项目最快的方式是通过 quarkus-maven-plugin
来创建,使用如下的命令快速可以创建
$ mvn io.quarkus:quarkus-maven-plugin:1.13.0.Final:create \
-DprojectGroupId=com.atbug.quickstart \
-DprojectArtifactId=quarkus-getting-started \
-DclassName="com.atbug.quickstart.GreetingResource" \
-Dpath="/hello"
在 ./quarkus-getting-started
中提供了:
- maven 的项目结构
com.atbug.quickstart.GreetingResource
暴露了/hello
端点,通过JAX-RS
注解实现- 相关的单元测试
- 应用启动后可以通过
http://localhost:8080
打开的启动页面 src/main/docker
下提供了native
和jvm
风格的 Dockerfile- 应用配置文件
运行应用
执行 ./mvnw compile quarkus:dev
命令可启动应用
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-04-05 19:48:36,419 INFO [io.quarkus] (Quarkus Main Thread) quarkus-getting-started 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.13.0.Final) started in 2.135s. Listening on: http://localhost:8080
2021-04-05 19:48:36,448 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-04-05 19:48:36,448 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]
访问 /hello
断点
$ http :8080/hello
HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain;charset=UTF-8
Hello
笔者通过
httpie
进行访问,可以通过brew install httpie
进行安装,推荐使用。
增加新的断点
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/greeting/{name}")
public String greeting(@PathParam String name) {
return "Hello, " + name;
}
注:PathParam
来自 org.jboss.resteasy.annotations.jaxrs.PathParam
测试:
$ http :8080/hello/greeting/Quarkus
HTTP/1.1 200 OK
Content-Length: 14
Content-Type: text/plain;charset=UTF-8
Hello, Quarkus
为新的端点增加单元测试
@Test
public void testGreetingEndpoint() {
final String uuid = UUID.randomUUID().toString();
given()
.pathParam("name", uuid)
.when().get("/hello/greeting/{name}")
.then()
.statusCode(200)
.body(is("Hello, " + uuid));
}
通过 ./mvnw test
运行单元测试
注意这里使用 intellij 运行单元测试的话,会报错。需要修改 Java Compiler 的配置,添加额外的命令行参数
-parameters
打包
与通常的 maven 项目打包方式一样,执行 ./mvnw package
,在 target
目录中:
quarkus-getting-started-1.0.0-SNAPSHOT.jar
仅包含了项目编译的类和资源文件,是不可执行的 jarquarkus-app
目录中包含了可执行的 jar 文件quarkus-run.jar
,但是,其并不是一个über-jar
,项目的依赖库都位于lib
目录中。
可以通过执行 java -jar target/quarkus-app/quarkus-run.jar
在启动应用。
这意味着假如你想在容器中运行,需要部署整个
quarkus-app
目录
使用 fast-jar
qurakus 的打包方式有两种:legacy-jar
和 fast-jar
。可以在 application.properties
文件中进行指定,未显式指定默认为 legacy-jar
。
quarkus.package.type=fast-jar
如果要在容器中运行,同样需要部署整个
quarkus-app
目录fast-jar
类型的包比legacy-jar
的包启动会快一点点,同时占用的内存也更低。因为fast-jar
的包含了依赖包中的类和资源文件的索引,避免在类和资源文件加载时对 classpath 下的包的查找。
下一篇,试试构建一个原生的可执行文件。