Java REST API: który Framework jest najlepszy na rynku ?

tworzenie usług w Javie, w tym REST API, nie zawsze było łatwe i produktywne, dopóki nie przyszła wiosna i nie zmieniła krajobrazu. Od tego czasu minęło wiele lat, a w społeczności pojawiły się nowe ramy.

jednym z tych frameworków był Micronaut. Jest rozwijany przez OCI, tę samą firmę, która stoi za Grails, a ich celem jest pomoc programistom w tworzeniu mikroserwisów i aplikacji bezserwerowych.

istnieje również Quarkus, kolejny framework, który zyskał popularność w ciągu ostatniego roku. Opracowany przez RedHat, Quarkus obiecuje zapewnić szybki Start i mniejsze zużycie pamięci, dwa typowe problemy podczas tworzenia usług REST w Javie.

z tymi wszystkimi wyborami, istnieje bardzo ważne pytanie: jak łatwo jest stworzyć usługę z każdym z tych trzech frameworków?

w tym samouczku stworzysz bezpieczną aplikację REST, używając Spring, Micronaut i Quarkus, aby zobaczyć, jak się różnią i która najlepiej odpowiada twoim potrzebom.

spis treści

  • wymagania wstępne dla Java REST API
    • Utwórz konto Okta do zarządzania użytkownikami
    • Generuj tokeny za pomocą debugera OpenID Connect
  • Zbuduj Java REST API za pomocą Micronaut
    • Rozwijaj swoją usługę Java
  • Zbuduj Java REST API za pomocą Quarkus
  • Zbuduj Java REST API REST API z wiosennym rozruchem
  • ostatnie przemyślenia na temat REST API z Javą: Micronaut, quarkus i Spring Boot

Jeśli chcesz, możesz obejrzeć ten samouczek jako Screencast. 👇

wymagania wstępne dla Java REST API

Ten samouczek używa Maven 3+. Przed kontynuowaniem upewnij się, że jest zainstalowany i dostępny do użycia. Z pewnością można również użyć Gradle, ale YMMV.

masz zamiar zbudować aplikacje, które uwierzytelniają żądania za pomocą OAuth 2.0, zabezpieczone przez aplikację Okta. Nie masz konta Okta? Nie martw się, stworzenie nowego zajmuje mniej niż minutę. Nie tylko to, ale Okta obsługuje standardy takie jak JWT, OAuth 2.0 i OIDC. Zapewniamy wsparcie dla dobrze znanych frameworków, takich jak Java EE, Spring Boot i Spring Security. Heck, mamy nawet wtyczkę Maven, która automatyzuje wszystko dla ciebie.

nie ma potrzeby odkrywania koła na nowo!

Utwórz konto Okta do zarządzania użytkownikami

Otwórz swój terminal i wykonaj następujące polecenie:

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

zostaniesz poproszony o wprowadzenie następujących informacji:

  • Imię
  • nazwisko
  • e-mail
  • firma

Po udzieleniu odpowiedzi na pytania otrzymasz wiadomość e-mail z prośbą o aktywację nowego konta. Po aktywacji konta Uruchom następujące polecenie:

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

To polecenie tworzy dla Ciebie aplikację z przepływem kodu auth i URI przekierowania Spring Security dla Okta.

Okta Maven-wygenerowana aplikacja

aby lepiej ją zapamiętać, możesz utworzyć tę samą aplikację ręcznie:

  • przejdź do strony głównej dewelopera Okta i zaloguj się na swoje konto.
  • kliknij Aplikacje> Dodaj aplikację> Web> następny.

zobaczysz następujący ekran:

Okta nowa aplikacja

zanim przejdziesz dalej, wprowadź następujące zmiany w aplikacji:

  • Zaloguj się Przekieruj Uri:
    • http://localhost:8080/login/oauth2/code/okta
    • https://oidcdebugger.com/debug
  • Typ dotacji dozwolony
    • kod autoryzacji
    • Implicit (Hybrydowy)

Typ dotacji implicit (z identyfikatorem i dostępem Token allowed checked) jest konieczne, aby pobrać token dostępu w przeglądarce.

pola Nie wymienione powyżej mogą zachować swoje wartości domyślne.

Po zakończeniu kliknij Gotowe. Twoja aplikacja jest gotowa!

następnym krokiem jest nauczenie się, jak wygenerować prawidłowy token za jego pomocą.

generowanie tokenów za pomocą debuggera OpenID Connect

Okta pozwala zarządzać użytkownikami w chmurze za pomocą swoich API. Pozwala również zabezpieczyć aplikacje za pomocą OAuth 2.0 i OpenID Connect (Alias OIDC). OAuth 2.0 zapewnia mechanizm autoryzacji delegowanej, co oznacza, że nie musisz przechowywać poświadczeń użytkownika w aplikacji. Zamiast tego możesz przekazać to dostawcy OAuth 2.0 (w tym przypadku Okta). OIDC zapewnia warstwę tożsamości na bazie OAuth 2.0 i dlatego firmy takie jak Okta nazywane są „dostawcami tożsamości” lub IDP.

zarejestrowałeś swoją aplikację w Okta i możesz teraz wygenerować token, aby uzyskać do niej dostęp. Jeden z zarejestrowanych URI przekierowania logowania jest dla strony OpenID Connect.

Twoje żądania zostaną zweryfikowane za pomocą tokena. Aby wygenerować ten token, użyjesz debuggera OpenID Connect. Ta strona internetowa zapewni Ci łatwy sposób na wygenerowanie poświadczeń dla użytkowników aplikacji Okta.

przejdź do https://oidcdebugger.com I wypełnij następujące informacje:

  • Autoryzuj URI: https://{yourOktaDomain}/oauth2/default/v1/authorize
  • Przekieruj URI: https://oidcdebugger.com/debug
  • ID klienta: {yourOktaClientId}
  • zakres: openid email profile
  • Stan: dev
  • Nonce
  • Typ odpowiedzi: token

Możesz znaleźć wartość dla {yourOktaDomain} w prawym górnym rogu strony głównej Twojego konta:

Strona główna okta

aby znaleźć swój identyfikator klienta okta, wykonaj poniższe czynności:

  • przejdź do aplikacji
  • Wybierz moją aplikację internetową
  • kliknij Ogólne

identyfikator klienta będzie dostępny w sekcji poświadczenia klienta:

poświadczenia klienta

Po wypełnieniu wszystkich pól kliknij Wyślij zapytanie. Zostaniesz przekierowany na stronę logowania Okta.

Po pomyślnym uwierzytelnieniu zostaniesz ponownie przekierowany do debuggera OIDC, gdzie możesz zobaczyć wygenerowany token:

wygenerowany Token

użyjesz tego tokena do bezpiecznego dostępu do usług, które zamierzasz zbudować.

teraz, gdy masz konto Okta i wiesz, jak generować tokeny za pomocą aplikacji Okta, zacznijmy porównywać frameworki!

Zbuduj Java REST API z Micronaut

pierwszym krokiem do rozwoju usługi Micronaut jest pobranie SDKMANA!. SDKMAN! to narzędzie do zarządzania równoległymi wersjami wielu zestawów SDK, których użyjesz do zainstalowania klienta Micronaut.

możesz pobrać SDKMAN! uruchamiając następujące polecenie:

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

teraz możesz zainstalować sam Micronaut. Po prostu uruchom następujące polecenie w terminalu:

sdk install micronaut

Po zakończeniu wykonywania polecenia będziesz mieć najnowszą wersję Micronaut dostępną na komputerze.

jesteś gotowy do rozpoczęcia tworzenia aplikacji!

Rozwiń swoją usługę Java

przejdź do katalogu, w którym chcesz utworzyć aplikację i wykonaj następujące polecenie:

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

To polecenie utworzy projekt o podstawowej strukturze projektu Micronaut. Micronaut domyślnie używa Gradle, ale ponieważ używasz --build maven, zamiast tego użyje Mavena.

następnym krokiem jest dodanie bibliotek bezpieczeństwa wewnątrz projektu. Edytuj plik pom.xml I dodaj następujące zależności:

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

te zależności umożliwią bezpieczeństwo – w szczególności OAuth 2.0 z JWT – w Twoim projekcie. Teraz, gdy masz już wszystkie zależności, możesz rozpocząć tworzenie punktu końcowego.

Utwórz następującą klasę wsrc/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() + "!"; }}

adnotacja @Controllerwskazuje na Micronaut, że ten komponent będzie odbierał żądania w /hello ścieżka.

Klasa posiada tylko jedną metodę o nazwiehello(). Adnotacja@Get pokazuje, że metoda będzie otrzymywać żądania HTTP GET. Potrzebujesz @Produces, ponieważ domyślnym typem zwracanym przez Micronaut jest obiekt JSON. Ponieważ zwracasz prosty tekst, musisz jawnie zdefiniować te informacje w metodzie.

ostatnia adnotacja to@Secured. Po prostu informuje Micronaut, że ta metoda jest dostępna tylko dla uwierzytelnionych użytkowników.

masz teraz kontroler, który jest zabezpieczony, ale nie zdefiniowałeś jeszcze konfiguracji zabezpieczeń. Skonfigurujmy Micronaut tak, aby łączył się z Twoją aplikacją Okta.

Zmień nazwęsrc/main/resources/application.yml naapplication.properties I dodaj następującą konfigurację zabezpieczeń:

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

Zastąp {yourOktaDomain} z wartością z twojego konta okta.

powyższa konfiguracja umożliwia bezpieczeństwo przy użyciu OAuth 2.0. Deklarujesz, że twój Klient OAuth 2.0 pochodzi od Okta, określając Emitenta z Twojej organizacji Okta.

umożliwiasz również korzystanie z tokenów internetowych JSON lub JWTs. Ponieważ chcesz odczytać informacje z Okta, musisz zadeklarować, gdzie możesz znaleźć swoje jwks (JSON Web Key Set), aby zweryfikować sygnatury JWT.

czas przetestować twój serwis! Uruchom aplikację, wykonując następujące polecenie:

./mvnw mn:run

Po uruchomieniu aplikacji wykonaj następujące polecenie:

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

powyższe polecenie wygeneruje wynik podobny do tego:

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

jak widać, żądanie nie przeszło. Aby to działało, musisz przekazać token dostępu OAuth 2.0 pobrany przez debugera Oidc. Przypisz token dostępu do zmiennejTOKEN w Twojej powłoce.

TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

wykonaj poniższe polecenie:

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

teraz działa zgodnie z oczekiwaniami! Tym razem otrzymujesz wiadomość powitalną jako odpowiedź:

widać, że Micronaut wymaga bardzo mało kodu, aby utworzyć bezpieczne REST API. Jeśli policzysz linie kodu, okaże się, że ~24% to zależności w XML (8 linii), kod Javy to tylko 22 linie kodu, a konfiguracja zabezpieczeń zajmuje 3 linie. Wbudowana obsługa OAuth 2.0 firmy Micronaut ułatwia integrację z Okta, a firma ma nawet Przewodnik po Okta w swojej dokumentacji.

Super! Teraz zobaczmy, jak utworzyć tę samą aplikację za pomocą Quarkus.

Zbuduj Java REST API z Quarkus

aby rozwijać swoją aplikację przy użyciu Quarkus potrzebujesz tylko zainstalowanego Mavena, nie są wymagane żadne inne zależności.

zacznijmy tworzyć Twoją aplikację! Przejdź do katalogu, w którym chcesz go utworzyć i wykonaj następujące polecenie:

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"

powyższe polecenie tworzy projekt przy użyciu wtyczki Quarkus Maven. Utworzy zasób o nazwie HelloResource, który będzie odbierał żądania w ścieżce /hello. Dodajesz również rozszerzenie JWT od Quarkus w projekcie.

Po utworzeniu projektu edytujsrc/java/com/okta/rest/quarkus/HelloResource.java I dodaj informacje o użytkowniku do metodyhello() :

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

powyższa klasa będzie zachowywać się tak samo jak ta utworzona w Micronaut. Odczytuje on informacje użytkownika na podstawie tokenu wygenerowanego w żądaniu i zwraca znajdującemu się użytkownikowi wiadomość powitalną.

nadal nie skonfigurowałeś Quarkusa z Twoim emitentem i kluczami z Okta, więc zróbmy to.

Edytuj src/main/resources/application.properties I dodaj następujący kod:

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

gotowe! Wersja Quarkus Twojej aplikacji jest gotowa do przetestowania. Przejdź do folderu projektu i wykonaj następujące polecenie:

./mvnw compile quarkus:dev

powyższe polecenie uruchomi Twoją aplikację.

pierwszym krokiem jest upewnienie się, że otrzymasz401 - Unauthorized, gdy nie używasz poprawnych poświadczeń.

wykonaj następujące polecenie w terminalu:

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

zgodnie z oczekiwaniami wynikiem jest odpowiedź HTTP 401:

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

jeśli wykonasz to samo żądanie, w tym token z debugera OIDC, powinno ono zwrócić wiadomość powitalną.

wykonaj następujące polecenie:

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

to działało jak urok! W moim przypadku wynik był następujący:

Quarkus wymaga jeszcze mniejszej liczby linii kodu niż Micronaut! Generuje aplikację z dołączonymi zależnościami, ma 25 linii kodu Java i tylko 2 linie konfiguracji. Tak, linie kodu to głupie porównanie, ale pokazuje również, jak te frameworki wymagają bardzo mało kodu do tworzenia bezpiecznych aplikacji.

Dwa w dół, jeszcze jeden! Teraz, gdy udało Ci się zaimplementować aplikację na Micronaut i Quarkus, zakończmy tworzenie tej samej aplikacji przy użyciu Spring Boot.

Zbuduj Java REST API Z Spring Boot

Spring Boot nie ma żadnych wymagań wstępnych, aby rozpocząć tworzenie aplikacji, więc zacznijmy od stworzenia projektu!

Otwórz terminal i wykonaj następujące polecenie:

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

powyższe polecenie utworzy plikspring-boot.zip z aplikacją uruchamiającą sprężynę, która używa Maven. Możesz rozpakować plik do kataloguspring-boot używając poniższego polecenia.

unzip spring-boot.zip -d spring-boot

teraz zaimplementujesz kontroler, który będzie odbierał żądania.

Utwórz com.okta.rest.controller pakiet i HelloController klasę w nim:

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

konfiguracja tutaj jest bardzo podobna do innych frameworków. Przypisujesz klasę za pomocą @RestController, aby dać znać Spring, że otrzymasz żądania dotyczące klasy. @GetMapping otrzyma żądania HTTP GET na ścieżce/hello. Aby pobrać uwierzytelnionego użytkownika, użyj adnotacji@AuthenticationPrincipal.

W odróżnieniu od innych frameworków, nie musisz określać, że ten punkt końcowy jest uwierzytelniony, ponieważ Spring już kontroluje te informacje ze swoich konfiguracji.

ostatnim krokiem jest dodanie informacji o wystawcy, aby Obsługa Oidc Spring Security mogła automatycznie wykrywać punkty końcowe, z którymi musi się komunikować.

Edytujsrc/main/resources/applications.propertiesI dodaj następującą konfigurację:

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

przetestujmy to! Uruchom aplikację Spring Boot za pomocą Maven.

./mvnw spring-boot:run

następnie otwórz terminal i wykonaj polecenie poniżej:

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

odpowiedzią jest błąd HTTP 401, ponieważ token nie został dołączony:

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

przetestuj ponownie, teraz przekazując Token:

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

zadziałało! Podobnie jak w przypadku innych usług, wynik tej komendy jest następujący:

sprężynowe Zegary startowe w co najmniej wymaganej ilości kodu: 17 linii Javy i tylko 1 linia konfiguracji! Wiosna zawsze była doskonała w ułatwianiu życia deweloperom, więc nie jest to zaskoczeniem.

To jest to! Zaimplementowałeś podstawowe Java REST API we wszystkich trzech frameworkach!

ostatnie przemyślenia na temat REST API w Javie: Micronaut, Quarkus i Spring Boot

jeśli chodzi o tworzenie REST API, wszystkie trzy frameworki wykonały swoją pracę dobrze. Z odrobiną kodu i pewną konfiguracją udało Ci się stworzyć bezpieczną aplikację wykorzystującą Okta i OAuth 2.0.

Wiosna istnieje od wielu lat, jest bardzo popularna i ma wiele funkcji wokół swojego ekosystemu. Osobiście nadal uważam, że jest to najlepsza opcja dostępna podczas programowania w Javie.

Micronaut i Quarkus zyskują na popularności i nabierają tempa w społeczności Java. Jeśli masz problemy z wydajnością, a może pragniesz zmiany, możesz spróbować jednego z nich i zobaczyć, jak to działa.

wydajność jest najczęściej podkreślanym punktem porównania między tymi trzema frameworkami. Jeśli szukasz szybkiego uruchamiania w środowisku bezserwerowym lub możliwość tworzenia natywnych obrazów za pomocą GraalVM, Micronaut i Quarkus prawdopodobnie będzie działać dobrze dla ciebie. Dla Zabawy, czasy uruchamiania każdej z tych aplikacji są następujące (w oparciu o średnią z trzech prób):

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

otrzymałem te liczby od uruchomienia celów Maven dla rozwoju każdego frameworka.

  • Micronaut:./mvnw mn:run
  • Quarkus:./mvnw compile quarkus:dev
  • sprężynowy rozruch: ./mvnw spring-boot:run

te polecenia nie są zoptymalizowane pod kątem prędkości, więc spakowałem każdą aplikację za pomocą./mvnw package I uruchomiłem je za pomocąjava -jar.

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

Uwaga: te liczby zostały obliczone na MacBooku Pro 2019 z 8-rdzeniowym procesorem Intel Core i9 2.4 GHz i 64 GB PAMIĘCI RAM. OpenJDK 15 był używany bezJAVA_OPTS ustawienie.

Jeśli szukasz jeszcze krótszego czasu uruchamiania, możesz użyć GraalVM. Zamiast sam przeprowadzać testy czasowe, przejrzałem dokumentację każdego projektu.

  • Micronaut: 12ms zgodnie z tworzeniem pierwszej aplikacji Micronaut Graal.
  • Kwarkus: 14ms według Kwarkusa i GraalVM: Hibernacja startowa z prędkością naddźwiękową, Rozmiar Subatomowy na InfoQ. Dokumenty Quarkusa nie podają czasu uruchomienia.
  • Spring Boot: 44ms zgodnie z Spring Graal Native 0.6.0 wydany.

w końcu będziesz mógł produktywnie rozwijać bezpieczną aplikację, niezależnie od dokonanego wyboru.

chcesz rzucić okiem na kod źródłowy? Możesz go znaleźć na GitHub pod adresem okta-java-rest-api-comparison-example.

chcesz dowiedzieć się więcej o Javie, interfejsach API REST i bezpiecznych aplikacjach? Oto kilka innych postów z naszego bloga, które mogą ci się przydać:

  • Obejrzyj GraalVM zamień swoją Javę w pliki binarne
  • OAuth 2.0 Przewodnik po Javie: Zabezpiecz swoją aplikację w 5 minut
  • mikroserwisy Javy za pomocą Spring Boot i Spring Cloud
  • Jak stworzyć aplikację Quarkus z uwierzytelnianiem Java i OIDC
  • proste uwierzytelnianie za pomocą Spring Security

aby uzyskać więcej takich postów, wykonaj @oktadev na Twitterze. Regularnie publikujemy również screencasty na naszym kanale YouTube!

Changelog:

  • 23 września 2020: Aktualizacja do Micronaut 2.0.2, Quarkus 1.8.1 i Spring Boot 2.3.4. Zobacz zmiany kodu w przykładowej aplikacji na GitHub. Zmiany w tym poście można zobaczyć w oktadeveloper / okta-blog#423.
  • 21 maja 2020: Dodano czasy uruchamiania dlajava -jar I działa z GraalVM. Zmiany w tym artykule można zobaczyć w oktadeveloper / okta-blog#304.
  • 20 maja 2020: Aktualizacja do Micronaut 1.3.5, Quarkus 1.4.2 i Spring Boot 2.3.0. Zobacz zmiany kodu w przykładowej aplikacji na GitHub. Zmiany w tym artykule można zobaczyć w oktadeveloper / okta-blog#301.
  • 30 sty 2020: zaktualizowano, aby zoptymalizować Micronaut na podstawie opinii zespołu Micronaut. Również ponownie obliczone czasy uruchamiania na podstawie średnio trzech prób. Zobacz zmiany kodu w przykładowej aplikacji na GitHub. Zmiany w tym artykule można zobaczyć w oktadeveloper / okta-blog#176.

Related Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *