Witam wszystkich, oto trzeci post z serii Quarkus!
Często uważa się, że podczas tworzenia mikrousług Java
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
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.
Quarkus też
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
API Spring Framework
Wstrzykiwanie zależności
Quarkus obsługuje szereg
В
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
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguracja
@Configuration
public class AppConfiguration {
@Bean(name = "capitalizeFunction")
public StringFunction capitalizer() {
return String::toUpperCase;
}
}
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
@Override
public String apply(String s) {
return s;
}
}
@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.
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.
В
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.
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";
}
Ponów próbę w przypadku niepowodzenia żądania
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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
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.
В
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;
}
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;
}
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
Podstawowe metryki
Metryki dostawców
Wszystkie metryki
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.
В
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
Źródło: www.habr.com