应“云”而生的 Java 框架:Hello, Quarkus

应“云”而生的 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 下提供了 nativejvm 风格的 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 仅包含了项目编译的类和资源文件,是不可执行的 jar
  • quarkus-app 目录中包含了可执行的 jar 文件 quarkus-run.jar但是,其并不是一个 über-jar,项目的依赖库都位于 lib目录中。

可以通过执行 java -jar target/quarkus-app/quarkus-run.jar 在启动应用。

这意味着假如你想在容器中运行,需要部署整个 quarkus-app 目录

使用 fast-jar

qurakus 的打包方式有两种:legacy-jarfast-jar。可以在 application.properties 文件中进行指定,未显式指定默认为 legacy-jar

quarkus.package.type=fast-jar

如果要在容器中运行,同样需要部署整个 quarkus-app 目录 fast-jar 类型的包比 legacy-jar 的包启动会快一点点,同时占用的内存也更低。因为 fast-jar 的包含了依赖包中的类和资源文件的索引,避免在类和资源文件加载时对 classpath 下的包的查找。

下一篇,试试构建一个原生的可执行文件。

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus