Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java REST API Framework Comparison - PWX 2021

Java REST API Framework Comparison - PWX 2021

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
GitHub repo: https://github.com/oktadev/native-java-examples

72a2082c6a4dd79ad68befb3db911616?s=128

Matt Raible
PRO

December 07, 2021
Tweet

More Decks by Matt Raible

Other Decks in Programming

Transcript

  1. Matt Raible | @mraible December 7, 2021 Java REST API

    Comparison Micronaut, Quarkus, and Spring Boot Photo by Evi T. on Unsplash
  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. None
  4. None
  5. None
  6. developer.okta.com

  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/17 Or Eclipse

    builds from Adoptium https://adoptium.net Get Started with Java 17
  10. @mraible Get Started with Java 17 Better yet, use SDKMAN!

    curl -s https://get.sdkman.io | bash 
 sdk install java 17-open
  11. Java Releases and Features

  12. https://developer.okta.com/blog/2020/01/09/java-rest-api-showdown Build REST APIs with Java

  13. Serverless 💵 💸 https://unsplash.com/photos/glRqyWJgUeY

  14. @mraible sdk install micronaut mn create-app com.okta.rest.app \ -b maven

    -f security-jwt Get Started with Micronaut
  15. https://micronaut.io/launch

  16. 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() + "!"; } }
  17. micronaut.security.enabled=true micronaut.security.token.jwt.enabled=true micronaut.security.token.jwt.signatures.jwks.okta.url= https://dev-133337.okta.com/oauth2/default/v1/keys Micronaut JWT Security

  18. micronaut.security.enabled=true micronaut.security.token.jwt.enabled=true micronaut.security.token.jwt.signatures.jwks.okta.url= https://dev-133337.okta.com/oauth2/default/v1/keys Micronaut JWT Security https://micronaut-projects.github.io/micronaut-security/latest/guide/#jwt

  19. Install HTTPie (a better cURL) $ <tool> install httpie https://httpie.org

  20. Test Micronaut with HTTPie https://httpie.org mvn mn:run http :8080/hello TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

    http :8080/hello Authorization:"Bearer $TOKEN"
  21. Verify Micronaut API with HTTPie

  22. @mraible Get Started with Quarkus mvn io.quarkus:quarkus-maven-plugin:2.5.1.Final:create \ -DprojectGroupId=com.okta.rest \

    -DprojectArtifactId=quarkus \ -DclassName="com.okta.rest.quarkus.HelloResource" \ -Dpath="/hello" \ -Dextensions="smallrye-jwt,resteasy-reactive"
  23. https://code.quarkus.io

  24. 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 @Path("/") @Authenticated @Produces(MediaType.TEXT_PLAIN) public String hello(@Context SecurityContext context) { Principal userPrincipal = context.getUserPrincipal(); return "Hello, " + userPrincipal.getName() + "!"; } }
  25. mp.jwt.verify.publickey.location= https://dev-133337.okta.com/ oauth2/default/v1/keys mp.jwt.verify.issuer=https:// dev-133337.okta.com/oauth2/ default MicroProfile JWT Security https://www.eclipse.org/community/eclipse_newsletter/2017/september/article2.php

  26. mp.jwt.verify.publickey.location= https://dev-133337.okta.com/ oauth2/default/v1/keys mp.jwt.verify.issuer=https:// dev-133337.okta.com/oauth2/ default MicroProfile JWT Security https://www.eclipse.org/community/eclipse_newsletter/2017/september/article2.php

  27. None
  28. Test Quarkus with HTTPie https://httpie.org mvn quarkus:dev http :8080/hello TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

    http :8080/hello Authorization:"Bearer $TOKEN"
  29. Verify Quarkus API with HTTPie

  30. @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 -
  31. https://start.spring.io

  32. package com.okta.rest.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.security.Principal; @RestController public

    class HelloController { @GetMapping("/hello") public String hello(Principal principal) { return "Hello, " + principal.getName() + "!"; } }
  33. 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

  34. Test Spring Boot with HTTPie https://httpie.org mvn spring-boot:run http :8080/hello

    TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN... http :8080/hello Authorization:"Bearer $TOKEN"
  35. Verify Spring Boot API with HTTPie

  36. @mraible Startup Performance Milliseconds 0 750 1500 2250 3000 Micronaut

    Quarkus Spring Boot 1,497 568 573 1,122 1,918 456 Dev Startup (mvn) Packaged Startup (java -jar)
  37. @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
  38. @mraible Secure your API with OAuth 2.0 https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1

  39. @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
  40. @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
  41. What about testing?

  42. @mraible Build with Docker Create a Dockerfile 
 FROM openjdk:17-alpine

    ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
  43. @mraible Build with Docker Build your image docker build -t

    <tag-name> . Run your image docker run -it -p8080:8080 <tag-name>
  44. @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
  45. @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-distroless Quarkus + Jib mvn quarkus:add-extension -Dextensions="container-image-jib"
  46. @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
  47. @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
  48. @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
  49. @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
  50. @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>
  51. @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.0-RC1</version> </dependency> Build the native application mvn spring-boot:build-image
  52. @mraible How we fixed the Okta Spring Boot Starter https://youtu.be/8vY-9tXlCW4

  53. @mraible Native Startup Performance Milliseconds 0 25 50 75 100

    December 2, 2021 61.8 18.4 19.8 Micronaut Quarkus Spring Boot
  54. @mraible Native Memory Used (MB) Milliseconds 0 25 50 75

    100 December 2, 2021 58 32 78 Micronaut Quarkus Spring Boot
  55. @mraible Tests Run on a 2019 MacBook Pro

  56. @mraible Demo Time! https://github.com/oktadev/native-java-examples

  57. Community

  58. @mraible Stack Overflow Tags 0 32500 65000 97500 130000 December

    2, 2021 61 114,122 2,171 1,242 Micronaut Quarkus Spring Boot Helidon
  59. @mraible GitHub Stars 0 18750 37500 56250 75000 December 3,

    2021 2,500 58,500 8,900 5,100 Micronaut Quarkus Spring Boot Helidon
  60. star-history.t9t.io/#micronaut-projects/micronaut-core&quarkusio/quarkus&spring-projects/spring-boot GitHub Star Growth

  61. @mraible Jobs on Indeed (US) 0 3250 6500 9750 13000

    December 3, 2021 11,333 198 166 Micronaut Quarkus Spring Boot
  62. @mraible Twitter Followers 0 25000 50000 75000 100000 December 3,

    2021 3,322 80,200 13,100 10,900 Micronaut Quarkus Spring Boot Helidon
  63. Hot Web Frameworks https://hotframeworks.com

  64. @mraible JHipster Support 🤓 Micronaut Blueprint - github.com/jhipster/generator-jhipster-micronaut - v1.0.2,

    18 releases, 16 contributors, 382 commits // TODO: Micronaut 3, Reactive, Microservices, GraalVM native images Quarkus Blueprint - github.com/jhipster/generator-jhipster-quarkus - v2.0.0-beta.1, 6 releases, 16 contributors, 550 commits // TODO: Quarkus 2.3, Dev Services, Reactive, Microservices
  65. https://developer.okta.com/blog/2021/01/20/reactive-java-microservices

  66. https://developer.okta.com/blog/2020/08/17/micronaut-jhipster-heroku

  67. https://developer.okta.com/blog/2021/03/08/jhipster-quarkus-oidc

  68. Summary of latest update https://twitter.com/mraible/status/1466812781454368778

  69. @mraible Action!

  70. developer.okta.com/blog/tags/java @oktadev

  71. git clone https://github.com/oktadeveloper/okta-spring-webflux-react- example.git https://github.com/oktadev/native-java-examples Use the Source, Luke!

  72. Thanks! Keep in Touch raibledesigns.com @mraible Presentations speakerdeck.com/mraible Code github.com/oktadev

    developer.okta.com
  73. developer.okta.com