在本教程中,我将向你展示如何用Quarkus创建一个安全的REST API和本地图像。你将看到如何运行一个安全的、受OAuth 2.0保护的、允许JWT认证的Java REST API。然后,我将比较它与Micronaut、Spring Boot和Helidon的性能。
本教程也可作为截屏提供。
先决条件:
| 一些步骤后面的括号表示我在视频中使用的IntelliJ Live模板。你可以在mraible/idea-live-templates找到模板的定义。 |
目录
- 用GraalVM安装JDK
- 生成一个OAuth 2.0访问令牌
- 创建一个Quarkus Java REST API
- 启动时间比较
- 内存使用比较
- 原生Java REST API框架的比较直播
- 用Quarkus确保本地Java的安全!
用GraalVM安装JDK
使用SDKMAN用GraalVM安装Java 17
sdk install java 22.1.0.r17-grl
生成一个OAuth 2.0访问令牌
-
安装Okta CLI并运行
okta register,注册一个新的账户。如果你已经有一个账户,运行okta login。 -
运行
okta apps create spa。设置oidcdebugger作为应用程序名称,然后按回车键。 -
在重定向URI中使用
https://oidcdebugger.com/debug,并将注销重定向URI设置为https://oidcdebugger.com。 -
-
填入你的客户ID
-
在授权URI中使用
/oauth2/default/v1/authorize -
为响应类型选择代码,并使用PKCE
-
点击发送请求,继续
-
-
在终端窗口中将访问令牌设置为
TOKEN环境变量。TOKEN=eyJraWQiOiJYa2pXdjMzTDRBYU1ZSzNGM...
创建Quarkus Java REST API
-
使用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" -
编辑
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() + "!"; } } -
将你的Okta端点添加到
src/main/resources/application.properties。[qk-properties]mp.jwt.verify.publickey.location=/oauth2/default/v1/keys mp.jwt.verify.issuer=/oauth2/default -
修改
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
-
运行你的Quarkus应用程序。
./mvnw quarkus:dev -
从另一个终端测试它。
http :8080/hello -
用访问令牌进行测试。
http :8080/hello Authorization:"Bearer $TOKEN"
构建一个本地Quarkus应用程序
-
将你的Quarkus应用程序编译成一个本地二进制文件。
./mvnw package -Pnative -
启动你的Quarkus应用程序。
./target/quarkus-1.0.0-SNAPSHOT-runner -
用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;}'