Hvordan Quarkus kombinerer MicroProfile og Spring

Hej alle sammen, her er det tredje indlæg i Quarkus-serien!

Hvordan Quarkus kombinerer MicroProfile og Spring

Når man udvikler Java-mikrotjenester, tror man ofte på det Eclipse MicroProfile и Forår støvle er separate og uafhængige API'er. Som standard har programmører en tendens til at bruge de API'er, de allerede er vant til, da det tager meget tid at lære nye rammer og runtime-komponenter. I dag vil vi forsøge at forenkle udviklingen af ​​nogle populære MicroProfile API til Spring-udviklere og viser dig, hvordan du samtidig bruger Spring API og nye nyttige funktioner kvarkus.

Lidt mere detaljeret vil vi først se på omfanget og detaljerne om, hvordan Quarkus understøtter Spring API'er for at vise Spring-udviklere, hvordan de bruger MicroProfile API i deres daglige arbejde. Derefter vil vi dække MicroProfile API'erne, som er nyttige for Spring-udviklere, når de opretter mikrotjenester.

Hvorfor Quarkus? For det første er dette live kodning, det vil sige automatisk genindlæsning af eventuelle ændringer i MicroProfile API, Spring API og andre Java API'er, som udføres med kun én kommando: mvn quarkus:dev. For det andet overvejes i i vores eksempel Person-tjenesten (som kompilerer fra Spring, MicroProfile og JPA API'er til en binær ved hjælp af det native GraalVM-billede) starter på kun 0.055 sekunder og fylder omkring 90 MB RAM (RSS) på RESTful-applikationens slutpunkt. Desuden udføres selve kompileringen med kun én kommando: mvn package -Pnative.

Vi vil ikke gå i detaljer om MicroProfile, bortset fra at hjælpe Spring-udviklere med at forstå, hvordan de kan bruge Spring API'er med MicroProfile API'er i Quarkus.

Containere og Kubernetes

For at holde denne artikel enkel dækker vi kun de høje niveauer af support her. Kubernetes, fordi det er vigtigt at forstå. Quarkus er placeret som en Java-stak for Kubernetes, den er designet til at minimere hukommelsesforbrug og opstartstid for Java-applikationer og -tjenester og som et resultat øge deres tæthed på værten og reducere de samlede omkostninger.

Quarkus også understøtter autogenerering Kubernetes ressourcer og tilbud guider til udrulning på Kubernetes og Red Hat OpenShift platforme. Derudover genererer Quarkus automatisk filerne Dockerfile.jvm (JVM-emballage) og Dockerfile.native (native binære pakker), der er nødvendige for at skabe containere.

Endelig, ved at fokusere på Kubernetes som målimplementeringsmiljøet, bruger Quarkus ikke Java-frameworks i tilfælde, hvor lignende funktionalitet er implementeret på selve Kubernetes-platformens niveau. Tabel 1 giver et kort over den funktionelle korrespondance mellem Kubernetes og typiske Java-frameworks, der bruges af Spring-udviklere.

Tabel 1. Kort over funktionel korrespondance mellem Java frameworks og Kubernetes.

funktionel
Traditionel fjederstøvle
Kubernetes

Service opdagelse
Eureka
DNS

Konfiguration
Spring Cloud Config
Konfigurer kort/hemmeligheder

Lastbalancering
Bånd (klientside)
Service, replikeringscontroller (serverside)

Kompilere og køre koden fra eksemplet

I denne artikel henviser vi til eksempel projekt, hvor Spring- og MicroProfile API'erne og endda den samme Java-klasse bruges sammen. Koden i dette eksempel kan kompileres og køres fra kommandolinjen. Se filen README.md for detaljer.

Spring Framework API'er

Afhængighed Injektion

Quarkus understøtter en række Contexts and Dependency Injection (CDI) API'er og Spring Dependency Injection (Spring DI) API'er. Hvis du arbejder med MicroProfile, Java EE og Jakarta EE, så er du allerede meget fortrolig med CDI. På den anden side kan Spring-udviklere bruge Quarkus Extension for Spring DI API for at opnå kompatibilitet med Spring DI. Eksempler på brug af de understøttede Spring DI API'er er givet i tabel 2.

В projekt fra vores eksempel Bruger både CDI og Spring Dependency Injection. For mere information og eksempler om dette emne, se Quarkus-guiden kaldet Spring DI Vejledning.

Tabel 2. Eksempler på brug af de understøttede Spring DI API'er.

Understøttede Spring DI-funktioner
Примеры

Konstruktørindsprøjtning

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

Feltinjektion
Autowired
Værdi

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bønne
@Konfiguration

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

Service

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

   public String getPrefix() {
      return message;
   }
}

Webramme

MicroProfile-brugere vil elske, at Quarkus understøtter JAX-RS, MicroProfile Rest Client, JSON-P og JSON-B som den primære webprogrammeringsmodel. Spring-udviklere vil være glade for Quarkus' seneste support til Spring Web API, især REST-grænseflader. I lighed med Spring DI er hovedmålet med Spring Web API-support at gøre det muligt for Spring-udviklere at bruge Spring Web API'er sammen med MicroProfile API'er. Eksempler på, hvordan man bruger de understøttede Spring Web API'er, findes i Tabel 3, og flere oplysninger og eksempler om dette emne kan findes i Quarkus tutorial kaldet Forårs Webguide.

Tabel 3. Eksempler på brug af de understøttede Spring Web API'er.

Understøttede forårswebfunktioner
Примеры

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

Spring DataJPA

MicroProfile-brugere vil også sætte pris på, at Quarkus understøtter JPA ved hjælp af Hibernate ORM. Der er også gode nyheder for Spring-udviklere: Quarkus understøtter almindelige Spring Data JPA-annotationer og -typer. Eksempler på brug af de understøttede Spring Data JPA API'er er givet i tabel 4.
В projekt fra vores eksempel Spring Data JPA API'er bruges, og mere information er tilgængelig i Quarkus tutorial kaldet Spring Data JPA Guide.

Tabel 4. Eksempler på brug af understøttede Spring Data JPA API'er.

Understøttede Spring Data JPA-funktioner
Примеры

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Depotfragmenter

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

Afledte forespørgselsmetoder

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Brugerdefinerede forespørgsler

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'er

Fejltolerance

Fejltolerancekonstruktioner er meget vigtige for at forhindre kaskadefejl og skabe pålidelige mikroservicearkitekturer. Fjederudviklere har brugt afbrydere til fejltolerance i mange år. hystrix. Hystrix er dog ikke blevet opdateret i lang tid, men MicroProfiles Fault Tolerance er nu aktivt under udvikling og har flere års produktionsbrug bag sig. For at forbedre pålideligheden af ​​tjenester i Quarkus anbefales det derfor at bruge MicroProfile Fault Tolerance API'er, som eksempler er brugt i Tabel 5. For mere information om dette, se Quarkus manualen Vejledning om fejltolerance.

Tabel 5. Eksempler på brug af understøttede MicroProfile Fault Tolerance API'er.

MicroProfile-fejltolerancefunktioner
beskrivelse
Примеры

@Asynkron

Udfører logik i en separat tråd

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

@Skutter

Begræns antallet af samtidige anmodninger

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

@Afbryder

Smart fejlhåndtering og genopretning fra fejl

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

@Falde tilbage

Kalder alternativ logik i tilfælde af fejl

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

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

Prøv igen

Prøv igen, hvis anmodningen mislykkedes

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

Timeout

Timeout for fejlkontrol

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

Tjektjenester (Service Health)

Kubernetes-platforme overvåger containernes tilstand ved hjælp af specielle tjenester. For at give den underliggende platform mulighed for at overvåge tjenester, bruger Spring-udviklere typisk en tilpasset HealthIndicator og Spring Boot Actuator. I Quarkus kan dette gøres ved hjælp af MicroProfile Health, som som standard udfører et liveness-tjek, men kan konfigureres til samtidig at tjekke liveness og parathed. Eksempler på, hvordan du bruger de understøttede MicroProfile Health API'er, findes i tabel 6, og yderligere oplysninger findes i Quarkus-manualen Sundhedsguide.

Tabel 6: Eksempler på brug af understøttede MicroProfile Health API'er.

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

@Livighed

Platformen genstarter mislykkede containeriserede applikationer
Endpoint:
vært:8080/sundhed/live

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

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

@Beredskab

Platformen sender ikke trafik til containeriserede applikationer, hvis den ikke er klar
Endpoint:
vært:8080/sundhed/klar

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

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

Metrics

Applikationer giver målinger til enten operationelle formål (for at overvåge præstations-SLA'er) eller ikke-operative formål (forretnings-SLA'er). Spring-udviklere leverer metrics ved hjælp af Spring Boot Actuator og Micrometer. Til gengæld bruger Quarkus MicroProfile Metrics til at levere baseline-metrics (JVM og operativsystem), leverandør-metrics (Quarkus) og applikations-metrics. MicroProfile Metrics kræver, at implementeringen understøtter JSON og OpenMetrics (Prometheus) outputformater. Eksempler på brug af MicroProfile Metrics API er givet i tabel 7.

В projekt fra vores eksempel MicroProfile Metrics bruges til at levere applikationsmetrics. For mere information, se Quarkus-manualen Vejledning til metrics.

Tabel 7. Eksempler på brug af MicroProfile Metrics API'er.

MicroProfile Metrics funktioner
beskrivelse
Примеры

@Tællet

Angiver en tæller, der tæller antallet af gange, et kommenteret objekt er blevet kaldt

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

@ConcurrentGauge

Angiver en måler, der tæller antallet af samtidige opkald til et kommenteret objekt

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

@Målestok

Betegner en målersensor, der måler værdien af ​​et kommenteret objekt

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

@Målet

Betegner en målersensor, der overvåger opkaldsfrekvensen for et kommenteret objekt

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

metric

En annotation, der indeholder information om metadata, når der modtages en anmodning om at indtaste eller producere en metrik

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

Tidsindstillet

Angiver en timer, der sporer varigheden af ​​et kommenteret objekt

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

Metriske endepunkter

Applikationsmålinger localhost:8080/metrics/applikation
Grundlæggende målinger localhost:8080/metrics/base
Leverandørmålinger localhost:8080/metrics/leverandør
Alle målinger localhost:8080/metrics

MicroProfile Rest Client

Mikrotjenester leverer ofte RESTful-endepunkter, der kræver tilsvarende klient-API'er at arbejde med. For at bruge RESTful-endepunkter bruger Spring-udviklere typisk RestTemplate. Quarkus tilbyder MicroProfile Rest Client API'er til at løse dette problem, eksempler på brug er givet i tabel 8.

В projekt fra vores eksempel brugen af ​​RESTful-endepunkter udføres ved hjælp af MicroProfile Rest Client. Flere oplysninger og eksempler om dette emne kan findes i Quarkus-manualen Rest klientvejledning.

Tabel 8. Eksempler på brug af MicroProfile Rest Client API'er.

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

@RegisterRestClient

Registrerer en indtastet Java-grænseflade som en REST-klient

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

@RestClient

Markerer implementeringen af ​​en forekomst af en indtastet REST-klientgrænseflade

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

Indledningsbøn

Kalder et REST-endepunkt

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

mp-rest/url

Specificerer REST-slutpunktet

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

Resultaterne af

I denne blog, der primært er rettet mod Spring-udviklere, tog vi et hurtigt kig på, hvordan man bruger Spring API'erne med MicroProfile API'erne i Quarkus til at udvikle Java-mikrotjenester og derefter kompilere dem til indbygget binær kode, der sparer hundredvis af megabyte RAM og lancerer i et spørgsmål om millisekunder.

Som du allerede har forstået, kan du finde flere oplysninger om support til Spring og MicroProfile API'erne samt en masse andre nyttige oplysninger i Quarkus manualer.

Kilde: www.habr.com

Tilføj en kommentar