Kuidas Quarkus ĂŒhendab MicroProfile'i ja Springi

Tere kÔigile, ja see on kolmas postitus Quarkuse seeriast!

Kuidas Quarkus ĂŒhendab MicroProfile'i ja Springi

Java-mikroteenuste arendamisel arvatakse sageli, et Eclipse MicroProfile ja Spring Boot on eraldi ja omavahel sĂ”ltumatud API-d. Üldiselt kasutavad arendajad neid API-sid, millega nad juba harjunud on, kuna uute raamistike ja runtime-komponentide Ă”ppimine nĂ”uab palju aega. TĂ€na pĂŒĂŒame lihtsustada mĂ”nede populaarsete MicroProfile API-de omandamist Spring-arendajatele ja nĂ€itame, kuidas samal ajal kasutada Springi API-d ja uusi kasulikke vĂ”imalusi. Quarkus.

Natukene tĂ€psemalt öeldes vaatame kĂ”igepealt ĂŒle, kuidas Quarkus toetab Springi API-liideseid, et nĂ€idata Springi arendajatele, kuidas saavad MicroProfile API-sid oma igapĂ€evases töös rakendada. Siis rÀÀgime MicroProfile API-dest, mis on kasulikud Springi arendajatele mikroteenuste loomisel.

Miks just Quarkus? Esiteks on see live coding, see tĂ€hendab, et MicroProfile API, Spring API ja teiste Java API muutuste automaatne uuesti laadimine toimub ĂŒhe kĂ€suga: mvn quarkus:dev. Teiseks, antud nĂ€ites on Person teenus (mis kompileeritakse Springi, MicroProfile ja JPA API-dest binaarfailiks kasutades GraalVM-i natiivset pilti) kĂ€ivitatav vaid 0.055 sekundi jooksul ja vajab umbes 90 MB mĂ€lu (RSS) RESTful rakenduse lĂ”pp-punktis. Samuti saab selle kompileerimise teha ĂŒhe kĂ€suga: mvn package -Pnative.

Me ei hakka MicroProfile'i ĂŒksikasjadesse sĂŒvenema, vaid pĂŒĂŒame aidata Springi arendajatel mĂ”ista, kuidas Quarkuses saab kasutada Springi API-sid koos MicroProfile API-dega.

Konteinerid ja Kubernetes

Kuna ei tahaks seda artiklit ĂŒle koormata, vaatleme siin ainult kĂ”rgtaseme aspekte. KubernetesKuna see on oluline mĂ”ista. Quarkust positsioneeritakse Java-stĂ€kina Kubernetesile, mille eesmĂ€rk on minimeerida mĂ€lukulu ja Java rakenduste ja teenuste kĂ€ivitusaega, mis omakorda suurendab nende koha tihedust ja vĂ€hendab ĂŒldkulusid.

Quarkus toetab ka automaatselt genereeritud Kubernetes ressursse ja pakub juhiseid Kubernetes ja Red Hat OpenShift platvormidele juurutamiseks. Lisaks genereerib Quarkus automaatselt Dockerfile.jvm (JVM pakendamine) ja Dockerfile.native (natiivne binaarpakendamine) failid, mis on vajalikud konteinerite loomiseks.

Ja lÔpuks, keskendudes Kubernetesile kui sihtkeskkonnale, ei kasuta Quarkus Java raamistikke olukordades, kus sarnane funktsionaalsus on rakendatud Kubernetes'i tasemel. Tabelis 1 on esitatud Kubernetes'i ja tavaliste Java raamistike, mida Spring arendajad kasutavad, funktsionaalne vastavuskaart.

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

Funktsionaalsus
Traditsiooniline Spring Boot
Kubernetes

Teenuse avastamine
Eureka
DNS

Seadistus
Spring Cloud Config
Config Maps / Secrets

Koormuse tasakaalustamine
Ribbon (kliendi poolel)
Teenuse, replikatsioonikontroller (serveri poolel)

Koodi kompileerimine ja kÀivitamine nÀitest

Selles artiklis viitame projektinÀitele, kus kasutatakse koos Springi ja MicroProfile'i API-sid ning isegi seda sama Java klassi. Selle nÀite koodi saab kompileerida ja kÀivitada kÀsurealt, lisainfot vt README.md failist.

Spring Framework'i API-d

SĂ”ltuvuse sĂŒstimine

Quarkus toetab mitmeid Context and Dependency Injection (CDI) API-sid ja Spring Dependency Injection (Spring DI) API-sid. Kui töötate MicroProfile'i, Java EE ja Jakarta EE, siis olete juba CDI-ga hĂ€sti tuttav. Teisest kĂŒljest saavad Springi arendajad kasutada Quarkus Extension for Spring DI API, et tagada ĂŒhilduvus Spring DI-ga. Toetatud Spring DI API-de kasutamise nĂ€ited on esitatud tabelis 2.

Uues meie nÀidisprojekti kasutatakse nii CDI-d kui ka Spring Dependency Injection'i. Lisainfot ja nÀiteid selle kohta leiate Quarkus'i juhendist, mille nimetus on Spring DI Guide.

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

Toetatud Spring DI funktsioonid
NĂ€ited

Constructor Injection

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

Field Injection
Autowired
VÀÀrtus

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Configuration

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

Component

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

Teenused

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

   public String getPrefix() {
      return message;
   }
}

Veebiraamistik

MicroProfile'i kasutajatele meeldib, et Quarkus toetab JAX-RS-i, MicroProfile Rest Client-i, JSON-P-d ja JSON-B-d peamise veebiprogrammeerimise mudelina. Spring-i arendajatele tuleb rÔÔmuna Quarkuse uus tugi Spring Web API-le, eriti REST-iga seotud liideste osas. Nagu Spring DI puhul, on Spring Web API toe peamine eesmÀrk, et Spring-i arendajad saaksid kasutada Spring Web API-sid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise nÀited on esitatud tabelis 3, samas kui lisainfot ja nÀiteid selle teema kohta leiate Quarkuse juhendist, mille pealkiri on Spring Web Guide.

Tabel 3. Toetatud Spring Web API-de kasutamise nÀited.

Toetatud Spring Web omadused
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) {
   ...
   ...
   ...
}

Spring Data JPA

MicroProfile'i kasutajatele meeldib ka, et Quarkus toetab JPA-d, kasutades Hibernate ORM-i. Ka Spring-i arendajatele on hĂ€id uudiseid: Quarkus toetab ĂŒldtunnustatud Spring Data JPA annotatsioone ja tĂŒĂŒpe. Toetatud Spring Data JPA API-de kasutamise nĂ€ited on toodud tabelis 4.
Uues meie nÀidisprojekti kasutatakse Spring Data JPA API-sid, samas kui lisainformation on saadaval Quarkuse juhendis pealkirjaga Spring Data JPA Guide.

Tabel 4. Toetatud Spring Data JPA API-de kasutamise nÀited.

Toetatud Spring Data JPA omadused
NĂ€ited

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 {
   ...
}

Derived query methods

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

Rikketolerantsus (Fault tolerance)

Veakuskonstruktsioonid on kriitilise tÀhtsusega, et vÀltida kaskaadvÔrke ja luua usaldusvÀÀrseid mikroteenuste arhitektuure. Spring-arendajad on juba aastaid kasutanud veakindlustamiseks circuit-breakereid. Hystrix. Kuid Hystrix ei ole pikka aega uuendatud, samas kui MicroProfile'i vigaaktseptsioon on aktiivselt arenenud ja sellel on juba mitu aastat tootmises kasutamist. SeetÔttu soovitatakse Quarkuses teenuste usaldusvÀÀrsuse suurendamiseks kasutada MicroProfile Fault Tolerance API-sid, mille kasutusnÀiteid on esitatud tabelis 5. Lisainfot selle kohta leiate Quarkus'i juhendist. Fault Tolerance Guide.

Tabel 5. NĂ€ited MicroProfile Fault Tolerance toetatavate API-de kasutamisest.

MicroProfile Fault Tolerance funktsioonid
Kirjeldus
NĂ€ited

@Asynchronous

Loogika tÀitmine eraldi niidis

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

@Bulkhead

Samaaegsete pÀringute arvu piiramine

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

@CircuitBreaker

Nutikas tÔrgete töötlemine ja taastumine

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

@Fallback

Alternatiivse loogika kutsumine tÔrke korral

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

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

Retry

PÀringu ebaÔnnestumisel edasine proovimine

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

Timeout

Ooteaja kontrollimine ebaÔnnestumise korral

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

Teenuste kontrollimine (Service Health)

Kubernetes platvormid jÀlgivad konteinerite tÔhusust spetsiaalsete teenuste abil. Et alampiirkond saaks teenuseid jÀlgida, kasutavad Spring-arendajad tavaliselt kohandatavaid HealthIndicator ja Spring Boot Actuator. Quarkuses saab seda teha MicroProfile Health abil, mis vaikimisi teostab töövÔimekuse kontrollimist (liveness check), kuid saab seadistada ka samaaegseks liveness ja readiness (valmiduse) kontrollimiseks. NÀited toetatud MicroProfile Health API kasutamisest on esitatud tabelis 6 ning lisainformatsioon on esitatud Quarkus'i juhendis. Health Guide.

Tabel 6. NĂ€ited MicroProfile Health toetatavate API-de kasutamisest.

MicroProfile Health funktsioonid
Kirjeldus
NĂ€ited

@Liveness

Platvorm taaskÀivitab riknenud konteineriseeritud rakendused
LÔpp-punkt:
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

Platvorm ei suuna liiklust konteinerisse, kui see ei ole valmis
LÔpp-punkt:
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();  
}

MÔÔtmised

Rakendused pakuvad mÔÔdikuid kas operatiivsetel eesmĂ€rkidel (SLA-taseme jĂ”udluse jĂ€lgimine) vĂ”i mitteoperatiivsetel eesmĂ€rkidel (Ă€ri-SLA mÔÔdikud). Spring-arendajad pakuvad mÔÔdikuid Spring Boot Actuator'i ja Micrometeri kaudu. Quarkus kasutab omakorda MicroProfile Metrics'i, et anda esmaseid mÔÔdikuid (JVM ja opsĂŒsteem), teenusepakkuja mÔÔdikud (Quarkus) ja rakenduse mÔÔdikud. MicroProfile Metrics nĂ”uab, et rakendus toetaks vĂ€ljundvorminguid JSON ja OpenMetrics (Prometheus). NĂ€iteid MicroProfile Metrics API kasutamisest on esitatud tabelis 7.

Uues meie nÀidisprojekti MicroProfile Metrics kasutatakse rakenduse mÔÔdikute esitamiseks. TÀiendavaid andmeid leiate Quarkuse juhendist MÔÔdikute juhend.

Tabel 7. NĂ€ited MicroProfile Metrics API kasutamisest.

MicroProfile Metrics'i funktsioonid
Kirjeldus
NĂ€ited

@Counted

MÀÀrab teadaande counter, mis loendab antud objekti kÔnesid

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

@ConcurrentGauge

MÀÀrab teadaande gauge, mis loendab antud objekti paralleelseid kÔnesid

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

@Gauge

MÀÀrab teadaande gauge, mis mÔÔdab antud objekti vÀÀrtust

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

@Metered

MÀÀrab teadaande meter, mis jÀlgib antud objekti kÔne sagedust

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

MÔÔdik

Annotatsioon, mis sisaldab teavet metaandmete kohta, mil rakendatakse mÔÔdiku loomise vÔi saatmise pÀring

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

Ajastatud

MÀÀrab ajasturi, mis jÀlgib antud objekti kestust

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

Metrika lÔpp-punktid (Metrics Endpoints)

Rakenduste metrikad localhost:8080/metrics/application
PÔhimetriika localhost:8080/metrics/base
Teenusepakkuja metrikad localhost:8080/metrics/vendor
KÔik metrikad localhost:8080/metrics

MicroProfile REST klient

Mikroteenused pakuvad sageli RESTful lĂ”pp-punkte, mille jaoks on vajalikud vastavad kliendiliidese API-d. RESTful lĂ”pp-punktide kasutamiseks kasutavad Springi arendajad tavaliselt RestTemplate'i. Quarkus pakub selle ĂŒlesande lahendamiseks MicroProfile REST Client'i API-liideseid, mille kasutamise nĂ€ited on toodud tabelis 8.

Uues meie nÀidisprojekti RESTful lÔpp-punktide kasutamine toimub MicroProfile REST Client'i abil. Lisateavet ja nÀiteid selle teema kohta leiate Quarkus'i juhendist REST Klientide Juhend.

Tabel 8. NĂ€ited MicroProfile REST Client'i API-liideste kasutamisest.

MicroProfile REST Client'i funktsioonid
Kirjeldus
NĂ€ited

@RegisterRestClient

Registreerib tĂŒĂŒbitud Java liidese REST kliendina

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

@RestClient

MĂ€rgistab tĂŒĂŒbitud REST klientliidese eksemplari sisestamise

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

Kutsumine

Kutsuda REST lÔpp-punkt

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

mp-rest/url

MÀÀratleb REST lÔpp-punkti

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

Summary

Selles blogis, mis on ennekĂ”ike kasulik Spring arendajatele, vaatame lĂŒhidalt, kuidas Quarkus kasutada Springi API-liideseid koos MicroProfile API-liideseid, et arendada Java mikroteenuseid ja seejĂ€rel kompileerida need kohandatud binaarkoodiks, mis sÀÀstab sadu megabaite mĂ€lu ja kĂ€ivitub mĂ”ne millisekundi jooksul.

Nagu te juba aru saite, leidub tÀiendavat teavet Springi ja MicroProfile API-liidese toetuse kohta, samuti palju muud kasulikku teavet Quarkus'i juhendites.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster