Hvordan Quarkus kombinerer MicroProfile og Spring

Hei alle sammen, her er det tredje innlegget i Quarkus-serien!

Hvordan Quarkus kombinerer MicroProfile og Spring

Når man utvikler Java-mikrotjenester, blir det ofte antatt at Formørkelse MicroProfile и Vårstøvel er separate og uavhengige APIer. Som standard har programmerere en tendens til å bruke API-ene de allerede er vant til, siden det tar mye tid å lære nye rammeverk og kjøretidskomponenter. I dag vil vi prøve å forenkle utviklingen av noen populære MicroProfile API for Spring-utviklere og viser deg hvordan du samtidig bruker Spring API og nye nyttige funksjoner quarkus.

I litt mer detalj vil vi først se på omfanget og detaljene for hvordan Quarkus støtter Spring APIer for å vise Spring-utviklere hvordan de bruker MicroProfile API i deres daglige arbeid. Deretter skal vi dekke MicroProfile API-ene, som er nyttige for Spring-utviklere når de lager mikrotjenester.

Hvorfor Quarkus? For det første er dette live koding, det vil si automatisk omlasting av eventuelle endringer i MicroProfile API, Spring API og andre Java APIer, som utføres med bare én kommando: mvn quarkus:dev. For det andre vurderes i i vårt eksempel Person-tjenesten (som kompilerer fra Spring, MicroProfile og JPA APIer til en binær ved å bruke det opprinnelige GraalVM-bildet) starter på bare 0.055 sekunder og tar opp omtrent 90 MB RAM (RSS) på RESTful-applikasjonens endepunkt. Dessuten utføres selve kompileringen med bare én kommando: mvn package -Pnative.

Vi vil ikke gå i detalj om MicroProfile, annet enn å hjelpe Spring-utviklere til å forstå hvordan de kan bruke Spring APIer med MicroProfile APIer i Quarkus.

Containere og Kubernetes

For å holde denne artikkelen enkel, vil vi bare dekke høynivåaspektene ved støtte her. Kubernetes, fordi det er viktig å forstå. Quarkus er posisjonert som en Java-stabel for Kubernetes, den er designet for å minimere minneforbruk og oppstartstid for Java-applikasjoner og -tjenester, og som et resultat øke deres tetthet på verten og redusere de totale kostnadene.

Quarkus også støtter automatisk generering Kubernetes ressurser og tilbud guider for distribusjon på Kubernetes og Red Hat OpenShift-plattformer. I tillegg genererer Quarkus automatisk filene Dockerfile.jvm (JVM-pakning) og Dockerfile.native (native binær pakking) som trengs for å lage containere.

Til slutt, ved å fokusere på Kubernetes som måldistribusjonsmiljøet, bruker ikke Quarkus Java-rammeverk i tilfeller der lignende funksjonalitet er implementert på selve Kubernetes-plattformen. Tabell 1 gir et kart over den funksjonelle korrespondansen mellom Kubernetes og typiske Java-rammeverk som brukes av Spring-utviklere.

Tabell 1. Kart over funksjonell korrespondanse mellom Java-rammeverk og Kubernetes.

funksjonell
Tradisjonell vårstøvel
Kubernetes

Tjenesteoppdagelse
Eureka
DNS

Konfigurasjon
Spring Cloud Config
Konfigurer kart/hemmeligheter

Lastbalansering
Bånd (klientside)
Tjeneste, replikeringskontroller (serverside)

Kompilere og kjøre koden fra eksemplet

I denne artikkelen refererer vi til eksempelprosjekt, hvor Spring- og MicroProfile-API-ene og til og med den samme Java-klassen brukes sammen. Koden i dette eksemplet kan kompileres og kjøres fra kommandolinjen, se README.md-filen for detaljer.

Spring Framework APIer

Avhengighetsinjeksjon

Quarkus støtter en rekke Contexts and Dependency Injection (CDI) APIer og Spring Dependency Injection (Spring DI) APIer. Hvis du jobber med MicroProfile, Java EE og Jakarta EE, da er du allerede godt kjent med CDI. På den annen side kan Spring-utviklere bruke Quarkus Extension for Spring DI API for å oppnå kompatibilitet med Spring DI. Eksempler på bruk av de støttede Spring DI APIene er gitt i tabell 2.

В prosjekt fra vårt eksempel Bruker både CDI og Spring Dependency Injection. For mer informasjon og eksempler om dette emnet, se Quarkus-guiden kalt Vår DI Guide.

Tabell 2. Eksempler på bruk av de støttede Spring DI APIene.

Støttede Spring DI-funksjoner
Примеры

Konstruktørinjeksjon

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

Feltinjeksjon
Autokablet
Verdi

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bønne
@Konfigurasjon

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

Nettrammeverk

MicroProfile-brukere vil elske at Quarkus støtter JAX-RS, MicroProfile Rest Client, JSON-P og JSON-B som den primære webprogrammeringsmodellen. Spring-utviklere vil være fornøyd med Quarkus' nylige støtte for Spring Web API, spesielt REST-grensesnitt. I likhet med Spring DI er hovedmålet med Spring Web API-støtte å gjøre det mulig for Spring-utviklere å bruke Spring Web APIer i forbindelse med MicroProfile APIer. Eksempler på hvordan du bruker de støttede Spring Web APIene er gitt i tabell 3, og mer informasjon og eksempler om dette emnet finner du i Quarkus-opplæringen kalt Vårens nettguide.

Tabell 3. Eksempler på bruk av de støttede Spring Web APIene.

Støttede vårnettfunksjoner
Примеры

@RestController
@RequestMapping

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

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

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

Vårdata JPA

MicroProfile-brukere vil også sette pris på at Quarkus støtter JPA ved bruk av Hibernate ORM. Det er også gode nyheter for Spring-utviklere: Quarkus støtter vanlige Spring Data JPA-merknader og -typer. Eksempler på bruk av de støttede Spring Data JPA APIene er gitt i tabell 4.
В prosjekt fra vårt eksempel Spring Data JPA APIer brukes og mer informasjon er tilgjengelig i Quarkus-opplæringen kalt Spring Data JPA Guide.

Tabell 4. Eksempler på bruk av støttede Spring Data JPA APIer.

Støttede Spring Data JPA-funksjoner
Примеры

CrudRepository

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

Oppbevaringssted
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Depotfragmenter

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

Avledede spørringsmetoder

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Brukerdefinerte søk

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 APIer

Feiltoleranse

Feiltoleransekonstruksjoner er svært viktige for å forhindre kaskadefeil og skape pålitelige mikrotjenestearkitekturer. Fjærutviklere har brukt effektbrytere for feiltoleranse i mange år. Hystrix. Hystrix har imidlertid ikke blitt oppdatert på lenge, men MicroProfiles Fault Tolerance utvikler seg nå aktivt og har flere års produksjonsbruk bak seg. Derfor, for å forbedre påliteligheten til tjenestene i Quarkus, anbefales det å bruke MicroProfile Fault Tolerance APIs, eksempler på disse er brukt i Tabell 5. For mer informasjon om dette, se Quarkus-manualen Veiledning for feiltoleranse.

Tabell 5. Eksempler på bruk av støttede MicroProfile Fault Tolerance APIer.

MicroProfile-feiltoleransefunksjoner
beskrivelse
Примеры

@Asynkron

Utføre logikk i en egen tråd

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

@skott

Begrens antall samtidige forespørsler

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

@CircuitBreaker

Smart feilhåndtering og gjenoppretting fra feil

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

@Falle tilbake

Kaller alternativ logikk i tilfelle feil

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

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

Prøv på nytt

Prøv på nytt ved forespørselsfeil

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

Timeout

Tidsavbrudd for feilkontroll

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

Kontrolltjenester (Service Health)

Kubernetes-plattformer overvåker helsen til containere ved hjelp av spesielle tjenester. For å la den underliggende plattformen overvåke tjenester, bruker Spring-utviklere vanligvis en tilpasset HealthIndicator og Spring Boot Actuator. I Quarkus kan dette gjøres ved hjelp av MicroProfile Health, som som standard utfører en liveness-sjekk, men kan konfigureres til å sjekke liveness og beredskap samtidig. Eksempler på hvordan du bruker støttede MicroProfile Health API-er er gitt i tabell 6, og tilleggsinformasjon er gitt i Quarkus-manualen Helseguide.

Tabell 6: Brukseksempler på støttede MicroProfile Health APIer.

MicroProfile Health-funksjoner
beskrivelse
Примеры

@Liveness

Plattformen starter på nytt mislykkede containeriserte applikasjoner
endepunkt:
vert:8080/helse/live

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

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

@Beredskap

Plattformen vil ikke sende trafikk til containeriserte applikasjoner hvis den ikke er klar
endepunkt:
vert:8080/helse/klar

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

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

Beregninger

Applikasjoner gir beregninger for enten operasjonelle formål (for å overvåke ytelses-SLAer) eller ikke-operative formål (forretnings-SLAer). Spring-utviklere gir beregninger ved å bruke Spring Boot Actuator og Micrometer. På sin side bruker Quarkus MicroProfile Metrics for å gi grunnlinjeberegninger (JVM og operativsystem), leverandørberegninger (Quarkus) og applikasjonsberegninger. MicroProfile Metrics krever at implementeringen støtter JSON og OpenMetrics (Prometheus) utdataformater. Eksempler på bruk av MicroProfile Metrics API er gitt i tabell 7.

В prosjekt fra vårt eksempel MicroProfile Metrics brukes til å gi applikasjonsberegninger. For mer informasjon, se Quarkus-manualen Veiledning for beregninger.

Tabell 7. Eksempler på bruk av MicroProfile Metrics APIer.

MicroProfile Metrics-funksjoner
beskrivelse
Примеры

@Tellet

Angir en teller som teller antall ganger et kommentert objekt har blitt kalt

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

@ConcurrentGauge

Angir en måler som teller antall samtidige anrop til et kommentert objekt

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

@Måler

Angir en målersensor som måler verdien til et kommentert objekt

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

@Målt

Angir en målersensor som overvåker anropsfrekvensen til et kommentert objekt

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

Metric

En merknad som inneholder informasjon om metadata når en forespørsel om å angi eller produsere en beregning mottas

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

Tidsbestemt

Indikerer en tidtaker som sporer varigheten til et kommentert objekt

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

Beregningsendepunkter

Applikasjonsberegninger localhost:8080/metrics/application
Grunnleggende beregninger localhost:8080/metrics/base
Leverandørberegninger localhost:8080/metrics/leverandør
Alle beregninger localhost:8080/metrics

MicroProfile Rest Client

Mikrotjenester gir ofte RESTful endepunkter som krever tilsvarende klient-APIer å jobbe med. For å bruke RESTful-endepunkter bruker Spring-utviklere vanligvis RestTemplate. Quarkus tilbyr MicroProfile Rest Client API-er for å løse dette problemet, eksempler på bruk er gitt i tabell 8.

В prosjekt fra vårt eksempel bruken av RESTful-endepunkter gjøres ved hjelp av MicroProfile Rest Client. Mer informasjon og eksempler om dette emnet finner du i Quarkus-manualen Rest Client Guide.

Tabell 8. Eksempler på bruk av MicroProfile Rest Client APIer.

MicroProfile Rest Client-funksjoner
beskrivelse
Примеры

@RegisterRestClient

Registrerer et skrevet Java-grensesnitt som en REST-klient

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

@RestClient

Markerer implementeringen av en forekomst av et skrevet REST-klientgrensesnitt

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

påkallelse

Kaller et REST-endepunkt

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

mp-rest/url

Spesifiserer REST-endepunktet

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

Resultater av

I denne bloggen, først og fremst rettet mot Spring-utviklere, tok vi en rask titt på hvordan man bruker Spring API-ene med MicroProfile API-ene i Quarkus for å utvikle Java-mikrotjenester og deretter kompilere dem til innebygd binær kode som sparer hundrevis av megabyte RAM og lanseres i et spørsmål om millisekunder.

Som du allerede har forstått, kan du finne mer informasjon om støtte for Spring og MicroProfile API, samt mye annen nyttig informasjon i Quarkus manualer.

Kilde: www.habr.com

Legg til en kommentar