Jak Quarkus łączy MicroProfile i Spring

Witam wszystkich, oto trzeci post z serii Quarkus!

Jak Quarkus łączy MicroProfile i Spring

Często uważa się, że podczas tworzenia mikrousług Java Mikroprofil Eclipse и Buty sprężynowe są oddzielnymi i niezależnymi interfejsami API. Domyślnie programiści zwykle korzystają z interfejsów API, do których są już przyzwyczajeni, ponieważ nauka nowych frameworków i komponentów wykonawczych zajmuje dużo czasu. Dzisiaj postaramy się uprościć rozwój niektórych popularnych MicroProfile API dla programistów Springa i pokaże Ci, jak jednocześnie korzystać z Spring API i nowych przydatnych funkcji kwarkus.

Bardziej szczegółowo, najpierw przyjrzymy się zakresowi i szczegółom, w jaki sposób Quarkus obsługuje API Springa, aby pokazać programistom Springa, jak korzystać z API MicroProfile w codziennej pracy. Następnie omówimy interfejsy API MicroProfile, które są przydatne dla programistów Springa podczas tworzenia mikrousług.

Dlaczego Quarkus? Po pierwsze, jest to kodowanie na żywo, czyli automatyczne ponowne ładowanie wszelkich zmian w MicroProfile API, Spring API i innych Java API, które wykonuje się za pomocą tylko jednego polecenia: mvn quarkus:dev. Po drugie, rozważane w w naszym przykładzie usługa Person (która kompiluje się z interfejsów API Spring, MicroProfile i JPA do postaci binarnej przy użyciu natywnego obrazu GraalVM) uruchamia się w zaledwie 0.055 sekundy i zajmuje około 90 MB pamięci RAM (RSS) w punkcie końcowym aplikacji RESTful. Co więcej, sama kompilacja odbywa się za pomocą tylko jednego polecenia: mvn package -Pnative.

Nie będziemy wdawać się w szczegóły dotyczące MicroProfile poza tym, aby pomóc programistom Springa zrozumieć, w jaki sposób mogą używać Spring API z API MicroProfile w Quarkus.

Kontenery i Kubernetes

Aby uprościć ten artykuł, omówimy tutaj tylko ogólne aspekty wsparcia. Kubernetes, bo ważne jest, aby zrozumieć. Quarkus jest pozycjonowany jako stos Java dla Kubernetes, ma za zadanie zminimalizować zużycie pamięci i czas uruchamiania aplikacji i usług Java, a w rezultacie zwiększyć ich gęstość na hoście i zmniejszyć całkowite koszty.

Quarkus też obsługuje automatyczne generowanie Zasoby i oferty Kubernetes przewodnicy do wdrożenia na platformach Kubernetes i Red Hat OpenShift. Ponadto Quarkus automatycznie generuje pliki Dockerfile.jvm (pakowanie JVM) i Dockerfile.native (natywne pakowanie binarne) potrzebne do tworzenia kontenerów.

Wreszcie, skupiając się na Kubernetesie jako docelowym środowisku wdrożeniowym, Quarkus nie korzysta z frameworków Java w przypadkach, gdy podobna funkcjonalność jest implementowana na poziomie samej platformy Kubernetes. Tabela 1 przedstawia mapę zależności funkcjonalnej pomiędzy Kubernetesem a typowymi frameworkami Java używanymi przez programistów Springa.

Tabela 1. Mapa powiązań funkcjonalnych pomiędzy frameworkami Java i Kubernetes.

Funkcjonalne
Tradycyjne buty wiosenne
Kubernetes

Wykrywanie usług
Eureka
DNS

systemu
Wiosenna konfiguracja chmury
Skonfiguruj mapy/sekrety

Równoważenie obciążenia
Wstążka (po stronie klienta)
Usługa, kontroler replikacji (po stronie serwera)

Kompilacja i uruchomienie kodu z przykładu

W tym artykule wspominamy przykładowy projekt, gdzie interfejsy API Spring i MicroProfile, a nawet ta sama klasa Java są używane razem. Kod w tym przykładzie można skompilować i uruchomić z wiersza poleceń. Aby uzyskać szczegółowe informacje, zobacz plik README.md.

API Spring Framework

Wstrzykiwanie zależności

Quarkus obsługuje szereg Konteksty i interfejsy API wstrzykiwania zależności (CDI). oraz interfejsy API polegające na wstrzykiwaniu zależności Spring (Spring DI). Jeśli pracujesz z MicroProfile, Java EE i Dżakarta EE, oznacza to, że znasz już CDI. Z drugiej strony programiści Springa mogą użyć rozszerzenia Quarkus dla API Spring DI, aby osiągnąć kompatybilność ze Spring DI. Przykłady wykorzystania obsługiwanych API Spring DI podano w Tabeli 2.

В projekt z naszego przykładu Używa zarówno CDI, jak i wtrysku zależności Spring. Więcej informacji i przykładów na ten temat można znaleźć w poradniku Quarkus pt Przewodnik po wiosennym DI.

Tabela 2. Przykłady wykorzystania obsługiwanych API Spring DI.

Obsługiwane funkcje Spring DI
Примеры

wtrysk konstruktora

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

Wtrysk terenowy
Automatyczny
wartość

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

Fasola
@Konfiguracja

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Składnik

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

Usługi

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

Struktura internetowa

Użytkownicy MicroProfile z pewnością pokochają fakt, że Quarkus obsługuje JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B jako podstawowy model programowania sieciowego. Programiści Springa będą zadowoleni z niedawnego wsparcia Quarkus dla Spring Web API, w szczególności interfejsów REST. Podobnie jak w przypadku Spring DI, głównym celem obsługi Spring Web API jest umożliwienie programistom Spring korzystania z Spring Web API w połączeniu z API MicroProfile. Przykłady wykorzystania obsługiwanych API Spring Web przedstawiono w Tabeli 3, a więcej informacji i przykładów na ten temat można znaleźć w samouczku Quarkus pt. Wiosenny przewodnik internetowy.

Tabela 3. Przykłady wykorzystania obsługiwanych API Spring Web.

Obsługiwane funkcje sieciowe Spring
Примеры

@Prawdziwca
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@UsuńMapowanie
@PatchMapping
@RequestParam
@Nagłówek żądania
@MatrixZmienna
@Zmienna ścieżki
@CookieValue
@RequestBody
@Status odpowiedzi
@ExceptionHandler
@RestControllerAdvice (częściowy)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Wiosna danych JPA

Użytkownicy MicroProfile docenią również to, że Quarkus obsługuje JPA przy użyciu Hibernate ORM. Jest też dobra wiadomość dla programistów Springa: Quarkus obsługuje typowe adnotacje i typy Spring Data JPA. Przykłady wykorzystania obsługiwanych API Spring Data JPA podano w Tabeli 4.
В projekt z naszego przykładu Używane są interfejsy API Spring Data JPA, a więcej informacji można znaleźć w samouczku Quarkus o nazwie Przewodnik po JPA Spring Data.

Tabela 4. Przykłady wykorzystania obsługiwanych API Spring Data JPA.

Obsługiwane funkcje Spring Data JPA
Примеры

Repozytorium Crud

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Magazyn
Repozytorium Jpa
Repozytorium stronicowania i sortowania

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmenty repozytorium

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Pochodne metody zapytań

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Zapytania zdefiniowane przez użytkownika

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

Interfejsy API MicroProfile

Tolerancja błędów

Konstrukcje odporności na błędy są bardzo ważne w zapobieganiu kaskadowym awariom i tworzeniu niezawodnych architektur mikrousług. Projektanci sprężyn stosują wyłączniki automatyczne w celu zapewnienia odporności na uszkodzenia od wielu lat. Hystrix. Jednak Hystrix nie był aktualizowany przez długi czas, ale odporność na błędy MicroProfile jest obecnie aktywnie rozwijana i ma za sobą kilka lat użytkowania produkcyjnego. Dlatego w celu poprawy niezawodności usług w Quarkusie zaleca się korzystanie z API MicroProfile Fault Tolerance, których przykłady przedstawiono w Tabeli 5. Więcej informacji na ten temat można znaleźć w instrukcji Quarkus Przewodnik dotyczący tolerancji błędów.

Tabela 5. Przykłady użycia obsługiwanych interfejsów API MicroProfile Fault Tolerance.

Funkcje tolerancji błędów MicroProfile
Opis
Примеры

@Asynchroniczny

Wykonywanie logiki w osobnym wątku

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@Przegroda

Ogranicz liczbę jednoczesnych żądań

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@Wyłącznik obwodu

Inteligentna obsługa awarii i odzyskiwanie po awariach

@CircuitBreaker(delay=500   // milliseconds
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

Wywoływanie alternatywnej logiki w przypadku awarii

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

Spróbować ponownie

Ponów próbę w przypadku niepowodzenia żądania

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

Timeout

Limit czasu kontroli awarii

@Timeout(value = 500 )   // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

Sprawdzanie usług (kondycja usług)

Platformy Kubernetes monitorują stan kontenerów za pomocą specjalnych usług. Aby umożliwić platformie bazowej monitorowanie usług, programiści Spring zazwyczaj używają niestandardowego wskaźnika HealthIndicator i siłownika Spring Boot. W Quarkusie można to zrobić za pomocą MicroProfile Health, który domyślnie przeprowadza kontrolę żywotności, ale można go skonfigurować tak, aby jednocześnie sprawdzał żywotność i gotowość. Przykłady wykorzystania obsługiwanych interfejsów API MicroProfile Health znajdują się w Tabeli 6, a dodatkowe informacje znajdują się w podręczniku Quarkus Przewodnik zdrowotny.

Tabela 6: Przykłady użycia obsługiwanych interfejsów API MicroProfile Health.

Funkcje MicroProfile Health
Opis
Примеры

@Żywotność

Platforma ponownie uruchamia aplikacje kontenerowe, które uległy awarii
Punkt końcowy:
host:8080/zdrowie/na żywo

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Gotowość

Platforma nie będzie wysyłać ruchu do aplikacji skonteneryzowanych, jeśli nie będzie gotowa
Punkt końcowy:
host:8080/zdrowie/gotowy

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Metryka

Aplikacje udostępniają metryki do celów operacyjnych (do monitorowania wydajności umów SLA) lub do celów nieoperacyjnych (biznesowe umowy SLA). Programiści Spring udostępniają metryki za pomocą siłownika Spring Boot i mikrometru. Z kolei Quarkus wykorzystuje metryki MicroProfile do dostarczania metryk bazowych (JVM i system operacyjny), metryk dostawców (Quarkus) i metryk aplikacji. MicroProfile Metrics wymaga, aby implementacja obsługiwała formaty wyjściowe JSON i OpenMetrics (Prometheus). Przykłady wykorzystania interfejsu API MicroProfile Metrics podano w Tabeli 7.

В projekt z naszego przykładu Metryki MicroProfile służą do dostarczania metryk aplikacji. Więcej informacji można znaleźć w instrukcji obsługi Quarkus Przewodnik po metrykach.

Tabela 7. Przykłady użycia interfejsów API MicroProfile Metrics.

Funkcje metryk MicroProfile
Opis
Примеры

@Policzone

Oznacza licznik, który zlicza liczbę wywołań obiektu z adnotacjami

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Oznacza miernik, który zlicza liczbę równoczesnych wywołań obiektu z adnotacjami

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@Miernik

Oznacza czujnik miernika, który mierzy wartość obiektu z adnotacją

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@Mierzony

Oznacza czujnik licznika, który monitoruje częstotliwość wywoływania obiektu z adnotacjami

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

metryczny

Adnotacja zawierająca informacje o metadanych po otrzymaniu żądania wprowadzenia lub wygenerowania metryki

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Czasowy

Wskazuje licznik czasu śledzący czas trwania obiektu z adnotacjami

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

Punkty końcowe metryk

Metryki aplikacji localhost:8080/metryka/aplikacja
Podstawowe metryki localhost:8080/metryka/podstawa
Metryki dostawców localhost:8080/metryka/dostawca
Wszystkie metryki localhost:8080/metryka

Klient restowy MicroProfile

Mikrousługi często zapewniają punkty końcowe RESTful, które wymagają odpowiednich interfejsów API klienta do pracy. Aby korzystać z punktów końcowych RESTful, programiści Spring zazwyczaj używają RestTemplate. Aby rozwiązać ten problem, firma Quarkus oferuje interfejsy API klienta MicroProfile Rest Client, których przykłady użycia podano w tabeli 8.

В projekt z naszego przykładu korzystanie z punktów końcowych RESTful odbywa się za pomocą klienta MicroProfile Rest. Więcej informacji i przykładów na ten temat znajdziesz w instrukcji Quarkus Przewodnik dla klienta odpoczynku.

Tabela 8. Przykłady użycia interfejsów API klienta MicroProfile Rest.

Funkcje klienta restowego MicroProfile
Opis
Примеры

@RegisterRestClient

Rejestruje wpisany interfejs Java jako klient REST

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestKlient

Oznacza implementację instancji wpisanego interfejsu klienta REST

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

Wezwanie

Wywołuje punkt końcowy REST

System.out.println(
   restClient.getSalutation());

mp-rest/url

Określa punkt końcowy REST

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Wyniki

Na tym blogu, skierowanym głównie do programistów Springa, szybko przyjrzeliśmy się, jak używać interfejsów API Springa z interfejsami API MicroProfile w programie Quarkus do tworzenia mikrousług Java, a następnie kompilować je do natywnego kodu binarnego, który oszczędza setki megabajtów pamięci RAM i uruchamia się w kwestia milisekund.

Jak już zrozumiałeś, więcej informacji na temat obsługi API Spring i MicroProfile, a także wiele innych przydatnych informacji można znaleźć w Podręczniki Quarkusa.

Źródło: www.habr.com

Dodaj komentarz