Java REST API Showdown: vilket är det bästa ramverket på marknaden?

att utveckla tjänster i Java, inklusive REST API: er, var inte alltid lätt eller produktivt förrän våren kom och förändrade landskapet. Många år har gått sedan dess, och nya ramar har dykt upp i samhället.

en av dessa ramar var Micronaut. Det är utvecklat av OCI, samma företag bakom Grails, och deras mål är att hjälpa utvecklare att skapa mikrotjänster och serverlösa applikationer.

det finns också Quarkus, en annan ram som blev populär under det senaste året. Utvecklad av RedHat lovar Quarkus att leverera snabb start och mindre minnesanvändning, två vanliga problem när man utvecklar REST-tjänster i Java.

med alla dessa val finns det en mycket viktig fråga att ställa: hur lätt är det att skapa en tjänst med var och en av dessa tre ramar?

i den här handledningen skapar du en säker viloprogram med Spring, Micronaut och Quarkus för att se hur de skiljer sig från varandra och vilken som bäst passar dina behov.

Innehållsförteckning

  • förutsättningar för din Java REST API
    • skapa ett Okta-konto för användarhantering
    • generera Tokens med OpenID Connect Debugger
  • Bygg ett Java REST API med Micronaut
    • utveckla din Java-tjänst
  • Bygg ett Java REST API med Quarkus
  • Bygg ett Java REST API med Quarkus Spring Boot
  • slutliga tankar om REST API: er med Java: micronaut, quarkus och Spring Boot

Om du vill kan du titta på den här handledningen som en screencast.

förutsättningar för din Java REST API

denna handledning använder Maven 3+. Se till att den är installerad och tillgänglig att använda innan du fortsätter. Du kan säkert också använda Gradle, men YMMV.

du ska bygga appar som autentiserar förfrågningar med OAuth 2.0, säkrad av en Okta-applikation. Har du inget okta-konto? Oroa dig inte, det tar mindre än en minut att skapa en ny. Inte bara det, men Okta stöder standarder som JWT, OAuth 2.0 och OIDC. Vi ger stöd för välkända ramar som Java EE, Spring Boot och Spring Security. Heck, vi har även en Maven plugin som automatiserar allt för dig.

det finns inget behov av att återuppfinna hjulet!

skapa ett Okta-konto för användarhantering

öppna din terminal och kör följande kommando:

mvn com.okta:okta-maven-plugin:register

Du kommer att bli ombedd att ange följande information:

  • förnamn
  • efternamn
  • Email
  • företag

När du har svarat på frågorna får du ett e-postmeddelande för att aktivera ditt helt nya konto. När du har aktiverat ditt konto kör du följande kommando:

mvn com.okta:okta-maven-plugin:spring-boot

det här kommandot skapar ett program för dig med auth-kodflöde och Spring Security ’ s redirect URI för Okta.

okta Maven-genererad applikation

för att komma ihåg det bättre kan du skapa samma app manuellt:

  • gå till okta: s utvecklarhemsida och logga in på ditt konto.
  • Klicka på Program > Lägg till ansökan >Web> nästa.

du ser följande skärm:

Okta ny applikation

innan du fortsätter gör du följande ändringar i programmet:

  • logga in omdirigera Uri:
    • http://localhost:8080/login/oauth2/code/okta
    • https://oidcdebugger.com/debug
  • Beviljningstyp tillåten
    • auktoriseringskod
    • Implicit (Hybrid)

den implicita bidragstypen (med ID och åtkomst token tillåten kontrollerad) är nödvändig för att hämta en åtkomsttoken i din webbläsare.

fälten som inte nämns ovan kan behålla sina standardvärden.

När du är klar klickar du på Klar. Din app är klar!

nästa steg är att lära sig att skapa en giltig token med den.

generera Tokens med OpenID Connect Debugger

Okta låter dig hantera dina användare i molnet med hjälp av dess API: er. Det låter dig också säkra dina applikationer med OAuth 2.0 och OpenID Connect (aka, OIDC). OAuth 2.0 tillhandahåller en mekanism för delegerad behörighet vilket innebär att du inte behöver lagra användaruppgifter i din ansökan. Istället kan du delegera det till en OAuth 2.0-leverantör (Okta, i det här fallet). OIDC tillhandahåller ett identitetslager ovanpå OAuth 2.0 och det är därför företag som Okta kallas ”identitetsleverantörer” eller IDP.

Du har registrerat din app med Okta och kan nu generera en token för att få tillgång till den. En av de inloggningsredirektörerurier du registrerade är för OpenID Connect-webbplatsen.

dina förfrågningar kommer att valideras med hjälp av en token. För att generera denna token använder du OpenID Connect Debugger. Denna webbplats ger dig ett enkelt sätt att generera referenser för användarna på din Okta-applikation.

gå till https://oidcdebugger.com och fyll i följande information:

  • Auktorisera URI: https://{yourOktaDomain}/oauth2/default/v1/authorize
  • omdirigera URI: https://oidcdebugger.com/debug
  • klient-ID: {yourOktaClientId}
  • omfattning: openid email profile
  • tillstånd: dev
  • nonce: (behåll standardvärdet)
  • svarstyp: token

du hittar värdet för {yourOktaDomain} I det övre högra hörnet av ditt konto hemsida:

okta hemsida

för att hitta ditt okta-klient-ID följ stegen nedan:

  • gå till program
  • välj Min webbapp
  • Klicka på Allmänt

klient-ID kommer att finnas tillgängligt i avsnittet klientuppgifter:

klientuppgifter

När du har slutfört alla fält klickar du på Skicka förfrågan. Du kommer att omdirigeras till din okta inloggningssida.

När du har autentiserat, kommer du att omdirigeras till OIDC Debugger igen, där du kan se den genererade token:

genererad Token

du använder denna token för att säkert komma åt de tjänster du ska bygga.

Nu när du har ett okta-konto och du vet hur du genererar tokens med din Okta-applikation, låt oss börja jämföra ramarna!

Bygg ett Java REST API med Micronaut

det första steget för att utveckla din Micronaut-tjänst är att ladda ner SDKMAN!. SDKMAN! är ett verktyg för att hantera parallella versioner av flera SDK, som du använder för att installera Micronaut-klienten.

Du kan ladda ner SDKMAN! genom att köra följande kommando:

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

Nu kan du installera Micronaut själv. Kör bara följande kommando i terminalen:

sdk install micronaut

när kommandot är klart har du den senaste Micronaut-versionen tillgänglig på din dator.

du är redo att börja utveckla programmet!

utveckla din Java-tjänst

gå till katalogen du vill skapa din applikation I och kör följande kommando:

mn create-app com.okta.rest.app --build maven

detta kommando skapar ett projekt med grundstrukturen för ett Micronaut-projekt. Micronaut använder Gradle som standard, men eftersom du använder --build maven kommer den att använda Maven istället.

nästa steg är att lägga till säkerhetsbiblioteken i projektet. Redigera filen pom.xml och Lägg till följande beroenden:

<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>

dessa beroenden möjliggör säkerhet – specifikt OAuth 2.0 med JWT – inuti ditt projekt. Nu när du har alla beroenden på plats kan du börja skapa din slutpunkt.

skapa följande klass isrc/main/java/com/okta/rest/controller:

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

@Controlleranteckningen indikerar för Micronaut att denna komponent kommer att få förfrågningar i /hellosökväg.

klassen har bara en metod med namnet hello(). Anteckningen@Get visar att metoden kommer att få HTTP GET-förfrågningar. Du behöver @Produces eftersom Micronauts standardavkastningstyp är ett JSON-objekt. Eftersom du returnerar enkel text måste du uttryckligen definiera denna information i metoden.

den sista anteckningen är @Secured. Det berättar helt enkelt Micronaut att denna metod endast är tillgänglig för autentiserade användare.

Du har nu en styrenhet som är säkrad, men du har inte definierat säkerhetskonfigurationen ännu. Låt oss konfigurera Micronaut för att ansluta till din Okta-applikation.

byt namn påsrc/main/resources/application.yml tillapplication.properties och Lägg till följande säkerhetskonfiguration:

micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys

ersätt {yourOktaDomain}med värdet från ditt okta-konto.

konfigurationen ovan möjliggör säkerhet med OAuth 2.0. Du förklarar att din OAuth 2.0-klient kommer från Okta genom att ange emittenten från din okta-organisation.

du aktiverar också användningen av JSON web tokens eller JWTs. Eftersom du vill läsa informationen från Okta måste du ange var du kan hitta dina Jwks (JSON Web Key Set) för att validera JWT-signaturer.

det är dags att testa din tjänst! Starta din ansökan genom att utföra följande kommando:

./mvnw mn:run

När din app körs, kör följande kommando:

curl -X GET -I http://localhost:8080/hello

kommandot ovan ger ett resultat som liknar det här:

HTTP/1.1 401 UnauthorizedDate: Tue, 8 Jan 2019 15:47:36 GMTtransfer-encoding: chunkedconnection: close

som du kan se gick inte begäran igenom. För att få det att fungera måste du skicka in OAuth 2.0-åtkomsttoken som hämtas av Oidc-felsökaren. Tilldela åtkomsttoken till enTOKEN variabel i ditt skal.

TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

Kör kommandot nedan:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

Nu fungerar det som förväntat! Den här gången får du hälsningsmeddelandet som svar:

Du kan se att Micronaut kräver väldigt lite kod för att skapa ett säkert REST API. Om du räknade kodraderna skulle du upptäcka att ~24% är beroenden i XML (8 rader), Java-koden är bara 22 rader kod och säkerhetskonfigurationen tar 3 rader. Micronauts inbyggda OAuth 2.0-support gör det enkelt att integrera med Okta och de har till och med en Guide för Okta i sin dokumentation.

bra! Låt oss nu se hur du skapar samma app med Quarkus.

Bygg ett Java REST API med Quarkus

för att utveckla din applikation med Quarkus behöver du bara Maven installerat, det krävs inga andra beroenden.

Låt oss börja skapa din app! Gå till katalogen du vill skapa den i och kör följande kommando:

mvn io.quarkus:quarkus-maven-plugin:1.8.1.Final:create \ -DprojectGroupId=com.okta.rest \ -DprojectArtifactId=quarkus \ -DclassName="com.okta.rest.quarkus.HelloResource" \ -Dpath="/hello" \ -Dextensions="jwt"

kommandot ovan skapar ett projekt med Quarkus Maven-plugin. Det kommer att skapa en resurs som heter HelloResource, som kommer att ta emot förfrågningar på sökvägen /hello. Du lägger också till JWT-tillägget från Quarkus på projektet.

När du har skapat projektet, redigerasrc/java/com/okta/rest/quarkus/HelloResource.java och Lägg till användarinformation tillhello() metod:

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

klassen ovan kommer att bete sig på samma sätt som den du skapade i Micronaut. Den läser användarens information baserat på token som genererades i begäran och returnerar ett hälsningsmeddelande till användaren som hittas.

Du har fortfarande inte konfigurerat Quarkus med din emittent och nycklar från Okta, så låt oss göra det.

redigera src/main/resources/application.properties och Lägg till följande kod:

mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default

klar! Quarkus-versionen av din ansökan är redo att testas. Gå till din projektmapp och kör följande kommando:

./mvnw compile quarkus:dev

kommandot ovan startar din ansökan.

det första steget är att se till att du får ett 401 - Unauthorized när du inte använder rätt referenser.

kör följande kommando i terminalen:

curl -X GET -I http://localhost:8080/hello

som förväntat är resultatet ett HTTP 401-svar:

HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0

om du utför samma begäran, inklusive token från Oidc-felsökaren, ska den returnera hälsningsmeddelandet.

kör följande kommando:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

det fungerade som en charm! I mitt fall var resultatet:

Quarkus kräver ännu färre kodrader än Micronaut! Det genererar en app med beroenden ingår, har 25 rader med Java-kod, och endast 2 rader av konfiguration. Ja, kodrader är en dum jämförelse, men det visar också hur dessa ramar kräver mycket lite kod för att utveckla säkra appar.

Två ner, en att gå! Nu när du kunde implementera appen på Micronaut och Quarkus, låt oss avsluta med att skapa samma app med Spring Boot.

Bygg ett Java REST API med Spring Boot

Spring Boot har inga förutsättningar att börja skapa din app, så låt oss börja med att skapa projektet!

öppna din terminal och kör följande kommando:

curl https://start.spring.io/starter.zip -d language=java \ -d bootVersion=2.3.4.RELEASE \ -d dependencies=web,okta \ -d packageName=com.okta.rest \ -d name=spring-boot \ -d type=maven-project \ -o spring-boot.zip

kommandot ovan skapar enspring-boot.zip fil med en Spring Boot-applikation som använder Maven. Du kan extrahera filen till enspring-boot katalog med kommandot nedan.

unzip spring-boot.zip -d spring-boot

nu implementerar du styrenheten som tar emot förfrågningarna.

skapa encom.okta.rest.controller paket och enHelloController klass i den:

package com.okta.rest.controller;import org.springframework.security.core.annotation.AuthenticationPrincipal;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(@AuthenticationPrincipal Principal principal) { return "Hello, " + principal.getName() + "!"; }}

konfigurationen här är mycket lik de andra ramarna. Du kommenterar klassen med @RestController för att låta våren veta att du får förfrågningar om klassen. @GetMappingkommer att få HTTP GET-förfrågningar på/hello sökvägen. För att hämta den autentiserade användaren använder du anteckningen@AuthenticationPrincipal.

Till skillnad från de andra ramarna behöver du inte ange att denna slutpunkt är autentiserad eftersom våren redan kontrollerar denna information från dess konfigurationer.

det sista steget är att lägga till emittentinformationen, så Spring Securitys oidc-stöd kan automatiskt upptäcka de slutpunkter som den behöver kommunicera med.

redigera src/main/resources/applications.properties och Lägg till följande konfiguration:

okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default

låt oss testa det! Starta din Spring Boot-app med Maven.

./mvnw spring-boot:run

Öppna sedan en terminal och kör kommandot nedan:

curl -X GET -I http://localhost:8080/hello

svaret är ett HTTP 401-fel, eftersom du inte inkluderade token:

HTTP/1.1 401Set-Cookie: JSESSIONID=316DCFD55C302A8D69EFD865411DFA77; Path=/; HttpOnlyWWW-Authenticate: BearerX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYContent-Length: 0Date: Thu, 09 Jan 2020 15:46:34 GMT

testa det igen, nu passerar token:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

det fungerade! Som med de andra tjänsterna är resultatet av detta kommando följande:

Spring Boot klockor i minst mängd kod som krävs: 17 rader av Java och endast 1 rad konfiguration! Våren har alltid varit utmärkt för att göra utvecklarens liv enklare, så det kommer inte som någon överraskning.

det är det! Du implementerade ett grundläggande Java REST API i alla tre ramarna!

slutliga tankar om REST API med Java: Micronaut, Quarkus och Spring Boot

När det gäller att utveckla ditt REST API gjorde alla tre ramarna jobbet bra. Med bara lite kod och viss konfiguration kunde du utveckla en säker applikation med Okta och OAuth 2.0.

våren har funnits i många år, den är mycket populär och har många funktioner runt sitt ekosystem. Personligen tror jag fortfarande att det är det bästa alternativet när man programmerar i Java.

Micronaut och Quarkus växer i popularitet och får fart i Java-samhället. Om du står inför prestandaproblem, eller kanske om du värker för en förändring, kan du prova en av dem och se hur det går.

prestanda är den oftast markerade jämförelsepunkten mellan dessa tre ramar. Om du letar efter snabb start i en serverlös miljö, eller möjligheten att skapa inbyggda bilder med GraalVM, kommer Micronaut och Quarkus sannolikt att fungera bra för dig. Bara för skojs skull är starttiderna för var och en av dessa appar följande (baserat på genomsnittet från tre försök):

  • Micronaut: 474ms
  • Quarkus: 1132ms
  • Spring Boot: 1014ms

Jag fick dessa siffror från att köra varje Rams Maven-mål för utveckling.

  • Micronaut: ./mvnw mn:run
  • Quarkus: ./mvnw compile quarkus:dev
  • Vårstart: ./mvnw spring-boot:run

dessa kommandon är inte optimerade för hastighet, så jag förpackade varje applikation med./mvnw package och startade dem medjava -jar.

  • Micronaut: 596ms
  • Quarkus: 658ms
  • Spring Boot: 1878ms

OBS: Dessa siffror beräknades på en 2019 MacBook Pro med en 2.4 GHz 8-Core Intel Core i9 CPU och 64 GB RAM. OpenJDK 15 användes utan JAVA_OPTS inställning.

Om du letar efter ännu snabbare starttider kan du använda GraalVM. I stället för att köra tidstester själv tittade jag på varje projekts dokumentation.

  • Micronaut: 12ms enligt skapa din första Micronaut Graal ansökan.
  • Quarkus: 14ms enligt Quarkus och GraalVM: uppstart av viloläge vid supersonisk hastighet, subatomisk storlek på InfoQ. Quarkus docs listar inte en starttid.
  • Spring Boot: 44ms enligt Spring Graal Native 0.6.0 släppt.

i slutändan kommer du att kunna produktivt utveckla en säker applikation, oavsett vilket val du gör.

Vill du titta på källkoden? Du hittar den på GitHub på okta-java-rest-api-jämförelse-exempel.

Vill du lära dig mer om Java, REST API: er och säkra applikationer? Här är några andra inlägg från vår blogg som du kan hitta användbara:

  • titta på GraalVM förvandla din Java till binärer
  • OAuth 2.0 Java Guide: säkra din App på 5 minuter
  • Java Microservices med Spring Boot och Spring Cloud
  • hur man utvecklar en Quarkus-App med Java och OIDC-autentisering
  • enkel autentisering med Spring Security

för fler inlägg som den här, följ @oktadev på Twitter. Vi publicerar också regelbundet screencasts till vår YouTube-kanal!

Changelog:

  • 23 september 2020: uppgraderad till Micronaut 2.0.2, Quarkus 1.8.1 och Spring Boot 2.3.4. Se kodändringarna i exempelappen på GitHub. Ändringar i det här inlägget kan ses i oktadeveloper / okta-blogg # 423.
  • 21 maj 2020: tillagda starttider för java -jar och kör med GraalVM. Ändringar i den här artikeln kan ses i oktadeveloper / okta-blogg # 304.
  • 20 maj 2020: uppgraderad till Micronaut 1.3.5, Quarkus 1.4.2 och Spring Boot 2.3.0. Se kodändringarna i exempelappen på GitHub. Ändringar i den här artikeln kan ses i oktadeveloper / okta-blogg # 301.
  • Jan 30, 2020: uppdaterad för att optimera Micronaut baserat på feedback från Micronaut-teamet. Också omräknade starttider baserat på i genomsnitt tre försök. Se kodändringarna i exempelappen på GitHub. Ändringar i den här artikeln kan ses i oktadeveloper / okta-blogg # 176.

Related Posts

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *