Kuidas Quarkus ühendab MicroProfile'i ja Spring

Tere kõigile ja tere tulemast Quarkuse sarja kolmandasse postitusse!

Kuidas Quarkus ühendab MicroProfile'i ja Spring

Java mikroteenuste arendamisel eeldatakse sageli, et Eclipse'i mikroprofiil и Kevadine saabas – on eraldi ja sõltumatud API-d. Vaikimisi kipuvad programmeerijad kasutama API-sid, millega nad on juba harjunud, kuna uute raamistike ja käitusaja komponentide õppimine võtab palju aega. Täna püüame lihtsustada mõne populaarse õppimist MicroProfile API Springi arendajatele ja näita, kuidas kasutada nii Spring API-t kui ka uusi kasulikke funktsioone samaaegselt Kvarkus.

Veidi üksikasjalikumalt käsitleme kõigepealt Quarkuse Spring API-de toetamise ulatust ja üksikasju, et näidata Springi arendajatele, kuidas MicroProfile API-t oma igapäevatöös kasutada. Seejärel käsitleme MicroProfile API-sid, mis Springi arendajatele mikroteenuste loomisel kasulikud on.

Miks Quarkus? Esiteks on see reaalajas kodeerimine, st MicroProfile API, Spring API ja teiste Java API-de muudatuste automaatne uuestilaadimine, mida tehakse vaid ühe käsuga: mvn quarkus:dev. Teiseks, meie näites Personi teenus (kompileeritud Springi, MicroProfile'i ja JPA API-dest binaarfailiks, kasutades natiivset GraalVM-i kujutist) käivitub kõigest 0.055 sekundiga ja võtab RESTfuli rakenduse lõpp-punktis umbes 90 MB mälu (RSS). Ja selle kompileerimine ise toimub vaid ühe käsuga: mvn package -Pnative.

Me ei süvene MicroProfile'i üksikasjadesse, kuid püüame aidata Springi arendajatel mõista, kuidas Springi API-sid saab Quarkuses koos MicroProfile'i API-dega kasutada.

Konteinerid ja Kubernetes

Selle artikli ülekoormamise vältimiseks käsitleme siin ainult tugiteenuste üldisi aspekte. Kubernetes, sest seda on oluline mõista. Quarkus on Kubernetesi jaoks Java-virn, mis on loodud Java-rakenduste ja -teenuste mälutarbimise ja käivitusaja minimeerimiseks ning selle tulemusel nende tiheduse suurendamiseks hostis ja üldkulude vähendamiseks.

Quarkus ka toetab autogeneratsiooni Kubernetes'i ressursid ja pakkumised juhtimine Kubernetes ja Red Hat OpenShift platvormidel juurutamiseks. Lisaks genereerib Quarkus automaatselt konteinerite loomiseks vajalikud Dockerfile.jvm (JVM-pakend) ja Dockerfile.native (natiivne binaarpakend) failid.

Lõpuks, kuna Quarkus on juurutuskeskkonnana suunatud Kubernetesele, ei kasuta see Java raamistikke juhtudel, kus sarnane funktsionaalsus on rakendatud Kubernetesi platvormi tasandil. Tabel 1 annab funktsionaalse vastenduse Kubernetesi ja Springi arendajate poolt kasutatavate tüüpiliste Java raamistike vahel.

Tabel 1. Java raamistike ja Kubernetes'i funktsionaalse vastavuse kaart.

Funktsionaalne
Traditsiooniline vedrusaabas
Kubernetes

Teenuse avastamine
Eureka
DNS

konfiguratsioon
Spring Cloudi konfiguratsioon
Konfiguratsioonikaardid / saladused

Koormuse tasakaalustamine
Lint (kliendi pool)
Teenus, replikatsioonikontroller (serveripoolne)

Näidiskoodi kompileerimine ja käivitamine

Selles artiklis viitame näidisprojekt, mis kasutab koos Springi ja MicroProfile'i API-sid ning isegi seda Java klassi. Selle näite koodi saab kompileerida ja käivitada käsurealt, üksikasju vaadake failist README.md.

Spring Frameworki API-d

Sõltuvuse süstimine

Quarkus toetab laia valikut Kontekstide ja sõltuvuste süstimise (CDI) API-d ja Spring Dependency Injection (Spring DI) API-d. Kui töötate MicroProfile'iga, Java EE ja Jakarta EE, siis olete CDI-ga juba tuttav. Teisest küljest saavad Springi arendajad kasutada Spring DI API jaoks mõeldud Quarkuse laiendust, et tagada ühilduvus Spring DI-ga. Toetatud Spring DI API-de kasutamise näited on toodud tabelis 2.

В projekt meie näitest Kasutatakse nii CDI-d kui ka Spring Dependency Injectioni. Lisateavet ja näiteid selle teema kohta leiate Quarkuse käsiraamatust nimega Kevadine DI juhend.

Tabel 2. Näited toetatud Spring DI API-de kasutamisest.

Toetatud Spring DI funktsioonid
näited

Konstruktori süstimine

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

Väljasüst
Automaatne juhtmestik
Väärtus

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Oad
@Konfiguratsioon

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

Teenus

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

   public String getPrefix() {
      return message;
   }
}

Veebiraamistik

MicroProfile'i kasutajad hindavad seda, et Quarkus toetab peamise veebiprogrammeerimismudelina JAX-RS-i, MicroProfile Rest Clienti, JSON-P-d ja JSON-B-d. Springi arendajad on rõõmsad, et Quarkus lisas hiljuti toe Spring Web API-dele, eriti REST-teadlikele liidestele. Sarnaselt Spring DI-ga on Spring Web API toe peamine eesmärk võimaldada Springi arendajatel kasutada Spring Web API-sid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise näited on esitatud tabelis 3 ning lisateavet ja näiteid leiate Quarkuse juhendist nimega Kevadine veebijuhend.

Tabel 3. Näited toetatud Spring Web API-de kasutamisest.

Spring Webi toetatud funktsioonid
näited

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@KüpsiseValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (osaline)

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

Spring Data JPA

MicroProfile'i kasutajad hindavad ka seda, et Quarkus toetab JPA-d Hibernate ORM-i kaudu. Head uudised Springi arendajatele: Quarkus toetab tavalisi Spring Data JPA annotatsioone ja tüüpe. Näiteid toetatud Spring Data JPA API-de kasutamise kohta on toodud tabelis 4.
В projekt meie näitest Kasutatakse Spring Data JPA API-sid ja lisateavet leiate Quarkuse juhendist nimega Spring Data JPA juhend.

Tabel 4. Näited toetatud Spring Data JPA API-de kasutamisest.

Spring Data JPA toetatud funktsioonid
näited

CrudRepositorio

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

Hoidla
JpaRepositoorium
Leheküljendus- ja sortimishoidla

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Hoidla fragmendid

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

Tuletatud päringumeetodid

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Kasutaja määratletud päringud

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

Mikroprofiili API-d

Veakindlus

Rikketaluvuse konstruktsioonid on olulised kaskaadvigade vältimiseks ja robustsete mikroteenuste arhitektuuride loomiseks. Springi arendajad on rikketaluvuse tagamiseks kaitselüliteid aastaid kasutanud. HystrixSiiski pole Hystrixit pikka aega uuendatud, samas kui MicroProfile'i rikketaluvus on praegu aktiivselt arenduses ja sellel on mitu aastat tootmiskasutust. Seetõttu on Quarkuse teenuste usaldusväärsuse parandamiseks soovitatav kasutada MicroProfile'i rikketaluvuse API-sid, mille näited on toodud tabelis 5. Lisateavet selle kohta leiate Quarkuse käsiraamatust. Vea taluvuse juhend.

Tabel 5. Näited toetatud MicroProfile'i rikketaluvuse API-de kasutamisest.

MicroProfile'i rikketaluvuse funktsioonid
Kirjeldus
näited

@Asünkroonne

Loogika käivitamine eraldi lõimes

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

@Bulkhead

Samaaegsete päringute arvu piiramine

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

@CircuitBreaker

Nutikas rikete käsitlemine ja rikete taastamine

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

@Varuvariant

Alternatiivse loogika kutsumine ebaõnnestumise korral

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

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

Uuesti

Proovi uuesti taotluse nurjumisel

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

Aegumine

Rikke jälgimise ajalõpp

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

Teenuse tervisekontroll

Kubernetes platvormid jälgivad konteinerite tervist spetsiaalsete teenuste abil. Selleks, et alusplatvorm saaks teenuseid jälgida, kasutavad Springi arendajad tavaliselt konfigureeritavat HealthIndicatorit ja Spring Boot Actuatorit. Quarkuses saab seda teha MicroProfile Healthi abil, mis vaikimisi teostab reaalajas kontrolli, kuid mida saab konfigureerida nii, et see kontrolliks samaaegselt nii reaalajas olekut kui ka valmisolekut. Toetatud MicroProfile Health API-de kasutamise näited on esitatud tabelis 6 ja lisateavet leiate Quarkuse juhendist. Tervise juhend.

Tabel 6. Toetatud MicroProfile Health API-de kasutamise näited.

MicroProfile Healthi funktsioonid
Kirjeldus
näited

@Liveness

Platvorm taaskäivitab katkised konteinerdatud rakendused
Lõpp-punkt:
host:8080/tervis/live

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

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

@Valmisolek

Platvorm ei saada konteinerdatud rakendusele liiklust, kui see pole valmis.
Lõpp-punkt:
host: 8080/tervis/valmis

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

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

Mõõdikud

Rakendused avaldavad mõõdikuid kas operatiivsetel (jõudluse SLA jälgimine) või mitteoperatiivsetel (äri SLA mõõdikud) eesmärkidel. Springi arendajad avaldavad mõõdikuid Spring Boot Actuatori ja Micrometeri abil. Quarkus omakorda kasutab MicroProfile Metricsi baasmõõdikute (JVM ja OS), tarnija mõõdikute (Quarkus) ja rakenduse mõõdikute avaldamiseks. MicroProfile Metrics nõuab, et implementatsioon toetaks JSON-i ja OpenMetricsi (Prometheus) väljundvorminguid. MicroProfile Metricsi API kasutamise näited on esitatud tabelis 7.

В projekt meie näitest Mikroprofiili mõõdikuid kasutatakse rakenduse mõõdikute esitamiseks. Lisateavet leiate Quarkuse käsiraamatust. Mõõdikute juhend.

Tabel 7. Näited MicroProfile Metrics API-de kasutamisest.

MicroProfile'i mõõdikute funktsioonid
Kirjeldus
näited

@Loetud

Näitab loendurit, mis loendab, mitu korda annoteeritud objekti kutsutakse.

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

@ConcurrentGauge

Tähistab mõõdikut, mis loendab annoteeritud objektile tehtud paralleelsete kõnede arvu.

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

@Gauge

Tähistab mõõdikut, mis mõõdab märgitud objekti väärtust.

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

@Mõõdetud

Tähistab mõõdikut, mis jälgib annoteeritud objekti kutsumise sagedust.

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

meetriline

Mõõdiku lisamise või genereerimise taotluse saamisel metaandmetega seotud märkus

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

Ajastatud

Tähistab taimerit, mis jälgib märkustega objekti kestust.

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

Mõõdikute lõpp-punktid

Rakenduse mõõdikud localhost:8080/mõõdikud/rakendus
Põhinäitajad localhost:8080/metrics/base
Tarnija mõõdikud localhost:8080/mõõdikud/müüja
Kõik mõõdikud localhost:8080/meetrika

MicroProfile'i puhkeoleku klient

Mikroteenused pakuvad sageli RESTfuli lõpp-punkte, mis vajavad töötamiseks vastavaid kliendi API-sid. RESTfuli lõpp-punktide kasutamiseks kasutavad Springi arendajad tavaliselt RestTemplate'i. Quarkus seevastu pakub selleks ülesandeks MicroProfile'i REST-kliendi API-sid, mille näited on toodud tabelis 8.

В projekt meie näitest RESTfuli lõpp-punkte kasutatakse MicroProfile'i Rest Clienti abil. Lisateavet ja näiteid selle teema kohta leiate Quarkuse käsiraamatust. Rest kliendi juhend.

Tabel 8. Näited MicroProfile'i Rest Clienti API-de kasutamisest.

MicroProfile'i Rest kliendi funktsioonid
Kirjeldus
näited

@RegisterRestClient

Registreerib trükitud Java-liidese REST-kliendina

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

@RestClient

Tähistab tüüpitud REST-kliendiliidese eksemplari süstimist

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

Kutsumine

Kutsub välja REST-lõpp-punkti

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

mp-rest/url

Määrab REST-lõpp-punkti

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

Tulemused

Selles blogipostituses, mis on mõeldud peamiselt Springi arendajatele, vaatasime lühidalt, kuidas Quarkus kasutab Springi API-sid koos MicroProfile'i API-dega Java mikroteenuste arendamiseks ja seejärel nende kompileerimiseks natiivseteks binaarfailideks, mis säästavad sadu megabaite muutmälu ja käivituvad millisekunditega.

Nagu näete, leiate lisateavet Springi ja MicroProfile'i API toe kohta ning palju muud kasulikku teavet siit Quarkuse käsiraamatud.

Allikas: www.habr.com

Lisa kommentaar