Kuidas Quarkus ühendab MicroProfile'i ja Spring

Tere kõigile, siin on Quarkuse sarja kolmas postitus!

Kuidas Quarkus ühendab MicroProfile'i ja Spring

Java mikroteenuste arendamisel arvatakse sageli, et Eclipse'i mikroprofiil и Kevadine saabas on eraldiseisvad ja sõltumatud API-d. Vaikimisi kasutavad programmeerijad API-sid, millega nad on juba harjunud, kuna uute raamistike ja käitusaja komponentide õppimine võtab palju aega. Täna proovime mõne populaarse väljatöötamist lihtsustada MicroProfile API Spring arendajatele ja näitame teile, kuidas samaaegselt kasutada Spring API-t ja uusi kasulikke funktsioone Kvarkus.

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

Miks Quarkus? Esiteks on see reaalajas kodeerimine, st MicroProfile API, Spring API ja muude Java API-de muudatuste automaatne uuesti laadimine, mis toimub vaid ühe käsuga: mvn quarkus:dev. Teiseks arutati aastal meie näites teenus Person (mis kompileerib Spring, MicroProfile ja JPA API-dest binaarseks, kasutades natiivset GraalVM-pilti) käivitub vaid 0.055 sekundiga ja võtab rakenduse RESTful lõpp-punktis umbes 90 MB RAM-i (RSS). Veelgi enam, selle kompileerimine toimub vaid ühe käsuga: mvn pakett -Pnative.

Me ei käsitle MicroProfile'i üksikasju, välja arvatud selleks, et aidata Springi arendajatel mõista, kuidas nad saavad Quarkuses kasutada Spring API-sid MicroProfile'i API-dega.

Konteinerid ja Kubernetes

Et see artikkel oleks lihtne, käsitleme siin ainult toe kõrgetasemelisi aspekte. Kubernetes, sest see on oluline mõista. Quarkus on paigutatud Kubernetese Java-pinuna, selle eesmärk on minimeerida Java rakenduste ja teenuste mälutarbimist ja käivitusaega ning selle tulemusena suurendada nende tihedust hostis ja vähendada üldkulusid.

Kvarkus ka toetab automaatset genereerimist Kubernetese ressursid ja pakkumised juhtimine juurutamiseks Kubernetese ja Red Hat OpenShift platvormidel. Lisaks genereerib Quarkus automaatselt konteinerite loomiseks vajalikud failid Dockerfile.jvm (JVM-i pakend) ja Dockerfile.native (natiivne kahendpakend).

Lõpuks, keskendudes Kubernetesele kui sihtjuurutuskeskkonnale, ei kasuta Quarkus Java raamistikke juhtudel, kui sarnaseid funktsioone rakendatakse Kubernetese platvormi enda tasemel. Tabelis 1 on toodud funktsionaalse vastavuse kaart Kubernetese ja Springi arendajate poolt kasutatavate tüüpiliste Java-raamistike vahel.

Tabel 1. Java raamistike ja Kubernetese vahelise funktsionaalse vastavuse kaart.

Funktsionaalne
Traditsiooniline kevadsaabas
Kubernetes

Teenuse avastamine
Eureka
DNS

konfiguratsioon
Spring Cloud Config
Kaartide/saladuste konfigureerimine

Koormuse tasakaalustamine
Lint (kliendipool)
Teenus, replikatsioonikontroller (serveri pool)

Koodi koostamine ja käivitamine näitest

Selles artiklis viitame näidisprojekt, kus kasutatakse koos Spring ja MicroProfile API-sid ning isegi sama Java klassi. Selle näite koodi saab kompileerida ja käivitada käsurealt, üksikasju vaadake failist README.md.

Spring Framework API-d

Sõltuvuse süstimine

Quarkus toetab mitmesuguseid Kontekstid ja sõltuvuse sisestamise (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 väga tuttav. Teisest küljest saavad Springi arendajad Spring DI-ga ühilduvuse saavutamiseks kasutada Quarkus Extension for Spring DI API. Toetatud Spring DI API-de kasutamise näited on toodud tabelis 2.

В projekt meie näitest Kasutab nii CDI-d kui ka Spring Dependency Injectionit. Rohkem teavet ja näiteid selle teema kohta leiate Quarkuse juhendist nimega Kevadine DI juhend.

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

Toetatud kevadise DI funktsioonid
näited

Konstruktori süstimine

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

Sissepritse väljale
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 kasutajatele meeldib, et Quarkus toetab peamise veebiprogrammeerimismudelina JAX-RS-i, MicroProfile Rest Client-i, JSON-P-d ja JSON-B-d. Kevadised arendajad on rahul Quarkuse hiljutise toega Spring Web API-le, eriti REST-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 toodud tabelis 3 ning rohkem teavet ja näiteid selle teema kohta leiate Quarkuse õpetusest nimega Kevadine veebijuhend.

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

Toetatud kevadised veebifunktsioonid
näited

@RestController
@RequestMapping

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

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

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

Kevadine DataJPA

MicroProfile'i kasutajad hindavad ka seda, et Quarkus toetab JPA-d, kasutades hibernate ORM-i. Hea uudis on ka Springi arendajatele: Quarkus toetab tavalisi Spring Data JPA annotatsioone ja tüüpe. Toetatud Spring Data JPA API-de kasutamise näited on toodud tabelis 4.
В projekt meie näitest Kasutatakse Spring Data JPA API-sid ja rohkem teavet leiate Quarkuse õpetusest nimega Spring Data JPA juhend.

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

Toetatud Spring Data JPA funktsioonid
näited

CrudRepository

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

Hoidla
Jpa hoidla
PagingAndSorting Repositoorium

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

MicroProfile API-d

Veataluvus

Veataluvuse konstruktsioonid on väga olulised kaskaadtõrgete ärahoidmiseks ja usaldusväärsete mikroteenuste arhitektuuride loomiseks. Kevade arendajad on tõrketaluvuse tagamiseks kaitselüliteid kasutanud juba aastaid. Hystrix. Hystrixit pole aga pikka aega uuendatud, kuid MicroProfile'i tõrketaluvus areneb praegu aktiivselt ja selle taga on mitmeaastane tootmiskasutus. Seetõttu on Quarkuse teenuste töökindluse parandamiseks soovitatav kasutada MicroProfile Fault Tolerance API-sid, mille näiteid on kasutatud tabelis 5. Lisateavet selle kohta leiate Quarkuse juhendist Veataluvuse juhend.

Tabel 5. Näited toetatud MicroProfile'i tõrketaluvuse API-de kasutamisest.

Mikroprofiili tõrketaluvuse omadused
Kirjeldus
näited

@Asünkroonne

Loogika teostamine eraldi lõimes

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

@Bulkhead

Piirake samaaegsete päringute arvu

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

@CircuitBreaker

Nutikas rikete käsitlemine ja tõrgetest taastumine

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

@Tagasi

Alternatiivse loogika kutsumine ebaõnnestumise korral

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

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

Uuesti

Taotluse ebaõnnestumisel proovige uuesti

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

Aegumine

Rikkekontrolli ajalõpp

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

Teenuste kontrollimine (teenuste tervis)

Kubernetese platvormid jälgivad konteinerite tervist eriteenuste abil. Et võimaldada aluseks oleval platvormil teenuseid jälgida, kasutavad Springi arendajad tavaliselt kohandatud terviseindikaatorit ja Spring Boot Actuator. Quarkuses saab seda teha MicroProfile Healthi abil, mis vaikimisi teostab elavuse kontrolli, kuid mida saab seadistada nii, et see kontrolliks samaaegselt ka elavust ja valmisolekut. Näited toetatud MicroProfile Health API-de kasutamise kohta on toodud tabelis 6 ja lisateavet leiate Quarkuse käsiraamatust. Tervise juhend.

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

MicroProfile Healthi funktsioonid
Kirjeldus
näited

@Elus

Platvorm taaskäivitab ebaõnnestunud konteinerrakendused
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();  
}

@Valmidus

Platvorm ei saada liiklust konteinerrakendustesse, 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 pakuvad mõõdikuid kas tööeesmärkidel (jõudluse SLA-de jälgimiseks) või mitteoperatiivsetel eesmärkidel (äri SLA-d). Vedruarendajad pakuvad mõõdikuid Spring Boot Actuator ja Micrometer abil. Quarkus omakorda kasutab MicroProfile Metrics, et pakkuda baasmõõdikuid (JVM ja operatsioonisüsteem), hankija mõõdikuid (Quarkus) ja rakenduste mõõdikuid. MicroProfile Metrics nõuab, et rakendus toetaks JSON-i ja OpenMetricsi (Prometheus) väljundvorminguid. MicroProfile Metrics API kasutamise näited on toodud tabelis 7.

В projekt meie näitest Rakenduste mõõdikute pakkumiseks kasutatakse MicroProfile Metrics. Lisateabe saamiseks vaadake Quarkuse juhendit Mõõdikute juhend.

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

Mikroprofiili mõõdikute funktsioonid
Kirjeldus
näited

@Loendatud

Tähistab loendurit, mis loendab, mitu korda annoteeritud objektile on helistatud

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

@ConcurrentGauge

Tähistab mõõdikut, mis loeb samaaegsete kõnede arvu annoteeritud objektile

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

@Gauge

Tähistab mõõteandurit, mis mõõdab annoteeritud objekti väärtust

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

@Mõõdukas

Tähistab arvesti andurit, mis jälgib annoteeritud objekti kõne sagedust

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

meetriline

Märkus, mis sisaldab teavet metaandmete kohta, kui saadakse taotlus mõõdiku sisestamiseks või koostamiseks

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

Ajastatud

Näitab taimerit, mis jälgib annoteeritud 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/meetrika/rakendus
Põhilised mõõdikud localhost:8080/meetrid/baas
Tarnija mõõdikud localhost:8080/meetrika/müüja
Kõik mõõdikud localhost:8080/meetrid

MicroProfile Rest Client

Mikroteenused pakuvad sageli RESTful lõpp-punkte, millega töötamiseks on vaja vastavaid kliendi API-sid. RESTfuli lõpp-punktide kasutamiseks kasutavad Spring arendajad tavaliselt RestTemplate'i. Quarkus pakub selle probleemi lahendamiseks MicroProfile Rest Client API-sid, mille kasutamise näited on toodud tabelis 8.

В projekt meie näitest RESTfuli lõpp-punktide kasutamine toimub MicroProfile Rest Clienti abil. Lisateavet ja näiteid selle teema kohta leiate Quarkuse käsiraamatust Rest Client Guide.

Tabel 8. Näited MicroProfile Rest Client API-de kasutamisest.

MicroProfile Rest Client funktsioonid
Kirjeldus
näited

@RegisterRestClient

Registreerib tipitud Java-liidese REST-kliendina

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

@RestClient

Tähistab tipitud REST-kliendiliidese eksemplari rakendamist

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

Kutsumine

Kutsub REST-i lõpp-punkti

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

mp-rest/url

Määrab REST-i lõpp-punkti

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

Tulemused

Selles peamiselt Springi arendajatele suunatud ajaveebis vaatasime lühidalt, kuidas kasutada Spring API-sid Quarkuse MicroProfile API-dega, et arendada Java mikroteenuseid ja seejärel kompileerida need natiivseks kahendkoodiks, mis säästab sadu megabaite RAM-i ja käivitub millisekundite küsimus.

Nagu juba aru saite, leiate lisateavet Spring ja MicroProfile API-de toe kohta ning palju muud kasulikku teavet Quarkuse käsiraamatud.

Allikas: www.habr.com

Lisa kommentaar