Ako Quarkus kombinuje MicroProfile a Spring

Ahojte všetci, tu je tretí príspevok v sérii Quarkus!

Ako Quarkus kombinuje MicroProfile a Spring

Pri vývoji mikroslužieb Java sa často verí, že Microprofile Eclipse и Jarná topánka sú samostatné a nezávislé API. Programátori majú štandardne tendenciu používať API, na ktoré sú už zvyknutí, pretože učenie sa nových rámcov a runtime komponentov zaberie veľa času. Dnes sa pokúsime zjednodušiť vývoj niektorých populárnych MicroProfile API pre vývojárov Spring a ukážeme vám, ako súčasne používať Spring API a nové užitočné funkcie kvarkus.

Trochu podrobnejšie sa najprv pozrieme na rozsah a podrobnosti o tom, ako Quarkus podporuje Spring API, aby sme vývojárom Spring ukázali, ako používať MicroProfile API pri ich každodennej práci. Potom sa budeme venovať rozhraniam MicroProfile API, ktoré sú užitočné pre vývojárov Spring pri vytváraní mikroslužieb.

Prečo práve Quarkus? Po prvé, ide o živé kódovanie, teda automatické opätovné načítanie akýchkoľvek zmien v MicroProfile API, Spring API a iných Java API, ktoré sa vykonáva iba jedným príkazom: mvn quarkus:dev. Po druhé, diskutované v v našom príklade služba Person (ktorá sa kompiluje z rozhraní Spring, MicroProfile a JPA API do binárneho súboru pomocou natívneho obrazu GraalVM) sa spustí len za 0.055 sekundy a zaberá približne 90 MB RAM (RSS) na koncovom bode aplikácie RESTful. Navyše, jeho samotná kompilácia sa vykonáva iba jedným príkazom: mvn package -Pnative.

Nebudeme zachádzať do podrobností o MicroProfile, okrem toho, aby sme pomohli vývojárom Spring pochopiť, ako môžu používať Spring API s MicroProfile API v Quarkus.

Kontajnery a Kubernetes

Aby bol tento článok jednoduchý, budeme sa tu venovať iba aspektom podpory na vysokej úrovni. Kubernetes, pretože je dôležité pochopiť. Quarkus je umiestnený ako Java stack pre Kubernetes, je navrhnutý tak, aby minimalizoval spotrebu pamäte a čas spúšťania Java aplikácií a služieb, a v dôsledku toho zvýšil ich hustotu na hostiteľovi a znížil celkové náklady.

Quarkus tiež podporuje automatické generovanie Zdroje a ponuky Kubernetes sprievodcov na nasadenie na platformách Kubernetes a Red Hat OpenShift. Okrem toho Quarkus automaticky generuje súbory Dockerfile.jvm (balenie JVM) a Dockerfile.native (natívne binárne balenie) potrebné na vytváranie kontajnerov.

Nakoniec, tým, že sa Quarkus zameral na Kubernetes ako cieľové prostredie nasadenia, nepoužíva frameworky Java v prípadoch, keď je podobná funkcionalita implementovaná na úrovni samotnej platformy Kubernetes. Tabuľka 1 poskytuje mapu funkčnej korešpondencie medzi Kubernetes a typickými frameworkami Java, ktoré používajú vývojári Spring.

Tabuľka 1. Mapa funkčnej korešpondencie medzi frameworkami Java a Kubernetes.

funkčné
Tradičné jarné čižmy
Kubernetes

Objavenie služby
Eureka
DNS

konfigurácia
Jarná konfigurácia cloudu
Konfigurácia máp/tajomstiev

Rozdelenie výkonu
Stuha (strana klienta)
Služba, kontrolér replikácie (strana servera)

Kompilácia a spustenie kódu z príkladu

V tomto článku sa odvolávame ukážkový projekt, kde sa spolu používajú rozhrania API Spring a MicroProfile a dokonca aj rovnaká trieda Java. Kód v tomto príklade je možné skompilovať a spustiť z príkazového riadku, podrobnosti nájdete v súbore README.md.

Spring Framework API

Injekcia závislostí

Quarkus podporuje celý rad Kontexty a rozhrania API pre vstrekovanie závislostí (CDI). a Spring Dependency Injection (Spring DI) API. Ak pracujete s MicroProfile, Java EE a Jakarta EE, potom už CDI dobre poznáte. Na druhej strane, vývojári Spring môžu použiť Quarkus Extension for Spring DI API na dosiahnutie kompatibility s Spring DI. Príklady použitia podporovaných rozhraní Spring DI API sú uvedené v tabuľke 2.

В projekt z nášho príkladu Používa CDI aj Spring Dependency Injection. Ďalšie informácie a príklady na túto tému nájdete v príručke Quarkus s názvom Pružinový DI sprievodca.

Tabuľka 2. Príklady použitia podporovaných rozhraní API Spring DI.

Podporované funkcie Spring DI
príklady

Konštrukčné vstrekovanie

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

Poľná injekcia
Automaticky zapojené
Hodnota

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bob
@Konfigurácia

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

Zložka

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

Služba sa

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

   public String getPrefix() {
      return message;
   }
}

Webový rámec

Používatelia MicroProfile budú milovať, že Quarkus podporuje JAX-RS, MicroProfile Rest Client, JSON-P a JSON-B ako primárny webový programovací model. Jarných vývojárov poteší nedávna podpora Quarkusu pre Spring Web API, najmä rozhrania REST. Podobne ako pri Spring DI, hlavným cieľom podpory Spring Web API je umožniť vývojárom Spring používať Spring Web API v spojení s MicroProfile API. Príklady použitia podporovaných rozhraní Spring Web API sú uvedené v tabuľke 3 a ďalšie informácie a príklady na túto tému nájdete v návode Quarkus s názvom Jarný webový sprievodca.

Tabuľka 3. Príklady použitia podporovaných rozhraní Spring Web API.

Podporované jarné webové funkcie
príklady

@RestController
@RequestMapping

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

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

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

Jarné údajeJPA

Používatelia MicroProfile tiež ocenia, že Quarkus podporuje JPA pomocou Hibernate ORM. Je tu tiež dobrá správa pre vývojárov Spring: Quarkus podporuje bežné anotácie a typy Spring Data JPA. Príklady použitia podporovaných rozhraní Spring Data JPA API sú uvedené v tabuľke 4.
В projekt z nášho príkladu Používajú sa rozhrania API JPA Spring Data a ďalšie informácie sú k dispozícii v návode Quarkus s názvom Spring Data JPA Guide.

Tabuľka 4. Príklady používania podporovaných rozhraní API Spring Data JPA.

Podporované funkcie Spring Data JPA
príklady

CrudRepository

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

sklad
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmenty úložiska

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

Odvodené metódy dotazov

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Používateľom 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);
}

MicroProfile API

Odolnosť proti chybám

Konštrukcie odolnosti voči chybám sú veľmi dôležité na predchádzanie kaskádovým zlyhaniam a vytváranie spoľahlivých architektúr mikroslužieb. Vývojári Spring používajú ističe na odolnosť voči poruchám už mnoho rokov. Hystrix. Hystrix však nebol dlho aktualizovaný, no MicroProfile’s Fault Tolerance sa teraz aktívne rozvíja a má za sebou niekoľkoročné produkčné využitie. Preto sa na zlepšenie spoľahlivosti služieb v Quarkus odporúča používať rozhrania MicroProfile Fault Tolerance API, ktorých príklady sú použité v tabuľke 5. Viac informácií nájdete v príručke Quarkus Sprievodca odolnosťou voči chybám.

Tabuľka 5. Príklady použitia podporovaných rozhraní API MicroProfile Fault Tolerance.

Funkcie odolnosti proti chybám MicroProfile
Popis
príklady

@Asynchrónne

Vykonávanie logiky v samostatnom vlákne

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

@Bulkhead

Obmedzte počet súčasných žiadostí

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

@Istič

Inteligentné riešenie porúch a zotavenie z porúch

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

@Fallback

Volanie alternatívnej logiky v prípade zlyhania

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

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

Opakovať

Skúste to znova pri zlyhaní žiadosti

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

Timeout

Časový limit kontroly zlyhania

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

Kontrola služieb (stav služby)

Platformy Kubernetes monitorujú stav kontajnerov pomocou špeciálnych služieb. Aby mohla základná platforma monitorovať služby, vývojári Spring zvyčajne používajú vlastný HealthIndicator a Spring Boot Actuator. V Quarkus sa to dá urobiť pomocou MicroProfile Health, ktorý štandardne vykonáva kontrolu živosti, ale dá sa nakonfigurovať tak, aby súčasne kontrolovala živosť a pripravenosť. Príklady použitia podporovaných API MicroProfile Health sú uvedené v tabuľke 6 a ďalšie informácie sú uvedené v príručke Quarkus Sprievodca zdravím.

Tabuľka 6: Príklady použitia podporovaných rozhraní API MicroProfile Health.

Funkcie MicroProfile Health
Popis
príklady

@Životnosť

Platforma reštartuje neúspešné kontajnerové aplikácie
koncový bod:
hostiteľ: 8080/zdravie/živo

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

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

@Pripravenosť

Platforma nebude posielať návštevnosť do kontajnerových aplikácií, ak nie je pripravená
koncový bod:
hostiteľ: 8080/zdravie/pripravené

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

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

Metriky

Aplikácie poskytujú metriky buď na prevádzkové účely (na monitorovanie výkonu SLA) alebo na neprevádzkové účely (obchodné SLA). Spring vývojári poskytujú metriky pomocou Spring Boot Actuator a Micrometer. Quarkus zase používa MicroProfile Metrics na poskytovanie základných metrík (JVM a operačný systém), metrík dodávateľov (Quarkus) a metrík aplikácií. MicroProfile Metrics vyžaduje, aby implementácia podporovala výstupné formáty JSON a OpenMetrics (Prometheus). Príklady použitia MicroProfile Metrics API sú uvedené v tabuľke 7.

В projekt z nášho príkladu MicroProfile Metrics sa používajú na poskytovanie metrík aplikácie. Viac informácií nájdete v príručke Quarkus Sprievodca metrikami.

Tabuľka 7. Príklady použitia MicroProfile Metrics API.

Funkcie metrík MicroProfile
Popis
príklady

@Počítané

Označuje počítadlo počítadla, ktoré počíta, koľkokrát bol anotovaný objekt vyvolaný

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

@ConcurrentGauge

Označuje meradlo, ktoré počíta počet súbežných volaní na anotovaný objekt

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

@Gauge

Označuje merací senzor, ktorý meria hodnotu anotovaného objektu

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

@Metered

Označuje merací senzor, ktorý monitoruje frekvenciu hovorov anotovaného objektu

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

metrický

Anotácia obsahujúca informácie o metadátach pri prijatí požiadavky na zadanie alebo vytvorenie metriky

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

načasovaný

Označuje časovač, ktorý sleduje trvanie anotovaného objektu

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

Koncové body metrík

Aplikačné metriky localhost:8080/metrika/aplikácia
Základné metriky localhost:8080/metrika/základ
Metriky dodávateľa localhost:8080/metrika/dodávateľ
Všetky metriky localhost:8080/metrika

Klient pre zvyšok MicroProfile

Mikroslužby často poskytujú koncové body RESTful, ktoré na prácu vyžadujú zodpovedajúce klientske rozhrania API. Na používanie koncových bodov RESTful vývojári Spring zvyčajne používajú RestTemplate. Quarkus ponúka na vyriešenie tohto problému rozhrania MicroProfile Rest Client API, ktorých príklady použitia sú uvedené v tabuľke 8.

В projekt z nášho príkladu používanie koncových bodov RESTful sa vykonáva pomocou klienta MicroProfile Rest. Viac informácií a príkladov na túto tému nájdete v príručke Quarkus Sprievodca klienta Rest.

Tabuľka 8. Príklady použitia MicroProfile Rest Client API.

Funkcie klienta pre zvyšok MicroProfile
Popis
príklady

@RegisterRestClient

Registruje napísané rozhranie Java ako klienta REST

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

@RestClient

Označuje implementáciu inštancie typizovaného klientskeho rozhrania REST

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

invokácie

Volá koncový bod REST

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

mp-rest/url

Určuje koncový bod REST

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

Výsledky

V tomto blogu, ktorý je zameraný predovšetkým na vývojárov Spring, sme sa rýchlo pozreli na to, ako používať Spring API s MicroProfile API v Quarkus na vývoj Java mikroslužieb a potom ich skompilovať do natívneho binárneho kódu, ktorý ušetrí stovky megabajtov RAM a spustí sa v otázkou milisekúnd.

Ako ste už pochopili, viac informácií o podpore rozhraní Spring a MicroProfile API, ako aj množstvo ďalších užitočných informácií nájdete v Quarkus manuály.

Zdroj: hab.com

Pridať komentár