Java REST API Showdown: care este cel mai bun cadru de pe piață?

dezvoltarea serviciilor în Java, inclusiv API-urile REST, nu a fost întotdeauna ușoară sau productivă până când primăvara a venit și a schimbat peisajul. Au trecut mulți ani de atunci și au apărut noi cadre în comunitate.

unul dintre aceste cadre a fost Micronaut. Este dezvoltat de OCI, aceeași companie din spatele Grails, iar scopul lor este de a ajuta dezvoltatorii să creeze microservicii și aplicații fără server.

există și Quarkus, un alt cadru care a câștigat popularitate în ultimul an. Dezvoltat de RedHat, Quarkus promite să ofere o pornire rapidă și o utilizare mai mică a memoriei, două probleme comune la dezvoltarea serviciilor REST în Java.

cu toate aceste alegeri, există o întrebare foarte importantă de pus: cât de ușor este să creezi un serviciu cu fiecare dintre aceste trei cadre?

în acest tutorial, veți crea o aplicație sigură REST folosind Spring, Micronaut și Quarkus pentru a vedea cum diferă unul de celălalt și care se potrivește cel mai bine nevoilor dvs.

cuprins

  • cerințe preliminare pentru API-ul Java REST
    • creați un cont Okta pentru gestionarea utilizatorilor
    • generați Jetoane folosind Debugger OpenID Connect
  • construiți un API Java REST cu Micronaut
    • dezvoltați serviciul Java
  • construiți un API Java REST cu Quarkus
  • construiți un API Java REST cu Quarkus
  • cu Spring Boot

  • gânduri finale pe API-urile REST cu Java: micronaut, Quarkus și spring boot

dacă doriți, puteți viziona acest tutorial ca un screencast.

cerințe preliminare pentru Java REST API

acest tutorial foloseste Maven 3+. Asigurați-vă că este instalat și disponibil pentru utilizare înainte de a continua. Puteți utiliza, de asemenea, cu siguranță Gradle, dar YMMV.

veți construi aplicații care autentifică cererile folosind OAuth 2.0, securizat de o aplicație Okta. Nu aveți un cont Okta? Nu vă faceți griji, este nevoie de mai puțin de un minut pentru a crea unul nou. Nu numai asta, dar Okta acceptă standarde precum JWT, OAuth 2.0 și oidc. Oferim suport pentru cadre cunoscute precum Java EE, Spring Boot și Spring Security. Heck, avem chiar și un plugin Maven care automatizează totul pentru tine.

nu este nevoie să reinventăm roata!

creați un cont Okta pentru gestionarea utilizatorilor

deschideți terminalul și executați următoarea comandă:

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

vi se va cere să introduceți următoarele informații:

  • prenume
  • prenume
  • Email
  • companie

odată ce ați răspuns la întrebări, veți primi un e-mail pentru a vă activa contul nou. După activarea contului, executați următoarea comandă:

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

această comandă creează o aplicație pentru dvs. cu fluxul de cod auth și URI-ul de redirecționare Spring Security pentru Okta.

aplicație generată de Okta Maven

pentru a-l aminti mai bine, puteți crea aceeași aplicație manual:

  • accesați pagina de pornire a dezvoltatorului Okta și conectați-vă la contul dvs.
  • Faceți clic pe aplicații> adăugați aplicația> Web> următor.

veți vedea următorul ecran:

Okta aplicație nouă

înainte de a continua, efectuați următoarele modificări în aplicație:

  • login redirect uri:
    • http://localhost:8080/login/oauth2/code/okta
    • https://oidcdebugger.com/debug
  • tip de Grant permis
    • cod de autorizare
    • Implicit (hibrid)

tipul de grant implicit (cu ID și acces jeton permis verificat) este necesar pentru a prelua un jeton de acces în browser.

câmpurile care nu sunt menționate mai sus își pot păstra valorile implicite.

după ce îl terminați, faceți clic pe Terminat. Aplicația dvs. este gata!

următorul pas este să înveți cum să generezi un jeton valid folosind-o.

generați Jetoane folosind Debugger OpenID Connect

Okta vă permite să gestionați utilizatorii în cloud folosind API-urile sale. De asemenea, vă permite să vă securizați aplicațiile utilizând OAuth 2.0 și OpenID Connect (alias, OIDC). OAuth 2.0 oferă un mecanism de autorizare delegată, ceea ce înseamnă că nu trebuie să stocați acreditările de utilizator în aplicația dvs. În schimb, puteți delega acest lucru unui furnizor OAuth 2.0 (Okta, în acest caz). OIDC oferă un strat de identitate deasupra OAuth 2.0 și de aceea companii precum Okta sunt numite „furnizori de identitate” sau IDP.

v-ați înregistrat aplicația la Okta și acum Puteți genera un token pentru a avea acces la ea. Unul dintre uri-urile de redirecționare a autentificării pe care le-ați înregistrat este pentru site-ul OpenID Connect.

cererile dvs. vor fi validate folosind un token. Pentru a genera acest simbol, veți utiliza Debugger OpenID Connect. Acest site vă va oferi o modalitate ușoară de a genera acreditări pentru utilizatorii din aplicația dvs.

mergeți la https://oidcdebugger.com și completați următoarele informații:

  • autorizați URI: https://{yourOktaDomain}/oauth2/default/v1/authorize
  • redirecționați URI: https://oidcdebugger.com/debug
  • ID Client:{yourOktaClientId}
  • domeniu de aplicare:openid email profile
  • Stat:dev
  • Nonce: (păstrați valoarea implicită)
  • tip de răspuns:token

puteți găsi valoarea pentru{yourOktaDomain} în colțul din dreapta sus al paginii de pornire a contului dvs.:

pagina de pornire Okta

pentru a găsi ID-ul clientului Okta urmați pașii de mai jos:

  • mergeți la aplicații
  • Selectați aplicația mea Web
  • Faceți clic pe General

ID-ul clientului va fi disponibil în secțiunea acreditări Client:

acreditări Client

după ce completați toate câmpurile, faceți clic pe Trimite cerere. Veți fi redirecționat către pagina dvs. de conectare Okta.

odată ce ați autentificat cu succes, veți fi redirecționat către Oidc Debugger din nou, în cazul în care puteți vedea jetonul generat:

Token generat

veți folosi acest token pentru a accesa în siguranță serviciile pe care le veți construi.

acum că aveți un cont Okta și știți cum să generați jetoane folosind aplicația Okta, să începem să comparăm cadrele!

construiți un API Java REST cu Micronaut

primul pas pentru dezvoltarea serviciului Micronaut este să descărcați SDKMAN!. SDKMAN! este un instrument pentru gestionarea versiunilor paralele ale mai multor SDK-uri, pe care le veți utiliza pentru a instala clientul Micronaut.

puteți descărca SDKMAN! executând următoarea comandă:

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

acum, Puteți instala Micronaut în sine. Doar executați următoarea comandă în terminal:

sdk install micronaut

după ce comanda se termină de executat, veți avea cea mai recentă versiune Micronaut disponibilă pe computer.

sunteți gata pentru a începe dezvoltarea aplicației!

Dezvoltați-vă serviciul Java

accesați directorul în care doriți să creați aplicația și executați următoarea comandă:

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

această comandă va crea un proiect cu structura de bază a unui proiect Micronaut. Micronaut folosește Gradle în mod implicit, dar din moment ce utilizați --build maven, va folosi în schimb Maven.

următorul pas este să adăugați bibliotecile de securitate în interiorul proiectului. Editați fișierul pom.xml și adăugați următoarele dependențe:

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

aceste dependențe vor activa securitatea – în special OAuth 2.0 cu JWT – în interiorul proiectului. Acum că aveți toate dependențele la locul lor, puteți începe să vă creați punctul final.

creați următoarea clasă în 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() + "!"; }}

@Controlleradnotarea indică Micronaut că această componentă va primi cereri în/hellocale.

clasa are o singură metodă, numităhello(). Adnotarea@Get arată că metoda va primi cereri HTTP GET. Aveți nevoie de @Produces deoarece tipul de returnare implicit al Micronaut este un obiect JSON. Deoarece returnați text simplu, trebuie să definiți în mod explicit aceste informații în metodă.

Ultima adnotare este@Secured. Pur și simplu îi spune Micronaut că această metodă este accesibilă numai utilizatorilor autentificați.

acum aveți un controler care este securizat, dar nu ați definit încă configurația de securitate. Să configurăm Micronaut pentru a vă conecta la aplicația Okta.

redenumițisrc/main/resources/application.yml laapplication.properties și adăugați următoarea configurație de securitate:

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

înlocuiți{yourOktaDomain} cu valoarea din contul dvs.

configurația de mai sus permite securitatea folosind OAuth 2.0. Declarați că clientul dvs. OAuth 2.0 provine de la Okta, specificând emitentul din organizația dvs.

de asemenea, activați utilizarea jetoanelor JSON web sau JWT. Deoarece doriți să citiți informațiile de la Okta, trebuie să declarați unde puteți găsi JWKS (JSON Web key Set) pentru a valida semnăturile JWT.

este timpul să vă testați serviciul! Porniți aplicația executând următoarea comandă:

./mvnw mn:run

cu aplicația în funcțiune, executați următoarea comandă:

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

comanda de mai sus va produce un rezultat similar cu acesta:

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

după cum puteți vedea, cererea nu a trecut. Pentru a face să funcționeze, trebuie să treceți în tokenul de acces OAuth 2.0 preluat de depanatorul OIDC. Alocați tokenul de acces unei variabileTOKEN din shell.

TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

executați comanda de mai jos:

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

acum funcționează așa cum era de așteptat! De data aceasta primiți mesajul de salut ca răspuns:

puteți vedea că Micronaut necesită foarte puțin cod pentru a crea un API REST securizat. Dacă ați numărat liniile de cod, veți găsi că ~24% sunt dependențe în XML (8 linii), codul Java este doar 22 de linii de cod, iar configurația de securitate durează 3 linii. Suportul încorporat OAuth 2.0 al Micronaut facilitează integrarea cu Okta și chiar au un ghid pentru Okta în documentația lor.

grozav! Acum, să vedem cum creați aceeași aplicație folosind Quarkus.

construiți un API Java REST cu Quarkus

pentru a vă dezvolta aplicația folosind Quarkus, aveți nevoie doar de Maven instalat, nu există alte dependențe necesare.

să începem crearea aplicației! Accesați directorul în care doriți să îl creați și executați următoarea comandă:

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"

comanda de mai sus creează un proiect folosind pluginul Quarkus Maven. Va crea o resursă numită HelloResource, care va primi solicitări pe calea/hello. De asemenea, adăugați extensia JWT de la Quarkus în proiect.

odată ce ați creat proiectul, editați src/java/com/okta/rest/quarkus/HelloResource.java și adăugați informații despre utilizator la hello() 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() + "!"; }}

clasa de mai sus se va comporta la fel ca cea pe care ați creat-o în Micronaut. Citește informațiile utilizatorului pe baza jetonului care a fost generat în cerere și returnează un mesaj de salut utilizatorului care este găsit.

încă nu ați configurat Quarkus cu emitentul și cheile de la Okta, așa că hai să facem asta.

editează src/main/resources/application.properties și adaugă următorul cod:

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

terminat! Versiunea Quarkus a cererii dumneavoastră este gata pentru a fi testate. Accesați folderul proiectului și executați următoarea comandă:

./mvnw compile quarkus:dev

comanda de mai sus va porni aplicația.

primul pas este să vă asigurați că primiți un401 - Unauthorized atunci când nu utilizați acreditările corecte.

executați următoarea comandă în terminal:

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

așa cum era de așteptat, rezultatul este un răspuns HTTP 401:

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

Dacă executați aceeași solicitare, inclusiv jetonul din depanatorul OIDC, acesta ar trebui să returneze mesajul de întâmpinare.

executați următoarea comandă:

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

a funcționat ca un farmec! În cazul meu, rezultatul a fost:

Quarkus necesită și mai puține linii de cod decât Micronaut! Acesta generează o aplicație cu dependențe incluse, are 25 de linii de cod Java, și doar 2 Linii de configurare. Da, linii de cod este o comparație stupidă, dar arată și modul în care aceste cadre necesită foarte puțin cod pentru a dezvolta aplicații sigure.

doi jos, unul pentru a merge! Acum că ați reușit să implementați aplicația pe Micronaut și Quarkus, să terminăm prin crearea aceleiași aplicații folosind Spring Boot.

construiți un API Java REST cu Spring Boot

Spring Boot nu are condiții prealabile pentru a începe crearea aplicației dvs., așa că haideți să începem prin crearea proiectului!

deschideți terminalul și executați următoarea comandă:

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

comanda de mai sus va crea un fișier spring-boot.zip cu o aplicație de boot de primăvară care utilizează Maven. Puteți extrage fișierul într-un director spring-boot folosind comanda de mai jos.

unzip spring-boot.zip -d spring-boot

acum, veți implementa controlerul care va primi cererile.

creați uncom.okta.rest.controller pachet și oHelloController clasă în ea:

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

configurația de aici este foarte asemănătoare cu celelalte cadre. Adnotați clasa cu @RestController pentru a anunța Spring că veți primi solicitări în clasă. @GetMapping va primi cereri HTTP GET pe /hello cale. Pentru a prelua utilizatorul autentificat utilizați@AuthenticationPrincipal adnotare.

diferit de celelalte cadre, nu trebuie să specificați că acest punct final este autentificat deoarece Spring controlează deja aceste informații din configurațiile sale.

ultimul pas este să adăugați informațiile emitentului, astfel încât suportul Oidc al Spring Security să poată descoperi automat punctele finale cu care trebuie să comunice.

Edit src/main/resources/applications.properties și adăugați următoarea configurație:

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

să o testăm! Porniți aplicația Spring Boot folosind Maven.

./mvnw spring-boot:run

apoi, deschideți un terminal și executați comanda de mai jos:

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

răspunsul este o eroare HTTP 401, deoarece nu ați inclus jetonul:

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ți-l din nou, trecând acum tokenul:

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

a funcționat! Ca și în cazul celorlalte servicii, rezultatul acestei comenzi este următorul:

Ceasuri de pornire cu arc în cel puțin cantitatea de cod necesară: 17 linii de Java și doar 1 Linie de configurare! Primăvara a fost întotdeauna excelentă pentru a ușura viața dezvoltatorilor, așa că nu este o surpriză.

asta e! Ai implementat un API Java REST de bază în toate cele trei cadre!

Gânduri finale despre API-urile REST cu Java: Micronaut, Quarkus și Spring Boot

când vine vorba de dezvoltarea API-ului REST, toate cele trei cadre au făcut treaba bine. Cu doar un pic de cod și o anumită configurație, ați reușit să dezvoltați o aplicație sigură folosind Okta și OAuth 2.0.

primăvara există de mulți ani, este foarte populară și are multe caracteristici în jurul ecosistemului său. Personal, eu încă mai cred că este cea mai bună opțiune disponibilă atunci când programarea în Java.Micronaut și Quarkus sunt în creștere în popularitate și câștigă impuls în interiorul comunității Java. Dacă vă confruntați cu probleme de performanță sau poate dacă doriți o schimbare, s-ar putea să încercați unul dintre ei și să vedeți cum merge.

performanța este cel mai des evidențiat punct de comparație între aceste trei cadre. Dacă sunteți în căutarea unei porniri rapide într-un mediu fără server sau capacitatea de a crea imagini native cu GraalVM, Micronaut și Quarkus vor funcționa probabil bine pentru dvs. Doar pentru distracție, timpii de pornire pentru fiecare dintre aceste aplicații sunt după cum urmează (pe baza mediei din trei încercări):

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

am primit aceste numere de la rularea obiectivelor Maven ale fiecărui cadru pentru dezvoltare.

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

aceste comenzi nu sunt optimizate pentru viteză, așa că am ambalat fiecare aplicație cu./mvnw package și le-am pornit cujava -jar.

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

Notă: Aceste numere au fost calculate pe un MacBook Pro din 2019 cu un procesor Intel Core i9 de 2,4 GHz cu 8 nuclee și 64 GB RAM. OpenJDK 15 a fost utilizat fără setarea JAVA_OPTS.

Dacă sunteți în căutarea unor timpi de pornire și mai rapizi, puteți utiliza GraalVM. Mai degrabă decât să rulez teste de sincronizare, m-am uitat la documentația fiecărui proiect.

  • Micronaut: 12ms în funcție de crearea primei aplicații Micronaut Graal.
  • Quarkus: 14ms conform Quarkus și GraalVM: pornirea hibernează la viteză supersonică, Dimensiune subatomică pe InfoQ. Documentele Quarkus nu listează un timp de pornire.
  • Boot de primăvară: 44ms în funcție de primăvară Graal nativ 0.6.0 lansat.

în cele din urmă, veți putea dezvolta productiv o aplicație sigură, indiferent de alegerea pe care o faceți.

doriți să aruncați o privire la codul sursă? O puteți găsi pe GitHub la okta-java-rest-api-comparație-exemplu.

doriți să aflați mai multe despre Java, API-urile REST și aplicațiile securizate? Iată câteva alte posturi de pe blog-ul nostru pe care le-ar putea găsi utile:

  • uita-te GraalVM transforma Java în binare
  • OAuth 2.0 ghid Java: Secure aplicația în 5 minute
  • microservicii Java cu Spring Boot și Spring Cloud
  • Cum de a dezvolta o aplicație Quarkus cu Java și autentificare Oidc
  • autentificare simplă cu Spring Security

Pentru mai multe posturi ca aceasta, urmăriți @oktadev pe Twitter. De asemenea, publicăm în mod regulat screencast-uri pe canalul nostru YouTube!

Changelog:

  • 23 septembrie 2020: actualizat la Micronaut 2.0.2, Quarkus 1.8.1 și Spring Boot 2.3.4. A se vedea modificările de cod în aplicația exemplu pe GitHub. Modificările aduse acestui post pot fi vizualizate în oktadeveloper/Okta-blog#423.
  • 21 mai 2020: s-au adăugat timpi de pornire pentrujava -jar și care rulează cu GraalVM. Modificările aduse acestui articol pot fi vizualizate în oktadeveloper/Okta-blog#304.
  • 20 mai 2020: actualizat la Micronaut 1.3.5, Quarkus 1.4.2 și Spring Boot 2.3.0. A se vedea modificările de cod în aplicația exemplu pe GitHub. Modificările aduse acestui articol pot fi vizualizate în oktadeveloper/Okta-blog#301.
  • 30 ianuarie 2020: actualizat pentru a optimiza Micronaut pe baza feedback-ului echipei Micronaut. De asemenea, timpii de pornire re-calculați pe baza unei medii de trei încercări. A se vedea modificările de cod în aplicația exemplu pe GitHub. Modificările aduse acestui articol pot fi vizualizate în oktadeveloper/Okta-blog#176.

Related Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *