Use Spring Boot! No, use Micronaut!! Nooooo, Quarkus is the best!!! What about Helidon?
There are a lot of developers praising the hottest, and fastest, Java REST frameworks: Micronaut, Quarkus, Spring Boot, and Helidon. In this session, you'll learn how to do the following with each framework:
✅ Build a REST API
✅ Secure your API with OAuth 2.0
✅ Optimize for production with Docker and GraalVM
I'll also share some performance numbers and pretty graphs to compare community metrics.
Related blog post: https://developer.okta.com/blog/2021/06/18/native-java-framework-comparison
Helidon companion post: https://developer.okta.com/blog/2022/01/06/native-java-helidon
GitHub repo: https://github.com/oktadev/native-java-examples
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Comparing Native Java REST API Frameworks - Devoxx France 2022
1. Matt Raible | @mraible
April 21, 2022
Native Java REST API Comparison
Micronaut, Quarkus,
Spring Boot, and Helidon
Photo by Trish McGinity
https://www.mcginityphoto.com/Portfolio/TravelandLeisure/France/i-V4VqtL5
2. @mraible
Who is Matt Raible?
Father, Husband, Skier, Mountain
Biker, Whitewater Rafter
Bus Lover
Web Developer and Java Champion
Okta Developer Advocate
Blogger on raibledesigns.com and
developer.okta.com/blog
@mraible
7. @mraible
Today’s Agenda
Why Java?
Build { REST, GraphQL } APIs with Java
Secure your APIs with OAuth 2.1
Build with Docker
Go Native with GraalVM
https://unsplash.com/photos/JsTmUnHdVYQ
8. @mraible
Why Java?
25+ Years
of use, abuse, and improvements
Open Source
code is available; many popular open source
frameworks and tools
Hugely Popular and widely used
by many enterprises and web-scale companies
9. @mraible
Download the Oracle builds of OpenJDK
https://jdk.java.net/18
Or Eclipse builds from Adoptium
https://adoptium.net
Get Started with Java 18
10. @mraible
Get Started with Java 18
Better yet, use SDKMAN!
curl -s https://get.sdkman.io | bash
sdk install java 18-open
24. @mraible
Get Started with Quarkus
mvn io.quarkus:quarkus-maven-plugin:2.8.1.Final:create
-DprojectGroupId=com.okta.rest
-DprojectArtifactId=quarkus
-DclassName="com.okta.rest.quarkus.HelloResource"
-Dpath="/hello"
-Dextensions="smallrye-jwt,resteasy-reactive"
32. @mraible
Get Started with Spring Boot
http https://start.spring.io/starter.zip
dependencies==web,oauth2-resource-server,native
packageName==com.okta.rest
name==spring-boot
type==maven-project
baseDir==spring-boot | tar -xzvf -
36. Spring Security OAuth 2.0 Resource Server
https://docs.spring.io/spring-security/reference/servlet/oauth2/resource-server
okta.oauth2.issuer=https://dev-133337.okta.com/
oauth2/default
37. Test Spring Boot with HTTPie
https://httpie.org
mvn spring-boot:run
http :8080/hello
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
http :8080/hello Authorization:"Bearer $TOKEN"
47. @mraible
What about GraphQL APIs?
Why GraphQL?
Does your favorite framework support GraphQL?
Micronaut
https://micronaut-projects.github.io/micronaut-graphql/latest/guide
Quarkus
https://quarkus.io/guides/smallrye-graphql
Spring Boot
https://spring.io/projects/spring-graphql
Helidon
https://helidon.io/docs/v2/#/mp/graphql/01_mp_graphql
48. @mraible
Secure your API with OAuth 2.0
https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1
49. @mraible
Secure your API with OAuth 2.1
https://oauth.net/2.1
PKCE is required for all clients using the authorization code flow
Redirect URIs must be compared using exact string matching
The Implicit grant is omitted from this specification
The Resource Owner Password Credentials grant is omitted from this specification
Bearer token usage omits the use of bearer tokens in the query string of URIs
Refresh tokens for public clients must either be sender-constrained or one-time use
50. @mraible
Authenticate with OpenID Connect (OIDC)
What is OpenID Connect?
Does your favorite framework support OIDC authentication?
Micronaut
https://guides.micronaut.io/latest/micronaut-oauth2-okta.html
Quarkus
https://quarkus.io/guides/security-openid-connect-web-authentication
Spring Boot
https://docs.spring.io/spring-security/reference/servlet/oauth2/login
Helidon
https://helidon.io/docs/v2/#/mp/security/02_providers#_oidc_provider
54. @mraible
Build with Docker: Jib
Get Jibby with it!
mvn verify jib:build
Or build directly to your Docker daemon
mvn verify jib:dockerBuild
https://github.com/GoogleContainerTools/jib
55. @mraible
Build with Docker
Micronaut uses Jib, but you must configure plugins
Quarkus generates four Docker-related files
Dockerfile.jvm
Dockerfile.legacy-jar
Dockerfile.native
Dockerfile.native-micro
Quarkus + Jib
mvn quarkus:add-extension -Dextensions="container-image-jib"
56. @mraible
Build with Docker
Spring Boot 2.3+ has built-in support
mvn spring-boot:build-image
Uses layered JARs for faster builds
dependencies
snapshot-dependencies
resources
application
https://spring.io/blog/2020/01/27/creating-docker-images-with-spring-boot-2-3-0-m1
58. @mraible
Use Micronaut CLI
mn create-app ...
mvn package -Dpackaging=native-image
gradle nativeImage
gradle dockerBuildNative
Go Native with GraalVM and Micronaut
https://docs.micronaut.io/latest/guide/#graal
59. @mraible
Go Native with GraalVM and Quarkus
Create an executable without GraalVM installed
mvn package -Pnative -Dquarkus.native.container-build=true
Then, build the image
docker build -f src/main/docker/Dockerfile.native -t
<tag-name> .
And run it
docker run -it -p8080:8080 <tag-name>
https://quarkus.io/guides/building-native-image
60. @mraible
Use start.spring.io to get plugins and profiles
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>${repackage.classifier}</classifier>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</version>
<executions>
Go Native with GraalVM and Spring Boot
61. @mraible
Go Native with GraalVM and Spring Boot
Add milestone repositories to your pom.xml
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
62. @mraible
Go Native with GraalVM and Spring Boot
Add Spring Native dependency
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.11.4</version>
</dependency>
Build the native application
mvn spring-boot:build-image
64. @mraible
Build the image
docker build -f Dockerfile.native -t <tag-name> .
And run it
docker run --rm -p8080:8080 <tag-name>
Go Native with GraalVM and Helidon
80. What about M1 Max?
https://twitter.com/mraible/status/1509371877348843525
81. @mraible
🏆 Quarkus provides the best DevEx, startup time, and memory usage
🚀 Micronaut is the easiest to use and has been since the beginning
🌱 Spring Boot has the strongest community, ecosystem, and growth
🔮 Helidon still has some catching up to do but has made great progress
⚡ Spring 6 could be a game changer
My Thoughts
82. @mraible
Action!
New to Java? Try Spring Boot
Know Spring? Trial migration paths
Testing is important, invest early and often
Design your apps with security in mind
Use OpenID Connect and OAuth 2.1
https://unsplash.com/photos/JsTmUnHdVYQ