Use Spring Boot! No, use Micronaut!! Nooooo, Quarkus is the best!!!
There's a lot of developers praising the hottest, and fastest, Java REST frameworks: Micronaut, Quarkus, and Spring Boot. 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
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
Java REST API Framework Comparison - UberConf 2021
1. Matt Raible | @mraible
October 8, 2021
Java REST API Comparison
Micronaut, Quarkus, and
Spring Boot
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
3.
4.
5.
6. @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
7. @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
8. @mraible
Download the JDK from OpenJDK
https://jdk.java.net/17
Or from Adoptium
https://adoptium.net
Get Started with Java 17
9. @mraible
Get Started with Java 17
Better yet, use SDKMAN!
curl -s https://get.sdkman.io | bash
sdk install java 17-open
21. @mraible
Get Started with Quarkus
mvn io.quarkus:quarkus-maven-plugin:2.3.0.Final:create
-DprojectGroupId=com.okta.rest
-DprojectArtifactId=quarkus
-DclassName="com.okta.rest.quarkus.HelloResource"
-Dpath="/hello"
-Dextensions="smallrye-jwt,resteasy-reactive"
29. @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 -
32. Spring Security OAuth 2.0 Resource Server
https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2resourceserver
okta.oauth2.issuer=https://dev-133337.okta.com/
oauth2/default
33. Test Spring Boot with HTTPie
https://httpie.org
mvn spring-boot:run
http :8080/hello
TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...
http :8080/hello Authorization:"Bearer $TOKEN"
36. @mraible
Build GraphQL APIs with Java
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
37. @mraible
Secure your API with OAuth 2.0
https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1
38. @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
39. @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/site/docs/current/reference/html5/#oauth2login
43. @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
44. @mraible
Build with Docker
Micronaut uses Jib, but you must configure plugins
Quarkus generates three Docker-related files
Dockerfile.jvm
Dockerfile.legacy-jar
Dockerfile.native
Dockerfile.native-distroless
Quarkus + Jib
mvn quarkus:add-extension -Dextensions="container-image-jib"
45. @mraible
Build with Docker
Spring Boot 2.3+ has built-in support
mvn spring-boot:build-image
Uses layered JARs for 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
46. @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
47. @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
48. @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
49. @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>
50. @mraible
Go Native with GraalVM and Spring Boot
Add Spring Native dependency
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>0.10.4</version>
</dependency>
Build the native application
mvn spring-boot:build-image