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

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

    View Slide

  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

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. developer.okta.com

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  10. @mraible
    Get Started with Java 17
    Better yet, use SDKMAN!


    curl -s https://get.sdkman.io | bash

    sdk install java 17-open

    View Slide

  11. Java Releases and Features

    View Slide

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

    View Slide

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

    View Slide

  14. @mraible
    sdk install micronaut


    mn create-app com.okta.rest.app \


    -b maven -f security-jwt
    Get Started with Micronaut

    View Slide

  15. https://micronaut.io/launch

    View Slide

  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() + "!";


    }


    }

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  20. Test Micronaut with HTTPie
    https://httpie.org
    mvn mn:run


    http :8080/hello


    TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...


    http :8080/hello Authorization:"Bearer $TOKEN"


    View Slide

  21. Verify Micronaut API with HTTPie

    View Slide

  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"

    View Slide

  23. https://code.quarkus.io

    View Slide

  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() + "!";


    }


    }

    View Slide

  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

    View Slide

  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

    View Slide

  27. View Slide

  28. Test Quarkus with HTTPie
    https://httpie.org
    mvn quarkus:dev


    http :8080/hello


    TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...


    http :8080/hello Authorization:"Bearer $TOKEN"


    View Slide

  29. Verify Quarkus API with HTTPie

    View Slide

  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 -

    View Slide

  31. https://start.spring.io

    View Slide

  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() + "!";


    }


    }

    View Slide

  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

    View Slide

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


    http :8080/hello


    TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...


    http :8080/hello Authorization:"Bearer $TOKEN"


    View Slide

  35. Verify Spring Boot API with HTTPie

    View Slide

  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)

    View Slide

  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

    View Slide

  38. @mraible
    Secure your API with OAuth 2.0
    https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1

    View Slide

  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

    View Slide

  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

    View Slide

  41. What about testing?

    View Slide

  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"]

    View Slide

  43. @mraible
    Build with Docker
    Build your image


    docker build -t .


    Run your image


    docker run -it -p8080:8080

    View Slide

  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

    View Slide

  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"


    View Slide

  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

    View Slide

  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

    View Slide

  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 \


    .


    And run it


    docker run -it -p8080:8080
    https://quarkus.io/guides/building-native-image

    View Slide

  49. @mraible
    Use start.spring.io to get plugins and profiles





    org.springframework.boot


    spring-boot-maven-plugin





    ${repackage.classifier}





    paketobuildpacks/builder:tiny





    true

















    org.springframework.experimental


    spring-aot-maven-plugin


    ${spring-native.version}



    Go Native with GraalVM and Spring Boot

    View Slide

  50. @mraible
    Go Native with GraalVM and Spring Boot
    Add milestone repositories to your pom.xml








    spring-milestones


    Spring Milestones


    https://repo.spring.io/milestone














    spring-milestones


    Spring Milestones


    https://repo.spring.io/milestone






    View Slide

  51. @mraible
    Go Native with GraalVM and Spring Boot
    Add Spring Native dependency





    org.springframework.experimental


    spring-native


    0.11.0-RC1





    Build the native application


    mvn spring-boot:build-image


    View Slide

  52. @mraible
    How we fixed the Okta Spring Boot Starter
    https://youtu.be/8vY-9tXlCW4

    View Slide

  53. @mraible
    Native Startup Performance
    Milliseconds
    0
    25
    50
    75
    100
    December 2, 2021
    61.8
    18.4
    19.8
    Micronaut Quarkus Spring Boot

    View Slide

  54. @mraible
    Native Memory Used (MB)
    Milliseconds
    0
    25
    50
    75
    100
    December 2, 2021
    58
    32
    78
    Micronaut Quarkus Spring Boot

    View Slide

  55. @mraible
    Tests Run on a 2019 MacBook Pro

    View Slide

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

    View Slide

  57. Community

    View Slide

  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

    View Slide

  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

    View Slide

  60. star-history.t9t.io/#micronaut-projects/micronaut-core&quarkusio/quarkus&spring-projects/spring-boot
    GitHub Star Growth

    View Slide

  61. @mraible
    Jobs on Indeed (US)
    0
    3250
    6500
    9750
    13000
    December 3, 2021
    11,333
    198
    166
    Micronaut Quarkus Spring Boot

    View Slide

  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

    View Slide

  63. Hot Web Frameworks https://hotframeworks.com

    View Slide

  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

    View Slide

  65. https://developer.okta.com/blog/2021/01/20/reactive-java-microservices

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  69. @mraible
    Action!

    View Slide

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


    @oktadev

    View Slide

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

    View Slide

  72. Thanks!


    Keep in Touch


    raibledesigns.com


    @mraible


    Presentations


    speakerdeck.com/mraible


    Code


    github.com/oktadev
    developer.okta.com

    View Slide

  73. developer.okta.com

    View Slide