Ako Quarkus spája MicroProfile a Spring

Ahojte všetci, a toto je tretí príspevok zo série o Quarkuse!

Ako Quarkus spája MicroProfile a Spring

Pri vývoji Java mikroslužieb sa často predpokladá, že Eclipse MicroProfile a Spring Boot sú to samostatné a nezávislé API. Vo väčšine prípadov vývojári používajú tie API, na ktoré sú už zvyknutí, pretože učenie nových rámcov a runtime komponentov si vyžaduje veľa času. Dnes sa pokúsime zjednodušiť osvojenie niektorých populárnych MicroProfile API pre Spring vývojárov a ukážeme, ako súčasne využiť Spring API a nové užitočné funkcie. Quarkus.

Ak podrobnejšie, najprv preskúmame oblasť použitia a detaily toho, ako Quarkus podporuje API rozhrania Spring, aby sme ukázali Spring vývojárom, ako môžu aplikovať MicroProfile API vo svojej každodennej práci. Potom sa zameriame na MicroProfile API, ktoré budú užitočné Spring vývojárom pri vytváraní mikroslužieb.

Prečo práve Quarkus? Po prvé, ide o live coding, teda automatické načítanie akýchkoľvek zmien v MicroProfile API, Spring API a iných Java API, ktoré sa vykonáva iba jednou príkazom: mvn quarkus:dev. Po druhé, predmetom nášho príkladu je služba Person (ktorá sa kompiluje z API rozhraní Spring, MicroProfile a JPA do binárneho súboru za použitia natívneho obrazu GraalVM) sa spúšťa iba za 0,055 sekundy a zaberá približne 90 MB v operačnej pamäti (RSS) na koncovej adrese RESTful aplikácie. Samotná kompilácia sa vykonáva jedným príkazom: mvn package -Pnative. Nebudeme sa hlbšie zaoberať podrobnosťami MicroProfile, ale pokúsime sa pomôcť Spring vývojárom pochopiť, ako v Quarkuse využívať API rozhrania Spring spolu s API rozhraniami MicroProfile.

Kontajnery a Kubernetes

Aby sme nezaťažovali tento článok, tu sa zameriame len na vysokú úroveň podpory

, pretože je to dôležité na pochopenie. Quarkus sa prezentuje ako Java stack pre Kubernetes, jeho cieľom je minimalizovať spotrebu pamäte a čas spustenia Java aplikácií a služieb, a teda zvýšiť ich umiestnenie na hostiteľovi a znížiť celkové náklady. KubernetesQuarkus tiež

podporuje automatickú generáciu zdrojov Kubernetes a ponúka spôsoby nasadenia na platformách Kubernetes a Red Hat OpenShift. Okrem toho, Quarkus automaticky generuje súbory Dockerfile.jvm (JVM packaging) a Dockerfile.native (native binary packaging), ktoré sú potrebné na vytvorenie kontajnerov. príručky по развертыванию на платформах Kubernetes и Red Hat OpenShift. Кроме того, Quarkus автоматически генерирует файлы Dockerfile.jvm (JVM packaging) и Dockerfile.native (native binary packaging), необходимые для создания контейнеров.

A nakoniec, s ohľadom na Kubernetes ako cieľové prostredie nasadzovania, Quarkus nepoužíva Java rámce tam, kde je podobná funkcia implementovaná na úrovni samotnej platformy Kubernetes. V tabuľke 1 je uvedená mapa funkčného zodpovedania Kubernetes a typických Java rámcov používaných vývojármi Spring.

Tabuľka 1. Mapa funkčného zodpovedania Java rámcov a Kubernetes.

Funkcionalita
Tradičný Spring Boot
Kubernetes

Objavovanie služieb
Eureka
DNS

Konfigurácia
Spring Cloud Config
Config Maps / Secrets

Vyrovnávanie záťaže
Ribbon (na strane klienta)
Služba, Replication Controller (na strane servera)

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

V tomto článku sa odvolávame na príklad projektu, kde sú spoločne používané API rozhrania Spring a MicroProfile a dokonca ten istý Java trieda. Kód z tohto príkladu je možné skompilovať a spustiť z príkazového riadka, viac informácií pozri v súbore README.md.

API rozhrania Spring Framework

Dependency Injection

Quarkus podporuje celú radu API rozhrania Contexts and Dependency Injection (CDI) a API rozhrania Spring Dependency Injection (Spring DI). Ak pracujete s MicroProfile, Java EE a Jakarta EE, ste už dobre oboznámení s CDI. Na druhej strane, vývojári Spring môžu použiť Quarkus Extension pre Spring DI API na zabezpečenie kompatibility so Spring DI. Príklady využitia podporovaných API rozhraní Spring DI sú uvedené v tabuľke 2.

V projektoch z nášho príkladu sa používa ako CDI, tak aj Spring Dependency Injection. Ďalšie informácie a príklady na túto tému nájdete v príručke Quarkus, ktorá sa volá Spring DI Guide.

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

Podporované funkcie Spring DI
Príklady

Konstruktorová injekcia

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

Injekcia poľa
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;
   }
}

Komponent

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

Service

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

   public String getPrefix() {
      return message;
   }
}

Webový rámec

Používatelia MicroProfile ocenia, že Quarkus podporuje JAX-RS, MicroProfile Rest Client, JSON-P a JSON-B ako hlavnú modelovú architektúru webového programovania. Vývojárov Spring poteší, že Quarkus nedávno začal podporovať Spring Web API, konkrétne rozhrania zodpovedné za REST. Podobne ako pri Spring DI, hlavný cieľ podpory Spring Web API je, aby mohli vývojári Spring používať API rozhrania Spring Web spolu s API rozhraniami MicroProfile. Príklady použitia podporovaných Spring Web API sú uvedené v tabuľke 3, a ďalšie informácie a príklady na túto tému sú k dispozícii v príručke Quarkus s názvom Spring Web Guide.

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

Podporované funkcie Spring Web
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čne)

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

Spring Data JPA

Používatelia MicroProfile si tiež prídu na svoje, lebo Quarkus podporuje JPA s použitím Hibernate ORM. Pre vývojárov Spring je dobrá správa aj to, že Quarkus podporuje bežné anotácie a typy Spring Data JPA. Príklady použitia podporovaných Spring Data JPA API sú uvedené v tabuľke 4.
V projektoch z nášho príkladu sa používajú API rozhrania Spring Data JPA, a ďalšie informácie sú dostupné v príručke Quarkus s názvom Spring Data JPA Guide.

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

Podporované funkcie Spring Data JPA
Príklady

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

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

Odvodené metódy dopytu

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é dopyty

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 rozhrania MicroProfile

Odolnosť voči chybám (Fault tolerance)

Konštrukcie odolnosti voči chybám sú veľmi dôležité na prevenciu kaskádových zlyhaní a na vytváranie spoľahlivých mikroservisných architektúr. Spring vývojári už mnoho rokov používajú pre odolnosť voči chybám obvody prerušenia. Hystrix. Avšak Hystrix už dlho nebol aktualizovaný, zatiaľ čo MicroProfile-ovská odolnosť voči chybám sa aktuálne aktívne vyvíja a má za sebou už niekoľko rokov produkčného používania. Preto sa na zvýšenie spoľahlivosti služieb v Quarkuse odporúča aplikovať API rozhrania MicroProfile Fault Tolerance, príklady použitia sú uvedené v tabuľke 5. Ďalšie informácie nájdete v príručke Quarkus. Príručka odolnosti voči chybám.

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

Funkcie MicroProfile Fault Tolerance
Popis
Príklady

@Asynchronous

Vykonávanie logiky v samostatnom vlákne

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

@Bulkhead

Obmedzenie počtu súčasných požiadaviek

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

@CircuitBreaker

Inteligentné spracovanie zlyhaní a obnovenie po zlyhaní

@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";
}

Retry

Opakovanie pri zlyhaní požiadavky

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

Timeout

Kontrolný čas čakania pri zlyhaní

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

Kontrola služieb (Service Health)

Kubernetes platformy sledujú funkčnosť kontajnerov pomocou špeciálnych služieb. Aby podkladová platforma mohla monitorovať služby, Spring vývojári zvyčajne používajú konfigurovateľné HealthIndicator a Spring Boot Actuator. V Quarkuse to môžete urobiť pomocou MicroProfile Health, ktoré predvolene vykonávajú kontrolu funkčnosti (liveness check), ale môžu byť nakonfigurované aj na súčasnú kontrolu liveness a readiness (pripravenosti). 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. Príručka zdravia.

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

Funkcie MicroProfile Health
Popis
Príklady

@Liveness

Platforma vykonáva reštart nefunkčných kontajnerizovaných aplikácií
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 posielať prevádzku na kontajnerizované aplikácie v prípade ich nepripravenosti
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();  
}

Metódy

Aplikácie poskytujú metriky buď na operačné účely (na sledovanie SLA ukazovateľov výkonu), alebo na neoperačné (obchodné ukazovatele SLA). Vývojári Springu poskytujú metriky pomocou Spring Boot Actuator a Micrometer. Na druhej strane, Quarkus používa MicroProfile Metrics na poskytovanie základných metrík (JVM a operačný systém), dodávkových metrík (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žívania MicroProfile Metrics API sú uvedené v tabuľke 7.

V projektoch z nášho príkladu MicroProfile Metrics sa používajú na poskytovanie metrík aplikácie. Ďalšie informácie nájdete v príručke Quarkus Príručka metrík.

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

Funkcie MicroProfile Metrics
Popis
Príklady

@Counted

Označuje counter-snímač, ktorý počíta počet volaní anotovaného objektu

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

@ConcurrentGauge

Označuje gauge-snímač, ktorý počíta počet paralelných volaní anotovaného objektu

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

@Gauge

Označuje gauge-snímač, ktorý meria hodnotu anotovaného objektu

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

@Metered

Označuje meter-snímač, ktorý sleduje frekvenciu volania anotovaného objektu

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

Metrika

Anotácia obsahujúca informácie o metadátach pri doručení požiadavky na vytvorenie alebo vyrobenie metriky

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

Č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 metriky (Metrics Endpoints)

Metriky aplikácií localhost:8080/metrics/application
Základné metriky localhost:8080/metrics/base
Vendor metriky localhost:8080/metrics/vendor
Všetky metriky localhost:8080/metrics

Rest klient MicroProfile

Mikroslužby často poskytujú RESTful koncové body, pre ktoré sú potrebné príslušné klientske API. Na prácu s RESTful koncovými bodmi Spring vývojári zvyčajne používajú RestTemplate. Quarkus však na tento účel ponúka API rozhrania MicroProfile Rest Client, ktorých príklady použitia sú uvedené v tabuľke 8.

V projektoch z nášho príkladu Použitie koncových bodov RESTful sa vykonáva pomocou MicroProfile Rest Client. Ďalšie informácie a príklady na túto tému nájdete v príručke Quarkus. Príručka Rest Client.

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

Funkcie MicroProfile Rest Client
Popis
Príklady

@RegisterRestClient

Registruje typizované Java rozhranie ako klienta REST

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

@RestClient

Označuje injekciu inštancie typizovaného rozhrania REST klienta

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

Zavolanie

Vyvoláva REST koncový bod

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

mp-rest/url

Určuje REST koncový bod

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

Zhrnutie

V tomto blogu, ktorý je predovšetkým užitočný pre Spring vývojárov, sme stručne preskúmali, ako používať API rozhrania Spring s API rozhraniami MicroProfile na vývoj Java mikroslužieb a potom ich kompilovať do natívneho binárneho kódu, ktorý šetrí stovky megabajtov operačnej pamäte a spúšťa sa za sekundy.

Ako ste už pochopili, ďalšie informácie o podpore API rozhraní Spring a MicroProfile a množstve ďalších užitočných informácií nájdete v príručkách Quarkus.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster