Java REST API Showdown: který je nejlepší rámec na trhu?

vývoj služeb v Javě, včetně REST API, nebyl vždy snadný nebo produktivní, dokud nepřišlo jaro a nezměnilo krajinu. Od té doby uplynulo mnoho let a v komunitě se objevily nové rámce.

jedním z těchto rámců byl Micronaut. Je vyvinut OCI, stejnou společností za Grails, a jejich cílem je pomoci vývojářům vytvářet microservices a serverless aplikací.

existuje také Quarkus, další rámec, který získal popularitu za poslední rok. Vyvinutý společností RedHat, Quarkus slibuje rychlé spuštění a menší využití paměti, dva běžné problémy při vývoji služeb REST v Javě.

se všemi těmito možnostmi je velmi důležitá otázka: jak snadné je vytvořit službu s každým z těchto tří rámců?

V tomto kurzu, budete vytvořit bezpečné ZBYTEK aplikace pomocí Jaře, Micronaut, a Quarkus vidět, jak se liší jeden od druhého, a který z nich nejlépe vyhovuje vašim potřebám.

Obsah

  • Předpoklady pro Vaše Java REST API
    • Vytvořit Okta Účet pro Správu Uživatelů
    • Generovat Tokeny Pomocí OpenID Připojit Ladicí program
  • Build Java REST API s Micronaut
    • Rozvíjet Vaše Java Služby
  • Vybudovat Java REST API s Quarkus
  • Build Java REST API s Jarní Boot
  • Poslední Myšlenky na REST Api S Javou: Micronaut, Quarkus, a na Jaře Boot

Pokud chcete, můžete sledovat tento návod jako videoukázky. 👇

předpoklady pro Java REST API

tento tutoriál používá Maven 3+. Před pokračováním se ujistěte, že je nainstalován a je k dispozici k použití. Určitě můžete také použít Gradle, ale YMMV.

budete vytvářet aplikace, které ověřují požadavky pomocí OAuth 2.0, zabezpečené aplikací Okta. Nemáte účet Okta? Nebojte se, vytvoření nového trvá méně než minutu. Nejen to, ale Okta podporuje standardy jako JWT, OAuth 2.0 a OIDC. Poskytujeme podporu pro známé rámce, jako je Java EE, Spring Boot a Spring Security. Sakra, máme dokonce plugin Maven, který automatizuje vše pro vás.

není třeba znovu objevovat kolo!

Vytvořit Okta Účet pro Správu Uživatelů

Otevřít terminál a spusťte následující příkaz:

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

Budete vyzváni k zadání následujících informací:

  • jméno
  • příjmení
  • E-mail
  • společnost

jakmile odpovíte na otázky, obdržíte e-mail pro aktivaci zcela nového účtu. Po aktivaci vašeho účtu, spusťte následující příkaz:

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

Tento příkaz vytvoří aplikaci pro vás s auth code flow a Spring Security přesměrování URI pro Okta.

Okta Maven generované aplikace

Chcete-li si to lépe zapamatovat, můžete vytvořit stejnou aplikaci ručně:

  • přejděte na domovskou stránku vývojáře Okta a přihlaste se ke svému účtu.
  • klikněte na aplikace > přidat aplikaci > Web > další.

zobrazí se následující displej:

Okta nové aplikace

Než budete pokračovat, proveďte následující změny v aplikaci:

  • Přihlášení přesměrování Uri:
    • http://localhost:8080/login/oauth2/code/okta
    • https://oidcdebugger.com/debug
  • typ Grantu povoleno
    • Autorizační Kód
    • Implicitní (Hybridní)

implicitní typ grantu (s ID a Přístupový Token povoleno zaškrtnuto) je nutné získat přístupový token ve vašem prohlížeči.

pole, která nejsou uvedena výše, si mohou ponechat své výchozí hodnoty.

po dokončení klikněte na Hotovo. Vaše aplikace je připravena!

dalším krokem je naučit se generovat platný token pomocí něj.

generování tokenů pomocí OpenID Connect Debugger

Okta umožňuje spravovat své uživatele v cloudu pomocí jeho API. To také umožňuje zabezpečit své aplikace pomocí OAuth 2.0 a OpenID Connect (aka, OIDC). OAuth 2.0 poskytuje mechanismus pro delegovanou autorizaci, což znamená, že nemusíte ukládat přihlašovací údaje uživatele do aplikace. Místo toho to můžete delegovat na poskytovatele OAuth 2.0 (v tomto případě Okta). OIDC poskytuje vrstvu identity nad OAuth 2.0, a proto se společnosti jako Okta nazývají „poskytovatelé identity“ nebo IDP.

svou aplikaci jste zaregistrovali u Okta a nyní můžete vygenerovat token, abyste k ní získali přístup. Jeden z uri přesměrování přihlášení, který jste zaregistrovali, je pro web OpenID Connect.

vaše požadavky budou ověřeny pomocí tokenu. Chcete-li vygenerovat tento token, použijete Debugger OpenID Connect. Tato webová stránka vám poskytne snadný způsob, jak generovat přihlašovací údaje pro uživatele v aplikaci Okta.

Jděte na https://oidcdebugger.com a vyplňte následující informace:

  • Povolit URI: https://{yourOktaDomain}/oauth2/default/v1/authorize
  • Přesměrování URI: https://oidcdebugger.com/debug
  • Klient ID: {yourOktaClientId}
  • Rozsah: openid email profile
  • Stát: dev
  • Nonce: (ponecháme výchozí hodnotu)
  • Reakce typu: token

můžete najít hodnotu pro {yourOktaDomain} v pravém horním rohu vašeho účtu stránky:

Okta Domovskou stránku

najít Okta ID Klienta postupujte podle následujících kroků:

  • Aplikace
  • Zvolte možnost Mé Webové Aplikace
  • Klepněte na položku Obecné

ID Klienta bude k dispozici v Klientovi Pověření sekce:

Pověření Klienta

Po dokončení všech polí, klepněte na tlačítko Odeslat Žádost. Budete přesměrováni na svou přihlašovací stránku Okta.

po úspěšné autentizaci budete znovu přesměrováni na Oidc Debugger, kde můžete vidět vygenerovaný token:

generovaný Token

tento token použijete k bezpečnému přístupu ke službám, které chcete vytvořit.

Nyní, když máte účet Okta a víte, jak generovat tokeny pomocí aplikace Okta, začněme porovnávat rámce!

Vytvořte Java REST API s Micronaut

prvním krokem k rozvoji služby Micronaut je stažení SDKMAN!. SDKMANE! je nástroj pro správu paralelních verzí více SDK, které budete používat k instalaci klienta Micronaut.

zde si můžete stáhnout SDKMAN! spuštěním následujícího příkazu:

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

Nyní můžete nainstalovat Micronaut sám. Stačí spustit následující příkaz v terminálu:

sdk install micronaut

Po příkazu dokončí provádění, budete mít nejnovější Micronaut verze je k dispozici na vašem počítači.

jste připraveni začít vyvíjet aplikaci!

Vytvořte službu Java

přejděte do adresáře, ve kterém chcete vytvořit aplikaci, a proveďte následující příkaz:

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

Tento příkaz vytvoří projekt s základní struktura Micronaut projektu. Micronaut používá Gradle ve výchozím nastavení, ale protože používáte --build maven, použije místo toho Maven.

dalším krokem je přidání bezpečnostních knihoven uvnitř projektu. Upravit pom.xml soubor a přidejte následující závislosti:

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

Tyto závislosti umožní zabezpečení – konkrétně OAuth 2.0 s JWT – uvnitř vašeho projektu. Nyní, když máte všechny závislosti na místě, můžete začít vytvářet koncový bod.

Vytvořte následující třídy v src/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() + "!"; }}

@Controller anotace naznačuje, Micronaut, že tato složka bude přijímat žádosti v /hello cestu.

třída má pouze jednu metodu s názvem hello()@Get anotace ukazuje, že metoda obdrží požadavky HTTP GET. Potřebujete @Produces protože výchozí typ návratu Micronautu je objekt JSON. Protože vracíte jednoduchý text, musíte tyto informace v metodě explicitně definovat.

Poslední anotace je @Secured. Jednoduše řekne Micronautovi, že tato metoda je přístupná pouze ověřeným uživatelům.

nyní máte řadič, který je zabezpečen, ale ještě jste nedefinovali konfiguraci zabezpečení. Pojďme nakonfigurovat Micronaut pro připojení k aplikaci Okta.

Přejmenovat src/main/resources/application.ymlapplication.properties a přidejte následující nastavení zabezpečení:

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

Nahradit {yourOktaDomain} s hodnotou z vašeho Okta účet.

výše uvedená konfigurace umožňuje zabezpečení pomocí OAuth 2.0. Prohlašujete, že váš klient OAuth 2.0 pochází z Okta, zadáním emitenta z vaší organizace Okta.

také povolujete používání webových tokenů JSON nebo JWTs. Protože si chcete přečíst informace z Okta, musíte prohlásit, kde najdete své jwks (JSON Web Key Set) pro ověření podpisů JWT.

je čas vyzkoušet své služby! Spusťte aplikaci spuštěním následujícího příkazu:

./mvnw mn:run

S vaše aplikace spuštěna, spusťte následující příkaz:

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

výše uvedený příkaz bude produkovat výsledek podobný tomuto:

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

Jak můžete vidět, žádost neprošla. Aby to fungovalo, musíte předat přístupový token OAuth 2.0 získaný Debuggerem Oidc. Přiřaďte přístupový token proměnné TOKEN ve vašem shellu.

TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

Spustit příkaz níže:

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

Teď to funguje, jak se očekávalo! Tentokrát jsi obdrží uvítací zprávu jako odpověď:

můžete vidět, že Micronaut vyžaduje velmi málo kódu vytvořit bezpečné rozhraní REST API. Pokud jste počítali řádky kódu, zjistili byste, že ~24% je závislostí v XML (8 řádků), kód Java je pouze 22 řádků kódu a konfigurace zabezpečení trvá 3 řádky. Vestavěná podpora OAuth 2.0 společnosti Micronaut usnadňuje integraci s Okta a dokonce mají ve své dokumentaci průvodce Okta.

skvělé! Nyní se podívejme, jak vytvořit stejnou aplikaci pomocí Quarkus.

Vytvořit Java REST API s Quarkus

rozvíjet své aplikace pomocí Quarkus potřebujete pouze Maven instalaci, nejsou tam žádné jiné závislosti požadované.

začněme vytvářet vaši aplikaci! Přejděte do adresáře, který chcete vytvořit a spustit následující příkaz:

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"

výše uvedený příkaz vytvoří projekt pomocí Quarkus Maven plugin. Vytvoří zdroj s názvem HelloResource, který bude přijímat požadavky na cestu /hello. Do projektu také přidáváte rozšíření JWT od společnosti Quarkus.

jakmile vytvoříte projekt, upravte src/java/com/okta/rest/quarkus/HelloResource.java a přidejte informace o uživateli do metody hello() :

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

výše uvedená třída se bude chovat stejně jako ta, kterou jste vytvořili v Micronautu. Přečte informace uživatele na základě tokenu, který byl vygenerován v požadavku, a vrátí uvítací zprávu nalezenému uživateli.

stále jste nenakonfigurovali Quarkus se svým emitentem a klíči z Okta, tak to udělejme.

Upravit src/main/resources/application.properties a přidejte následující kód:

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

Hotovo! Verze aplikace Quarkus je připravena k testování. Jděte do vaší složky projektu a spusťte následující příkaz:

./mvnw compile quarkus:dev

výše uvedený příkaz spustí vaši aplikaci.

prvním krokem je ujistit se, že obdržíte 401 - Unauthorized , pokud nepoužíváte správné přihlašovací údaje.

Spustit následující příkaz v terminálu:

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

Jak se očekávalo, výsledek je HTTP 401 odpověď:

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

Pokud provedete stejný požadavek, včetně tokenu z debuggeru OIDC, měl by vrátit uvítací zprávu.

Spustit následující příkaz:

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

fungovalo To jako kouzlo! V mém případě, výsledek byl:

Quarkus vyžaduje i méně řádků kódu, než Micronaut! Generuje aplikaci se závislostmi, má 25 řádků kódu Java a pouze 2 řádky konfigurace. Ano, řádky kódu je hloupé srovnání, ale také ukazuje, jak tyto rámce vyžadují velmi málo kódu pro vývoj bezpečných aplikací.

dva dole, jeden zbývá! Nyní, když jste byli schopni implementovat aplikaci na Micronaut a Quarkus, pojďme dokončit vytvořením stejné aplikace pomocí Spring Boot.

Vytvořte Java REST API s Spring Boot

Spring Boot nemá žádné předpoklady pro zahájení vytváření aplikace, takže začněme vytvořením projektu!

otevřete terminál a proveďte následující příkaz:

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

výše uvedený příkaz vytvoří spring-boot.zip soubor s Spring Boot aplikaci, která používá Maven. Soubor můžete extrahovat do adresáře spring-boot pomocí níže uvedeného příkazu.

unzip spring-boot.zip -d spring-boot

Nyní, budete provádět správce, který bude přijímat žádosti.

Vytvořte com.okta.rest.controller balíček a HelloController třídu v něm:

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

konfigurace je zde velmi podobná ostatním rámcům. Třídu anotujete pomocí @RestController, abyste jarní informovali, že budete dostávat požadavky na třídu. @GetMapping obdrží HTTP GET požadavky na cestu /hello. Pro načtení ověřeného uživatele použijte@AuthenticationPrincipal anotaci.

Na rozdíl od ostatních rámců nemusíte specifikovat, že tento koncový bod je ověřen, protože jaro již řídí tyto informace ze svých konfigurací.

posledním krokem je přidat emitenta informace, tak na Jaře Bezpečnost je OIDC podpora může automaticky objevit koncové body musí komunikovat.

Upravit src/main/resources/applications.properties a přidejte následující konfigurace:

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

Pojďme vyzkoušet! Spusťte aplikaci Spring Boot pomocí Maven.

./mvnw spring-boot:run

Poté, otevřete terminál a spusťte příkaz níže:

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

odpověď HTTP 401 chyba, protože jste neměl obsahovat 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

Test znovu, nyní předává token:

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

fungovalo To! Stejně jako u ostatních služeb, je výsledkem tohoto příkazu je následující:

Jarní Boot hodiny v nejméně množství kódu potřebné: 17 řádků Java a pouze 1 řádek Konfigurace! Jaro bylo vždy vynikající při usnadňování života vývojářů, takže to není žádným překvapením.

to je ono! Implementovali jste Základní Java REST API ve všech třech rámcích!

Závěrečné myšlenky na REST API s Javou: Micronaut, Quarkus a Spring Boot

Pokud jde o vývoj REST API, všechny tři rámce odvedly práci dobře. S trochou kódu a nějakou konfigurací jste byli schopni vyvinout bezpečnou aplikaci pomocí Okta a OAuth 2.0.

jaro existuje již mnoho let, je velmi populární a má mnoho funkcí kolem svého ekosystému. Osobně se stále domnívám, že je to nejlepší možnost dostupná při programování v Javě.

Micronaut a Quarkus rostou v popularitě a získávají dynamiku uvnitř Java komunity. Pokud se potýkáte s problémy s výkonem, nebo možná, pokud vás pro změnu bolí, můžete zkusit jednoho z nich a zjistit, jak to jde.

výkon je nejčastěji zvýrazněným srovnávacím bodem mezi těmito třemi rámci. Pokud hledáte pro rychlé spuštění v serverless prostředí, nebo schopnost vytvářet nativní snímky s GraalVM, Micronaut a Quarkus bude pravděpodobně fungovat dobře pro vás. Jen tak pro zábavu, startovací časy pro každý z těchto aplikací jsou následující (na základě průměru ze tří pokusů):

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

mám tyto čísla od spuštění každý rámec je Maven cíle pro rozvoj.

  • Micronaut: ./mvnw mn:run
  • Quarkus: ./mvnw compile quarkus:dev
  • Spring Boot: ./mvnw spring-boot:run

Tyto příkazy nejsou optimalizované pro rychlost, tak I balené každá aplikace s ./mvnw package a začal s java -jar.

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

POZNÁMKA: Tato čísla byla vypočtena na 2019 MacBook Pro s 2,4 GHz 8-Core Intel Core i9 CPU a 64 GB RAM. OpenJDK 15 byl použit bez nastavení JAVA_OPTS.

Pokud hledáte ještě rychlejší časy spuštění, můžete použít GraalVM. Spíše než abych sám prováděl časové testy, podíval jsem se na dokumentaci každého projektu.

  • Micronaut: 12ms podle vytvoření vaší první aplikace Micronaut Graal.
  • Quarkus: 14ms podle Quarkuse a GraalVM: bootování hibernace nadzvukovou rychlostí, subatomární velikost na InfoQ. Dokumenty Quarkus neuvádějí čas spuštění.
  • jarní Boot: 44ms podle Spring Graal Native 0.6.0 vydáno.

nakonec budete moci produktivně vyvinout bezpečnou aplikaci bez ohledu na zvolenou volbu.

Chcete se podívat na zdrojový kód? Najdete ji na Githubu na okta-java-rest-api-comparison-example.

Chcete se dozvědět více o Java, REST API a zabezpečených aplikacích? Zde jsou některé další příspěvky z našeho blogu, že byste mohli najít užitečné:

  • Sledujte GraalVM Proměňte Svůj Java Do Binární soubory
  • OAuth 2.0 Java Guide: Zabezpečte Své Aplikace v 5 Minut
  • Java Microservices s Spring Boot a na Jaře Cloud
  • Jak Vytvořit Quarkus Aplikace s Java a OIDC Autentizace
  • Jednoduché Ověřování s Jarní Zabezpečení

Pro další příspěvky, jako je tento, sledujte @oktadev na Twitteru. Pravidelně také publikujeme screencasty na našem kanálu YouTube!

Changelog:

  • 23. Září 2020: upgradováno na Micronaut 2.0.2, Quarkus 1.8.1 a Spring Boot 2.3.4. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto příspěvku lze zobrazit v oktadeveloper / okta-blog#423.
  • 21. Květen 2020: Přidány časy spuštění pro java -jar a běží s GraalVM. Změny tohoto článku lze zobrazit v oktadeveloper / okta-blog#304.
  • 20. Května 2020: Upgrade na Micronaut 1.3.5, Quarkus 1.4.2, a na Jaře Boot 2.3.0. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto článku lze zobrazit v oktadeveloper / okta-blog#301.
  • Jan 30, 2020: Aktualizováno optimalizovat Micronaut na základě zpětné vazby od Micronaut tým. Také znovu vypočtené časy spuštění na základě průměrně tří pokusů. Podívejte se na změny kódu v ukázkové aplikaci na Githubu. Změny tohoto článku si můžete prohlédnout v oktadeveloper / okta-blog#176.

Related Posts

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *