In this demo, I’ll show how to create a secure REST API and native image with Helidon. You’ll see how to run a secure, OAuth 2.0-protected, Java REST API that allows JWT authentication. Then, I’ll compare its performance with Micronaut, Quarkus, and Spring Boot.
Check this video’s description below for links to its blog post, comments, demo script, and code example.
Prerequisites:
-
SDKMAN (for Java 17 with GraalVM)
-
HTTPie (a better version of cURL)
-
An Okta Developer Account (or the Okta CLI)
Tip
|
The brackets at the end of some steps indicate the IntelliJ Live Templates to use. You can find the template definitions at mraible/idea-live-templates. |
-
Install the Okta CLI and run
okta register
to sign up for a new account. If you already have an account, runokta login
. -
Run
okta apps create spa
. Setoidcdebugger
as an app name and press Enter. -
Use
https://oidcdebugger.com/debug
for the Redirect URI and set the Logout Redirect URI tohttps://oidcdebugger.com
. -
Navigate to the OpenID Connect Debugger website.
-
Fill in your client ID
-
Use
https://{yourOktaDomain}/oauth2/default/v1/authorize
for the Authorize URI -
Select code for the response type and Use PKCE
-
Click Send Request to continue
-
-
Set the access token as a
TOKEN
environment variable in a terminal window.TOKEN=eyJraWQiOiJYa2pXdjMzTDRBYU1ZSzNGM...
-
Create a Helidon app with OAuth 2.0 support:
mvn -U archetype:generate -DinteractiveMode=false \ -DarchetypeGroupId=io.helidon.archetypes \ -DarchetypeArtifactId=helidon-quickstart-mp \ -DarchetypeVersion=3.0.2 \ -DgroupId=com.okta.rest \ -DartifactId=helidon \ -Dpackage=com.okta.rest
TipYou can also install the Helidon’s CLI and run helidon init
. -
Add MicroProfile JWT support in
pom.xml
:<dependency> <groupId>io.helidon.microprofile.jwt</groupId> <artifactId>helidon-microprofile-jwt-auth</artifactId> </dependency>
-
Add a
HelloResource
class that returns the user’s information: [h-hello
]package com.okta.rest.controller; import io.helidon.security.Principal; import io.helidon.security.annotations.Authenticated; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; @Path("/hello") public class HelloResource { @Authenticated @GET public String hello(@Context SecurityContext context) { return "Hello, " + context.userName() + "!"; } }
-
Add a
HelloApplication
class insrc/main/java/com/okta/rest
to register your resource and configure JWT authentication: [h-app
]package com.okta.rest; import com.okta.rest.controller.HelloResource; import org.eclipse.microprofile.auth.LoginConfig; import jakarta.enterprise.context.ApplicationScoped; import jakarta.ws.rs.core.Application; import java.util.Set; @LoginConfig(authMethod = "MP-JWT") @ApplicationScoped public class HelloApplication extends Application { @Override public Set<Class<?>> getClasses() { return Set.of(HelloResource.class); } }
-
Add your Okta endpoints to
src/main/resources/META-INF/microprofile-config.properties
.mp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default mp.jwt.verify.publickey.location=${mp.jwt.verify.issuer}/v1/keys
-
Start your app from your IDE or using a terminal:
mvn package && java -jar ./target/helidon.jar
-
Test your API with an access token.
http :8080/hello Authorization:"Bearer $TOKEN"
-
Run each image three times before recording the numbers, then each command five times
-
Write each time down, add them up, and divide by five for the average. For example:
Helidon: (45 + 44 + 45 + 39 + 43) / 5 = 43.2 Micronaut: (17 + 19 + 19 + 20 + 15) / 5 = 18 Quarkus: (25 + 18 + 20 + 19 + 21) / 5 = 20.6 Spring Boot: (39 + 40 + 38 + 37 + 41) / 5 = 39
Framework | Command executed | Milliseconds to start |
---|---|---|
Helidon |
|
43.2 |
Micronaut |
|
18 |
Quarkus |
|
20.6 |
Spring Boot |
|
39 |
Test the memory usage in MB of each app using the command below. Make sure to send an HTTP request to each one before measuring.
ps -o pid,rss,command | grep --color <executable> | awk '{$2=int($2/1024)"M";}{ print;}'
Substitute <executable>
as follows:
Framework | Executable | Megabytes before request | Megabytes after request | Megabytes after 5 requests |
---|---|---|---|---|
Helidon |
|
79 |
97 |
131 |
Micronaut |
|
43 |
58 |
69 |
Quarkus |
|
37 |
48 |
50 |
Spring Boot |
|
74 |
98 |
99 |
Important
|
If you disagree with these numbers and think X framework should be faster, I encourage you to clone the repo and run these tests yourself. If you get faster startup times for Helidon, do you get faster startup times for Micronaut and Quarkus too? |
⚡️ Create a secure REST API with Helidon: okta start helidon
🚀 Find this example’s code on GitHub: @oktadev/native-java-examples/helidon
👀 Read the blog post: Build REST APIs and Native Java Apps with Helidon