用Quarkus启动一个Java REST API

142 阅读3分钟

在本教程中,我将向你展示如何用Quarkus创建一个安全的REST API和本地图像。你将看到如何运行一个安全的、受OAuth 2.0保护的、允许JWT认证的Java REST API。然后,我将比较它与Micronaut、Spring Boot和Helidon的性能。

本教程也可作为截屏提供。

先决条件:

一些步骤后面的括号表示我在视频中使用的IntelliJ Live模板。你可以在mraible/idea-live-templates找到模板的定义。

目录

用GraalVM安装JDK

使用SDKMAN用GraalVM安装Java 17

sdk install java 22.1.0.r17-grl

生成一个OAuth 2.0访问令牌

  1. 安装Okta CLI并运行okta register ,注册一个新的账户。如果你已经有一个账户,运行okta login

  2. 运行okta apps create spa 。设置oidcdebugger 作为应用程序名称,然后按回车键

  3. 在重定向URI中使用https://oidcdebugger.com/debug ,并将注销重定向URI设置为https://oidcdebugger.com

  4. 导航到OpenID Connect Debugger网站

    1. 填入你的客户ID

    2. 在授权URI中使用/oauth2/default/v1/authorize

    3. 为响应类型选择代码,并使用PKCE

    4. 点击发送请求,继续

  5. 在终端窗口中将访问令牌设置为TOKEN 环境变量。

    TOKEN=eyJraWQiOiJYa2pXdjMzTDRBYU1ZSzNGM...
    

创建Quarkus Java REST API

  1. 使用Maven生成一个支持JWT的新Quarkus应用程序。

    mvn io.quarkus:quarkus-maven-plugin:2.9.0.Final:create \
        -DprojectGroupId=com.okta.rest \
        -DprojectArtifactId=quarkus \
        -DclassName="com.okta.rest.quarkus.HelloResource" \
        -Dpath="/hello" \
        -Dextensions="smallrye-jwt,resteasy-reactive"
    
  2. 编辑src/java/com/okta/rest/quarkus/HelloResource.java ,在hello() 方法中添加用户信息:[qk-hello]

    package com.okta.rest.quarkus;
    
    import io.quarkus.security.Authenticated;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.Context;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.SecurityContext;
    import java.security.Principal;
    
    @Path("/hello")
    public class HelloResource {
    
        @GET
        @Authenticated
        @Produces(MediaType.TEXT_PLAIN)
        public String hello(@Context SecurityContext context) {
            Principal userPrincipal = context.getUserPrincipal();
            return "Hello, " + userPrincipal.getName() + "!";
        }
    }
    
  3. 将你的Okta端点添加到src/main/resources/application.properties 。[qk-properties]

    mp.jwt.verify.publickey.location=/oauth2/default/v1/keys
    mp.jwt.verify.issuer=/oauth2/default
    
  4. 修改HelloResourceTest ,以期待一个401而不是200。

    package com.okta.rest.quarkus;
    
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.Test;
    
    import static io.restassured.RestAssured.given;
    
    @QuarkusTest
    public class HelloResourceTest {
    
        @Test
        public void testHelloEndpoint() {
            given()
                .when().get("/hello")
                .then()
                .statusCode(401);
        }
    
    }
    

用HTTPie运行和测试你的Quarkus REST API

  1. 运行你的Quarkus应用程序。

    ./mvnw quarkus:dev
    
  2. 从另一个终端测试它。

    http :8080/hello
    
  3. 用访问令牌进行测试。

    http :8080/hello Authorization:"Bearer $TOKEN"
    

构建一个本地Quarkus应用程序

  1. 将你的Quarkus应用程序编译成一个本地二进制文件。

    ./mvnw package -Pnative
    
  2. 启动你的Quarkus应用程序。

    ./target/quarkus-1.0.0-SNAPSHOT-runner
    
  3. 用HTTPie和一个访问令牌来测试它。

    http :8080/hello Authorization:"Bearer $TOKEN"
    

启动时间比较

在记录数字之前,我通过运行每个图像三次来比较各框架的启动时间。然后,我又将每个应用程序运行了五次,并对结果进行了平均。我在一台配备固态硬盘、2.4 GHz 8核英特尔酷睿i9处理器和64GB内存的2019年MacBook Pro上收集这些数字。

内存使用情况比较

我使用下面的命令测试了每个应用程序的内存使用情况(以兆字节为单位)。我在启动应用程序后立即运行了它,在一个认证请求后,以及在五个认证请求后。

ps -o pid,rss,command | grep --color <executable> | awk '{$2=int($2/1024)"M";}{ print;}'