Jak Quarkus spojuje MicroProfile a Spring

Ahoj všem, a zde je třetí příspěvek ze série o Quarkusu!

Jak Quarkus spojuje MicroProfile a Spring

Při vývoji Java mikroslužeb je často považováno za samozřejmé, že Eclipse MicroProfile a Spring Boot je sbírka oddělených a na sobě nezávislých API. Vývojáři obvykle používají ty API, na kterých jsou zvyklí, protože osvojení nových rámců a runtime komponentů vyžaduje hodně času. Dnes se pokusíme zjednodušit osvojení některých populárních MicroProfile API pro Spring vývojáře a ukážeme, jak současně využít Spring API a nové užitečné funkce Quarkus.

Přesněji řečeno, nejprve si ukážeme, jaký je záběr a detaily, jak Quarkus podporuje Spring API, abychom ukázali Spring vývojářům, jak lze využít MicroProfile API v jejich každodenní práci. Poté se zaměříme na MicroProfile API, které budou pro Spring vývojáře užitečné při vytváření mikroslužeb.

Proč zrovna Quarkus? Za prvé, je tu live coding, tedy automatické opětovné načítání jakýchkoli změn v MicroProfile API, Spring API a dalších Java API, které se provádí jedním příkazem: mvn quarkus:dev. Za druhé, příkladem v našem případě služba Person (ta se sestavuje z API rozhraní Spring, MicroProfile a JPA do binárního souboru pomocí nativního obrazu GraalVM) se spustí za pouhých 0,055 sekundy a zabere přibližně 90 MB v operační paměti (RSS) na koncovém bodě aplikace RESTful. Přičemž samotná její kompilace probíhá jedním příkazem: mvn package -Pnative.

Nechceme jít příliš do hloubky ohledně MicroProfile, ale pokusíme se pomoci Spring vývojářům pochopit, jak lze v Quarkusu využít Spring API spolu s MicroProfile API.

Kontejnery a Kubernetes

Abychom tuto příručku nezaplnili příliš podrobnostmi, zaměříme se zde pouze na vysoce úrovňové aspekty podpory Kubernetes, což je důležité si uvědomit. Quarkus je prezentován jako Java stack pro Kubernetes, který má za cíl minimalizovat spotřebu paměti a dobu spuštění Java aplikací a služeb, a tím zvýšit jejich umístění na hostiteli a snížit celkové náklady.

Quarkus také podporuje automatické generování zdrojů Kubernetes a nabízí návody pro nasazení na platformách Kubernetes a Red Hat OpenShift. Kromě toho Quarkus automaticky generuje soubory Dockerfile.jvm (JVM balení) a Dockerfile.native (nativní binární balení), které jsou potřebné pro vytváření kontejnerů.

A nakonec, zaměřujíc se na Kubernetes jako na cílové prostředí nasazení, Quarkus nepoužívá Java frameworky tam, kde je podobná funkčnost implementována na úrovni samotné platformy Kubernetes. V tabulce 1 je uvedena mapa funkční shody Kubernetes a typických Java frameworků používaných vývojáři Spring.

Tabulka 1. Mapa funkční shody Java frameworků a Kubernetes.

Funkčnost
Tradiční Spring Boot
Kubernetes

Objevování služeb
Eureka
. Vytvořte A-záznam blog a určete pro něj nějakou fiktivní IP (to je oficiální

Konfigurace
Spring Cloud Config
Config Maps / Secrets

Zátěžové vyvažování
Ribbon (na straně klienta)
Služba, Replication Controller (na straně serveru)

Kompilace a spuštění kódu z příkladu

V tomto článku odkazujeme na příklad projektu, kde jsou společně používány API rozhraní Spring a MicroProfile a dokonce i ten samý Java třída. Kód z tohoto příkladu lze zkompilovat a spustit z příkazového řádku, podrobnosti viz soubor README.md.

API rozhraní Spring Framework

Závislostní injekce

Quarkus podporuje řadu API rozhraní Contexts and Dependency Injection (CDI) a API rozhraní Spring Dependency Injection (Spring DI). Pokud pracujete s MicroProfile, Java EE a Jakarta EE, už jste dobře obeznámeni s CDI. Na druhou stranu, vývojáři Spring mohou použít Quarkus Extension pro Spring DI API, aby zajistili kompatibilitu se Spring DI. Příklady použití podporovaných Spring DI API jsou uvedeny v tabulce 2.

V projektu z našeho příkladu se používá jak CDI, tak Spring Dependency Injection. Další informace a příklady na toto téma lze nalézt v průvodci Quarkus, který se nazývá Spring DI Guide.

Tabulka 2. Příklady použití podporovaných API rozhraní Spring DI.

Podporované funkce Spring DI
Příklady

Injekce konstruktoru

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

Injekce pole
Autowired
Hodnota

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

Komponenta

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

Služba

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

   public String getPrefix() {
      return message;
   }
}

Webový framework

Uživatelé MicroProfile ocení, že Quarkus podporuje JAX-RS, MicroProfile Rest Client, JSON-P a JSON-B jako hlavní model webového programování. Vývojáře Spring potěší nedávno přidaná podpora Spring Web API, zejména pro rozhraní odpovídající REST. Podobně jako u Spring DI je hlavním cílem podpory Spring Web API umožnit vývojářům Spring využívat API rozhraní Spring Web spolu s API rozhraními MicroProfile. Příklady použití podporovaných Spring Web API jsou uvedeny v tabulce 3 a další informace a příklady na toto téma naleznete v příručce Quarkus s názvem Příručka Spring Web.

Tabulka 3. Příklady použití podporovaných API rozhraní Spring Web.

Podporované funkce Spring Web
Příklady

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (částečně)

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

Spring Data JPA

Uživatelé MicroProfile také ocení, že Quarkus podporuje JPA pomocí Hibernate ORM. Pro vývojáře Spring je také skvělá zpráva, že Quarkus podporuje běžně používané anotace a typy Spring Data JPA. Příklady použití podporovaných API rozhraní Spring Data JPA jsou uvedeny v tabulce 4.
V projektu z našeho příkladu používají API rozhraní Spring Data JPA, a další informace jsou dostupné v příručce Quarkus s názvem Příručka Spring Data JPA.

Tabulka 4. Příklady použití podporovaných API rozhraní Spring Data JPA.

Podporované funkce Spring Data JPA
Příklady

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmenty repository

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

Odvozené metody dotazování

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Uživatelsky definované dotazy

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);
}

API rozhraní MicroProfile

Odolnost proti chybám

Konstruce tolerance k chybám jsou velmi důležité pro prevenci kaskádových selhání a pro vytváření spolehlivých mikroslužebních architektur. Vývojáři Spring už mnoho let používají pro zajištění spolehlivosti circuit-breakery. Hystrix. Nicméně Hystrix nebyl dlouho aktualizován, zatímco Fault Tolerance z MicroProfile se v současnosti aktivně vyvíjí a má za sebou už několik let produkčního používání. Proto se doporučuje pro zvýšení spolehlivosti služeb v Quarkusu používat API rozhraní MicroProfile Fault Tolerance, příklady použití jsou uvedeny v tabulce 5. Další informace o tom lze nalézt v průvodci Quarkus. Průvodce tolerancí k chybám.

Tabulka 5. Příklady použití podporovaných API rozhraní MicroProfile Fault Tolerance.

Funkce MicroProfile Fault Tolerance
Popis
Příklady

@Asynchronous

Provádění logiky v samostatném vlákna.

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

@Bulkhead

Omezení počtu současných požadavků.

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

@CircuitBreaker

Inteligentní zpracování selhání a obnovení po selhání.

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

@Fallback

Volání alternativní logiky v případě selhání.

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

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

Retry

Opakování při selhání požadavku.

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

Timeout

Kontrolní doba čekání při selhání.

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

Kontrola služeb (Service Health)

Platformy Kubernetes sledují stav kontejnerů pomocí speciálních služeb. Aby podkladová platforma mohla monitorovat služby, vývojáři Spring obvykle používají konfigurovatelné HealthIndicator a Spring Boot Actuator. V Quarkusu to lze udělat pomocí MicroProfile Health, které ve výchozím nastavení provádějí kontrolu funkčnosti (liveness check), ale mohou být také nastaveny na současnou kontrolu liveness a readiness (připravenosti). Příklady použití podporovaných API MicroProfile Health jsou uvedeny v tabulce 6, a další informace najdete v průvodci Quarkus. Průvodce zdravím.

Tabulka 6. Příklady použití podporovaných API rozhraní MicroProfile Health.

Funkce MicroProfile Health
Popis
Příklady

@Liveness

Platforma provádí restart nefunkčních kontejnerizovaných aplikací.
Endpoint:
host:8080/health/live

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

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

@Readiness

Platforma nebude posílat provoz do kontejnerizovaných aplikací, pokud nejsou připravené.
Endpoint:
host:8080/health/ready

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

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

Metriky

Aplikace poskytují metriky buď pro provozní účely (sledování výkonnostních SLA), nebo pro neprovozní (podnikové SLA). Vývojáři Spring poskytují metriky pomocí Spring Boot Actuator a Micrometer. Na druhé straně Quarkus používá MicroProfile Metrics k zajištění základních metrik (JVM a operační systém), metriky dodavatele (Quarkus) a metriky aplikací. MicroProfile Metrics vyžaduje, aby implementace podporovala výstupní formáty JSON a OpenMetrics (Prometheus). Příklady použití API MicroProfile Metrics jsou uvedeny v tabulce 7.

V projektu z našeho příkladu MicroProfile Metrics se používají k poskytování metrik aplikace. Další informace najdete v příručce Quarkus. Příručka k metrikám.

Tabulka 7. Příklady použití API MicroProfile Metrics.

Funkce MicroProfile Metrics
Popis
Příklady

@Counted

Oz označuje counter, který počítá počet volání anotovaného objektu.

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

@ConcurrentGauge

Oz označuje gauge, který počítá počet paralelních volání anotovaného objektu.

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

@Gauge

Oz označuje gauge, který měří hodnotu anotovaného objektu.

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

@Metered

Oz označuje meter, který sleduje frekvenci volání anotovaného objektu.

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

Metrika

Anotace obsahující informace o metadatech při příjmu požadavku na vytvoření nebo výrobu metriky.

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

Časová osa

Oz označuje časovač, který sleduje trvání anotovaného objektu.

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

Koncové body metrik (Metrics Endpoints)

Metriky aplikací localhost:8080/metrics/application
Základní metriky localhost:8080/metrics/base
Vendor metriky localhost:8080/metrics/vendor
Všechny metriky localhost:8080/metrics

Rest klient MicroProfile

Mikroslužby často poskytují koncové body RESTful, pro jejichž použití jsou potřeba odpovídající klientské API. K práci s RESTful koncovými body obvykle vývojáři Spring používají RestTemplate. Quarkus však nabízí pro tento úkol API rozhraní MicroProfile Rest Client, jejichž příklady použití jsou uvedeny v tabulce 8.

V projektu z našeho příkladu Použití RESTful koncových bodů se provádí pomocí MicroProfile Rest Client. Další informace a příklady naleznete v průvodci Quarkus Průvodce Rest Client.

Tabulka 8. Příklady použití API rozhraní MicroProfile Rest Client.

Funkce MicroProfile Rest Client
Popis
Příklady

@RegisterRestClient

Registruje typizované Java rozhraní jako REST klienta

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

@RestClient

Oz označuje injekci instance typizovaného rozhraní REST klienta

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

Invocation

Volá koncový bod REST

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

mp-rest/url

Stanoví koncový bod REST

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

Závěry

V tomto blogu, který bude primárně užitečný pro vývojáře Spring, se stručně podíváme na to, jak v Quarkus používat API rozhraní Spring spolu s API rozhraními MicroProfile k vyvíjení mikroslužeb Java a následnému kompilování do nativního binárního kódu, který šetří stovky megabajtů RAM a startuje během několika milisekund.

Jak jste asi pochopili, další informace o podpoře API rozhraní Spring a MicroProfile, stejně jako spoustu dalších užitečných informací, naleznete v průvodcích Quarkus.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster