Kako Quarkus kombinira MicroProfile i Spring

Pozdrav svima, evo trećeg posta u seriji Quarkus!

Kako Quarkus kombinira MicroProfile i Spring

Pri razvoju Java mikroservisa često se vjeruje da Eclipse mikroprofil и Proljetna čizma su odvojeni i neovisni API-ji. Prema zadanim postavkama, programeri imaju tendenciju da koriste API-je na koje su već navikli, jer učenje novih okvira i komponenti vremena izvođenja oduzima puno vremena. Danas ćemo pokušati pojednostaviti razvoj nekih popularnih MicroProfile API za Spring programere i pokazati vam kako istovremeno koristiti Spring API i nove korisne značajke kvarkus.

S malo više detalja, prvo ćemo pogledati opseg i detalje o tome kako Quarkus podržava Spring API-je kako bismo pokazali Spring programerima kako koristiti MicroProfile API u svom svakodnevnom radu. Zatim ćemo pokriti MicroProfile API-je, koji su korisni za Spring programere pri stvaranju mikroservisa.

Zašto Quarkus? Prvo, radi se o live kodiranju, odnosno automatskom ponovnom učitavanju bilo kakvih promjena u MicroProfile API-ju, Spring API-ju i drugim Java API-jima, koje se izvodi samo jednom naredbom: mvn quarkus:dev. Drugo, smatra se u u našem primjeru usluga Person (koja kompajlira iz Spring, MicroProfile i JPA API-ja u binarnu pomoću izvorne slike GraalVM) pokreće se za samo 0.055 sekundi i zauzima oko 90 MB RAM-a (RSS) na krajnjoj točki RESTful aplikacije. Štoviše, sama njegova kompilacija izvodi se samo jednom naredbom: mvn package -Pnative.

Nećemo ulaziti u detalje o MicroProfileu, osim da pomognemo Spring programerima da razumiju kako mogu koristiti Spring API-je s MicroProfile API-jima u Quarkusu.

Kontejneri i Kubernetes

Kako bi ovaj članak bio jednostavan, ovdje ćemo pokriti samo aspekte podrške na visokoj razini. Kubernetes, jer je važno razumjeti. Quarkus je pozicioniran kao Java stack za Kubernetes, dizajniran je kako bi smanjio potrošnju memorije i vrijeme pokretanja Java aplikacija i usluga te, kao rezultat toga, povećao njihovu gustoću na glavnom računalu i smanjio ukupne troškove.

Quarkus također podržava autogeneraciju Resursi i ponude Kubernetesa rukovodstvo za implementaciju na platformama Kubernetes i Red Hat OpenShift. Osim toga, Quarkus automatski generira datoteke Dockerfile.jvm (JVM pakiranje) i Dockerfile.native (nativno binarno pakiranje) potrebne za stvaranje spremnika.

Konačno, fokusirajući se na Kubernetes kao ciljano okruženje za implementaciju, Quarkus ne koristi Java okvire u slučajevima kada je slična funkcionalnost implementirana na razini same Kubernetes platforme. Tablica 1 prikazuje mapu funkcionalne korespondencije između Kubernetesa i tipičnih Java okvira koje koriste Spring programeri.

Tablica 1. Karta funkcionalne korespondencije između Java frameworka i Kubernetesa.

funkcionalna
Tradicionalna proljetna čizma
Kubernetes

Otkrivanje usluge
Eureka
DNS

konfiguracija
Spring Cloud Config
Konfigurirajte karte/tajne

Balansiranje opterećenja
Vrpca (strana klijenta)
Usluga, kontroler replikacije (strana poslužitelja)

Prevođenje i pokretanje koda iz primjera

U ovom članku se pozivamo na primjer projekta, gdje se Spring i MicroProfile API-ji, pa čak i ista Java klasa koriste zajedno. Kôd u ovom primjeru može se kompajlirati i pokrenuti iz naredbenog retka, za detalje pogledajte datoteku README.md.

API-ji Spring Framework

Injekcija ovisnosti

Quarkus podržava niz API-ji za kontekste i ubacivanje ovisnosti (CDI). i Spring Dependency Injection (Spring DI) API-ji. Ako radite s MicroProfileom, Java EE i Jakarta EE, onda ste već dobro upoznati s CDI-jem. S druge strane, Spring programeri mogu koristiti Quarkus Extension for Spring DI API za postizanje kompatibilnosti sa Spring DI-jem. Primjeri korištenja podržanih Spring DI API-ja navedeni su u tablici 2.

В projekt iz našeg primjera Koristi i CDI i Spring Dependency Injection. Za više informacija i primjera o ovoj temi pogledajte Quarkus vodič pod nazivom Proljetni DI vodič.

Tablica 2. Primjeri korištenja podržanih Spring DI API-ja.

Podržane Spring DI značajke
Primjeri

Injekcija konstruktora

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

Injekcija polja
Automatski ožičen
Još malo brojeva

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Grah
@Konfiguracija

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

Sastavni

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

Servis

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

   public String getPrefix() {
      return message;
   }
}

Web okvir

Korisnicima MicroProfilea će se svidjeti što Quarkus podržava JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B kao primarni model web programiranja. Spring programeri bit će zadovoljni Quarkusovom nedavnom podrškom za Spring Web API, posebno REST sučelja. Slično Spring DI-ju, glavni cilj podrške za Spring Web API je omogućiti Spring programerima da koriste Spring Web API-je u kombinaciji s MicroProfile API-jima. Primjeri korištenja podržanih Spring Web API-ja navedeni su u tablici 3, a više informacija i primjera o ovoj temi možete pronaći u Quarkus tutorialu pod nazivom Proljetni web vodič.

Tablica 3. Primjeri korištenja podržanih Spring Web API-ja.

Podržane Spring Web značajke
Primjeri

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@Zaglavlje zahtjeva
@MatrixVariable
@Varijabla puta
@CookieValue
@Tijelo zahtjeva
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (djelomično)

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

Proljetni podaci JPA

Korisnici MicroProfilea također će cijeniti to što Quarkus podržava JPA koristeći Hibernate ORM. Postoje i dobre vijesti za programere Springa: Quarkus podržava uobičajene JPA komentare i tipove Spring Data. Primjeri korištenja podržanih Spring Data JPA API-ja navedeni su u tablici 4.
В projekt iz našeg primjera Koriste se Spring Data JPA API-ji, a više informacija dostupno je u Quarkus vodiču pod nazivom Spring Data JPA Guide.

Tablica 4. Primjeri korištenja podržanih Spring Data JPA API-ja.

Podržane Spring Data JPA značajke
Primjeri

CrudRepository

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

skladište
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmenti spremišta

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

Izvedene metode upita

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Korisnički definirani upiti

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-ji

Tolerancija kvarova

Konstrukti tolerancije na pogreške vrlo su važni za sprječavanje kaskadnih kvarova i stvaranje pouzdanih arhitektura mikroservisa. Programeri opruga već dugi niz godina koriste prekidače za otpornost na greške. Hystrix. Međutim, Hystrix nije ažuriran dugo vremena, ali MicroProfile's Fault Tolerance sada se aktivno razvija i iza sebe ima nekoliko godina proizvodne upotrebe. Stoga, za poboljšanje pouzdanosti usluga u Quarkusu, preporučuje se korištenje MicroProfile Fault Tolerance API-ja, čiji su primjeri korišteni u Tablici 5. Za više informacija o tome, pogledajte Quarkusov priručnik Vodič za toleranciju grešaka.

Tablica 5. Primjeri korištenja podržanih MicroProfile Fault Tolerance API-ja.

MicroProfile značajke otpornosti na pogreške
Opis
Primjeri

@Asinkrono

Izvršavanje logike u zasebnoj niti

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

@Pregrada

Ograničite broj istodobnih zahtjeva

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

@Osigurač

Pametno rukovanje kvarovima i oporavak od kvarova

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

@Zamjena

Pozivanje alternativne logike u slučaju kvara

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

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

Ponovo pokušaj

Pokušaj ponovo ako zahtjev nije uspio

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

Tajm-aut

Istek kontrole neuspjeha

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

Provjera usluga (zdravlje usluge)

Kubernetes platforme prate ispravnost spremnika pomoću posebnih usluga. Kako bi temeljnoj platformi omogućili praćenje usluga, Spring programeri obično koriste prilagođeni HealthIndicator i Spring Boot Actuator. U Quarkusu se to može učiniti pomoću MicroProfile Healtha, koji prema zadanim postavkama obavlja provjeru živosti, ali se može konfigurirati da istovremeno provjerava živost i spremnost. Primjeri korištenja podržanih MicroProfile Health API-ja navedeni su u Tablici 6, a dodatne informacije u Quarkus priručniku Zdravstveni vodič.

Tablica 6: Primjeri korištenja podržanih MicroProfile Health API-ja.

Značajke MicroProfile Health
Opis
Primjeri

@Živahnost

Platforma ponovno pokreće neuspjele kontejnerske aplikacije
Krajnja točka:
domaćin:8080/zdravlje/uživo

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

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

@Spremnost

Platforma neće slati promet aplikacijama u kontejnerima ako nije spremna
Krajnja točka:
domaćin:8080/zdravlje/spreman

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

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

Metrika

Aplikacije pružaju metriku bilo za operativne svrhe (za praćenje izvedbe SLA-ova) bilo za neoperativne svrhe (poslovni SLA-ovi). Programeri Springa pružaju metriku koristeći Spring Boot Actuator i Micrometer. Zauzvrat, Quarkus koristi MicroProfile Metrics za pružanje osnovne metrike (JVM i operativni sustav), metrike dobavljača (Quarkus) i metrike aplikacija. MicroProfile Metrics zahtijeva da implementacija podržava izlazne formate JSON i OpenMetrics (Prometheus). Primjeri korištenja API-ja MicroProfile Metrics navedeni su u tablici 7.

В projekt iz našeg primjera Mikroprofilne metrike koriste se za pružanje metrike aplikacije. Za više informacija pogledajte Quarkus priručnik Vodič za metriku.

Tablica 7. Primjeri korištenja API-ja MicroProfile Metrics.

Značajke metrike mikroprofila
Opis
Primjeri

@Prebrojano

Označava brojač brojača koji broji koliko je puta označeni objekt pozvan

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

@ConcurrentGauge

Označava mjerač koji broji broj istodobnih poziva označenom objektu

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

@Mjerač

Označava mjerni senzor koji mjeri vrijednost označenog objekta

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

@Dozirano

Označava senzor mjerača koji prati frekvenciju poziva označenog objekta

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

metrički

Bilješka koja sadrži informacije o metapodacima kada se primi zahtjev za unos ili izradu metrike

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

Vremenski

Označava mjerač vremena koji prati trajanje označenog objekta

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

Krajnje točke metrike

Mjerila aplikacije localhost:8080/metrics/aplikacija
Osnovna metrika localhost:8080/metrika/baza
Mjerni podaci dobavljača localhost:8080/metrics/dobavljač
Sve metrike localhost:8080/metrika

MicroProfile Rest Client

Mikrousluge često pružaju RESTful krajnje točke koje zahtijevaju odgovarajuće klijentske API-je za rad. Za korištenje RESTful krajnjih točaka, Spring programeri obično koriste RestTemplate. Quarkus nudi MicroProfile Rest Client API-je za rješavanje ovog problema, čiji su primjeri korištenja dati u tablici 8.

В projekt iz našeg primjera korištenje RESTful krajnjih točaka vrši se pomoću MicroProfile Rest Clienta. Više informacija i primjera na ovu temu možete pronaći u Quarkus priručniku Rest Vodič za klijente.

Tablica 8. Primjeri korištenja MicroProfile Rest Client API-ja.

Značajke MicroProfile Rest klijenta
Opis
Primjeri

@RegisterRestClient

Registrira upisano Java sučelje kao REST klijent

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

@RestClient

Označava implementaciju instance tipiziranog sučelja REST klijenta

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

prizivanje

Poziva REST krajnju točku

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

mp-ostatak/url

Određuje REST krajnju točku

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

Rezultati

U ovom blogu, namijenjenom prvenstveno Spring programerima, brzo smo pogledali kako koristiti Spring API-je s MicroProfile API-jima u Quarkusu za razvoj Java mikroservisa i zatim ih prevesti u izvorni binarni kod koji štedi stotine megabajta RAM-a i pokreće se u pitanje milisekundi.

Kao što ste već shvatili, više informacija o podršci za API-je Spring i MicroProfile, kao i mnoge druge korisne informacije, možete pronaći u Quarkus priručnici.

Izvor: www.habr.com

Dodajte komentar