Quarkus — supersoniczna subatomowa Java. Krótkie wprowadzenie do frameworka

Quarkus — supersoniczna subatomowa Java. Krótkie wprowadzenie do frameworka

Wprowadzenie

Siódmego marca firma RedHat (wkrótce — IBM) przedstawiła nowy framework — Quarkus. Według słów deweloperów, ten framework bazuje na GraalVM i OpenJDK HotSpot oraz jest przeznaczony dla Kubernetes. Stos Quarkus obejmuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus i inne.

Celem stworzenia jest uczynienie Java wiodącą platformą do wdrażania w Kubernetes i tworzenia aplikacji serverless, oferując deweloperom zunifikowane podejście do programowania zarówno w stylu reaktywnym, jak i imperatywnym.

Patrząc na tego klasyfikację frameworków, Quarkus znajduje się gdzieś pomiędzy „Agregatorami/Generatorami Kodów” a „Frameworkami fullstack wysokiego poziomu”. To już więcej niż agregator, ale jeszcze nie sięga do full-stack, ponieważ jest ukierunkowany na rozwój backendu.

Obiecana jest bardzo wysoka prędkość uruchamiania aplikacji i małe zużycie pamięci. Oto dane z witryny dewelopera:

Czas od rozpoczęcia do pierwszej odpowiedzi (s):

Konfiguracja
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradycyjny stos chmurowy*
4.3
9.5

Zużycie pamięci (Mb):

Konfiguracja
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradycyjny stos chmurowy*
140
218

Imponujące, prawda?

*Nie znalazłem informacji o tym stosie technologii, można przypuszczać, że to jakiś Spring Boot z dodatkowym wyposażeniem..

Hello World!

Najprostsza aplikacja napisana w Quarkus wyglądałaby tak:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

To dosłownie jedna klasa i to wystarczy! Można uruchomić aplikację przy pomocy Maven w trybie deweloperskim:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

Różnica w porównaniu do standardowej aplikacji — brak klasy Application! Quarkus wspiera hot reload, dzięki czemu można zmieniać aplikację bez ponownego uruchamiania, co przyspiesza rozwój.

Co dalej? Można dodać usługę do kontrolera przy pomocy adnotacji Inject. Kod usługi:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

Kontroler:

@Path("/hello")
public class GreetingResource {

   @Inject
   GreetingService service;

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public String greeting(@PathParam("name") String name) {
       return service.greeting(name);
   }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

Zauważcie, że w Quarkus używane są standardowe adnotacje z znanych frameworków — CDI i JAX-RS. Nic nowego nie trzeba uczyć, jeśli wcześniej pracowaliście z CDI i JAX-RS.

Praca z bazą danych

Używane są adnotacje Hibernate i standardowe adnotacje JPA dla encji. Podobnie jak w przypadku kontrolerów REST, trzeba napisać minimalną ilość kodu. Wystarczy określić zależności w pliku budowy i dodać adnotacje. @Entity i skonfigurować datasource w application.properties.

I to wszystko. Żadnych sessionFactory, persistence.xml ani innych plików serwisowych. Pisze się tylko tyle kodu, ile jest potrzebne. Niemniej jednak, w razie potrzeby, można stworzyć plik persistence.xml i bardziej szczegółowo skonfigurować warstwę ORM.

Quarkus wspiera cache'owanie encji, kolekcji dla relacji jeden-do-wielu oraz zapytań. Na pierwszy rzut oka wygląda świetnie, ale to lokalne cache'owanie, dla jednego węzła Kubernetes. To znaczy, że cache'e różnych węzłów nie są synchronizowane ze sobą. Mam nadzieję, że to tymczasowe.

Asynchroniczne wykonanie kodu

Jak wspomniałem wcześniej, Quarkus wspiera również reaktywny styl programowania. Kod poprzedniej aplikacji można zapisać w inny sposób.

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

Kod asynchroniczny można również przenieść do usługi, wynik będzie taki sam.

Testowanie

Testy dla aplikacji Quarkus można pisać w JUnit4 lub JUnit5. Poniżej znajduje się przykład testu dla endpointu, napisany przy użyciu RestAssured, ale można użyć również innego frameworka:

@QuarkusTest
public class GreetingResourceTest {

   @Test
   public void testGreetingEndpoint() {
       String uuid = UUID.randomUUID().toString();
       given()
         .pathParam("name", uuid)
         .when().get("/hello/{name}")
         .then()
           .statusCode(200)
           .body(is("Hello " + uuid + "!"));
   }
}

Adnotacja @QuarkusTest nakazuje uruchomić aplikację przed przeprowadzeniem testów. Poza tym — kod znajomy wszystkim programistom.

Aplikacja zależna od platformy

Ponieważ Quarkus jest ściśle zintegrowany z GraalVM, oczywiście można generować kod zależny od platformy. W tym celu należy zainstalować GraalVM i określić zmienną środowiskową GRAALVM_HOME. Następnie należy opisać profil budowy i określić go podczas budowy aplikacji:

mvn package -Pnative

Co ciekawe, wygenerowaną aplikację można przetestować. To ważne, ponieważ wykonanie „rodowego” kodu może różnić się od wykonania na JVM. Adnotacja @SubstrateTest uruchamia kod aplikacji zależny od platformy. Reużycie istniejącego kodu testów można zrealizować za pomocą dziedziczenia, w rezultacie kod do testowania aplikacji zależnej od platformy będzie wyglądać w ten sposób:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Wygenerowany obraz można zapakować w Docker i uruchamiać w Kubernetes lub OpenShift, co jest szczegółowo opisane w instrukcją.

Narzędzia

Framework Quarkus można używać z Maven i Gradle. Maven jest w pełni wspierany, w przeciwieństwie do Gradle. Niestety, w tej chwili Gradle nie wspiera generowania pustego projektu, na stronie znajduje się szczegółowy podręcznik.

Rozszerzenia

Quarkus to rozszerzalny framework. Obecnie istnieje około 40 rozszerzeń, które dodają różne funkcjonalności — od wsparcia kontenera DI Spring i Apache Camel do logowania i publikacji metryk dla działających usług. Już istnieje rozszerzenie wspierające pisanie aplikacji w języku Kotlin, obok Javy.

Podsumowanie

Moim zdaniem, Quarkus jest zdecydowanie w stronę współczesnych trendów. Rozwój kodu backendowego staje się coraz prostszy, a ten framework jeszcze bardziej upraszcza i przyspiesza tworzenie usług, dodając „rodznou” wsparcie dla Dockera i Kubernetes. Ogromnym plusem jest wbudowane wsparcie dla GraalVM i generowania obrazów zależnych od platformy, co pozwala na rzeczywiste szybkie uruchamianie usług i zajmowanie mało miejsca w pamięci. A to jest bardzo ważne w dobie masowej fascynacji mikroserwisami i architekturą serverless.

Oficjalna strona — quarkus.io. Przykłady projektów do szybkiego startu są już dostępne na GitHub.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster