Launch a Java REST API with Micronaut
In this tutorial, I’ll show you how to create a secure REST API and native image with Micronaut. 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 Quarkus, Spring Boot, and Helidon.
This tutorial is also available as a screencast.
Prerequisites:
-
SDKMAN (for Java 17 with GraalVM)
-
HTTPie (a better version of cURL)
-
An Okta Developer Account (or the Okta CLI)
The brackets at the end of some steps indicate the IntelliJ Live Templates I used in the video. You can find the template definitions at mraible/idea-live-templates. |
Install a JDK with GraalVM
Use SDKMAN to install Java 17 with GraalVM
sdk install java 22.1.0.r17-grl
Generate an OAuth 2.0 access token
-
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...
Make a Micronaut Java REST API
-
Use SDKMAN to install Micronaut’s CLI and create an app:
sdk install micronaut mn create-app com.okta.rest.app --build maven -f security-jwt -f micronaut-aot mv app micronaut
-
Create
controller/HelloController.java
: [mn-hello
]package com.okta.rest.controller; import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; import java.security.Principal; @Controller("/hello") public class HelloController { @Get @Secured(SecurityRule.IS_AUTHENTICATED) @Produces(MediaType.TEXT_PLAIN) public String hello(Principal principal) { return "Hello, " + principal.getName() + "!"; } }
-
Enable and configure JWT security in
src/main/resources/application.yml
: [mn-security-config
]micronaut: ... security: enabled: true token: jwt: enabled: true claims-validators: issuer: https://{yourOktaDomain}/oauth2/default signatures: jwks: okta: url: https://{yourOktaDomain}/oauth2/default/v1/keys
Run and test your Micronaut REST API with HTTPie
-
Start your app:
./mvnw mn:run
-
Use HTTPie to pass the JWT in as a bearer token in the
Authorization
header:http :8080/hello Authorization:"Bearer $TOKEN"
You should get a 200 response with your email in it.
Build a Native Micronaut App
-
Compile your Micronaut app into a native binary:
./mvnw clean package -Dpackaging=native-image
-
Start your Micronaut app:
./target/app
-
Test it with HTTPie and an access token:
http :8080/hello Authorization:"Bearer $TOKEN"
Startup time comparison
I compared startup times between frameworks by running each image three times before recording the numbers. Then, I ran each app five more times and averaged the results. I gathered these numbers on a 2019 MacBook Pro with an SSD, 2.4 GHz 8-Core Intel Core i9 processor, and 64 GB of RAM.
Versions used: Quarkus 2.9.0, Micronaut 3.4.3, Helidon 2.5.0, and Spring Boot 2.6.7 with Spring Native 0.11.5.
Memory usage comparison
I tested the memory usage (in megabytes) of each app using the command below. I ran it right after I started the app, after a single authenticated request, and after five authenticated requests.
ps -o pid,rss,command | grep --color <executable> | awk '{$2=int($2/1024)"M";}{ print;}'
The chart below shows the memory usage after five requests.
Comparing Native Java REST API Frameworks Live Stream
I missed Devoxx France this year, but I’m still doing my presentation! I’ll be live-streaming Comparing Native Java REST API Frameworks on June 7, 2022 at 6:00 MDT (14:00 CEST). Join me or watch the recorded version below!
Secure Native Java with Micronaut FTW!
⚡️ Create a secure REST API with Micronaut: okta start micronaut
🚀 Find this example’s code on GitHub: @oktadev/native-java-examples/micronaut
👀 Related blog post: Build Native Java Apps with Micronaut, Quarkus, and Spring Boot
Okta Developer Blog Comment Policy
We welcome relevant and respectful comments. Off-topic comments may be removed.