Cumu Quarkus combina MicroProfile è Spring

Salute à tutti, eccu u terzu postu di a serie Quarkus !

Cumu Quarkus combina MicroProfile è Spring

Quandu si sviluppanu microservizi Java, hè spessu crede chì Eclissi Microprofilu и Stivali di primavera sò API separati è indipendenti. Per automaticamente, i programatori tendenu à utilizà l'API chì sò digià abituati, postu chì l'apprendimentu di novi frameworks è cumpunenti di runtime piglia assai tempu. Oghje avemu da pruvà à simplificà u sviluppu di qualchi populari API MicroProfile per i sviluppatori Spring è vi mostra cumu utilizà simultaneamente l'API Spring è novi funziunalità utili quarkus.

In un pocu di più di dettu, avemu da prima fighjà u scopu è i dettagli di cumu Quarkus supporta l'API Spring per mustrà i sviluppatori Spring cumu utilizà l'API MicroProfile in u so travagliu di ghjornu. Allora copreremu l'API MicroProfile, chì sò utili per i sviluppatori Spring quandu creanu microservizi.

Perchè Quarkus? Prima, questu hè a codificazione in diretta, vale à dì, ricaricamentu automaticu di qualsiasi cambiamenti in l'API MicroProfile, Spring API è altre API Java, chì hè realizatu cù un solu cumandamentu: mvn quarkus:dev. Siconda, discutitu in in u nostru esempiu u serviziu Person (chì compila da Spring, MicroProfile è API JPA in un binariu cù l'imaghjina nativa di GraalVM) principia in solu 0.055 seconde è occupa circa 90 MB di RAM (RSS) in l'endpoint di l'applicazione RESTful. Inoltre, a so compilazione stessu hè realizatu cù un solu cumandamentu: mvn package -Pnative.

Ùn andemu micca in dettagliu nantu à MicroProfile, salvu per aiutà i sviluppatori Spring à capisce cumu si ponu utilizà l'API Spring cù l'API MicroProfile in Quarkus.

Containers è Kubernetes

Per mantene stu articulu simplice, avemu da copre solu l'aspetti di altu livellu di supportu quì. Kubernetes, perchè hè impurtante di capiscenu. Quarkus hè posizionatu cum'è una pila Java per Kubernetes, hè pensatu per minimizzà u cunsumu di memoria è u tempu di startup di l'applicazioni è i servizii Java, è, in u risultatu, aumentà a so densità nantu à l'ospite è riduce i costi generale.

Quarkus ancu supporta a generazione automatica Risorse è offerte Kubernetes dirigenza per l'implementazione nantu à e piattaforme Kubernetes è Red Hat OpenShift. Inoltre, Quarkus genera automaticamente i schedarii Dockerfile.jvm (imballu JVM) è Dockerfile.native (imballaggio binariu nativu) necessariu per creà cuntenituri.

Infine, focalizendu Kubernetes cum'è l'ambiente di implementazione di destinazione, Quarkus ùn usa micca frameworks Java in i casi induve a funziunalità simili hè implementata à u livellu di a piattaforma Kubernetes stessa. A Tabella 1 furnisce una mappa di a corrispondenza funziunale trà Kubernetes è i frameworks Java tipici utilizati da i sviluppatori Spring.

Table 1. Mappa di currispundenza funziunale trà i frameworks Java è Kubernetes.

Funziunalità
Stivale di primavera tradiziunale
Kubernetes

Scuperta di serviziu
Eureka
DNS

Paràmetri
Spring Cloud Config
Config Maps / Secrets

Equilibrio di carica
Ribbon (lato cliente)
Serviziu, Controller di Replicazione (latu di u servitore)

Cumpilà è eseguisce u codice da l'esempiu

In questu articulu avemu riferitu prughjettu esempiu, induve l'API Spring è MicroProfile è ancu a stessa classa Java sò aduprate inseme. U codice in questu esempiu pò esse compilatu è eseguitu da a linea di cummanda, vede u schedariu README.md per i dettagli.

Spring Framework API

Iniezione di Dipendenza

Quarkus supporta una gamma di Cuntesti è API di iniezione di dipendenze (CDI). è l'API Spring Dependency Injection (Spring DI). Sè vo travaglià cù MicroProfile, Java EE è Jakarta EE, allora site digià assai familiarizatu cù CDI. Per d 'altra banda, i sviluppatori Spring ponu utilizà l'estensione Quarkus per l'API Spring DI per ottene cumpatibilità cù Spring DI. Esempii di usu di l'API Spring DI supportate sò datu in a Tabella 2.

В prughjettu da u nostru esempiu Aduprà sia CDI è Spring Dependency Injection. Per più infurmazione è esempi nantu à questu tema, vede a guida Quarkus chjamata Spring DI Guide.

Table 2. Esempii di usu di l'API Spring DI supportate.

Funzioni Spring DI supportate
esempi

Iniezione di custruttore

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

Iniezione di campu
Autowired
Value

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

âne
@Configurazione

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

Componenti

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

quadru web

L'utilizatori di MicroProfile amarà chì Quarkus supporta JAX-RS, MicroProfile Rest Client, JSON-P è JSON-B cum'è u mudellu di prugrammazione web primariu. I sviluppatori di primavera seranu cuntenti di u supportu recente di Quarkus per l'API Spring Web, in particulare l'interfacce REST. Simile à Spring DI, u scopu principale di u supportu Spring Web API hè di permette à i sviluppatori Spring di utilizà Spring Web API in cunjunzione cù l'API MicroProfile. Esempii di cumu utilizà l'API Spring Web supportati sò furniti in a Tabella 3, è più infurmazioni è esempi nantu à questu tema ponu esse truvati in u tutoriale Quarkus chjamatu. Guida Web di primavera.

Table 3. Esempii di usu di l'API Spring Web supportati.

Funzioni Web Spring supportate
esempi

@RestController
@RequestMapping

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

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

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

Spring DataJPA

L'utilizatori di MicroProfile apprezzeranu ancu chì Quarkus supporta JPA cù l'ORM Hibernate. Ci hè ancu una bona nutizia per i sviluppatori di Spring: Quarkus sustene l'annotazioni è i tipi di Spring Data JPA cumuni. Esempii di usu di l'API Spring Data JPA supportate sò datu in a Tabella 4.
В prughjettu da u nostru esempiu Spring Data JPA API sò usati è più infurmazione hè dispunibule in u tutoriale Quarkus chjamatu Spring Data JPA Guide.

Table 4. Esempii di usu di Spring Data JPA API supportati.

Funzioni di Spring Data JPA supportate
esempi

CrudRepository

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

Repository
JpaRepository
PagingAnd SortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Frammenti di repository

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

Metodi di ricerca derivati

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Interrogazioni definite da l'utilizatori

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

API MicroProfile

Tolleranza à i difetti

I custruzzioni di tolleranza à i difetti sò assai impurtanti per prevene i fallimenti in cascata è per creà architetture di microservizi affidabili. I sviluppatori di primavera anu utilizatu circuit-breakers per a toleranza di difetti per parechji anni. Hystrix. In ogni casu, Hystrix ùn hè micca aghjurnatu per un bellu pezzu, ma a Tolleranza di Fault di MicroProfile hè avà sviluppatu attivamente è hà parechji anni di usu di produzzione daretu. Dunque, per migliurà l'affidabilità di i servizii in Quarkus, hè cunsigliatu di utilizà l'API MicroProfile Fault Tolerance, esempi di quale sò usati in Table 5. Per più infurmazione nantu à questu, vede u manuale di Quarkus. Guida di tolleranza à i difetti.

Tabella 5. Esempii d'utilizazione di l'API MicroProfile Fault Tolerance supportate.

Funzioni di Tolleranza à i Guasti MicroProfile
discrizzione
esempi

@Asincronu

Eseguisce a logica in un filu separatu

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

@Paratia

Limità u numeru di richieste simultanee

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

@CircuitBreaker

Gestione intelligente di fallimenti è ricuperazione da fallimenti

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

@Fallback

Chjama a logica alternativa in casu di fallimentu

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

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

Retour

Riprova in casu di fallimentu di a dumanda

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

Pausa

Timeout di cuntrollu di fallimentu

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

Cuntrolla di servizii (serviziu di salute)

I plataformi Kubernetes monitoranu a salute di i cuntenituri cù servizii speciali. Per permette à a piattaforma sottostante di monitorà i servizii, i sviluppatori di Spring usanu tipicamente un HealthIndicator persunalizatu è Spring Boot Actuator. In Quarkus, questu pò esse fattu cù MicroProfile Health, chì per difettu esegue un cuntrollu di vivacità, ma pò esse cunfiguratu per verificà simultaneamente a vivacità è a prontezza. Esempii di cumu utilizà l'API MicroProfile Health supportati sò furniti in a Tabella 6, è infurmazioni supplementari sò furnite in u manuale di Quarkus. Guida di Salute.

Tabella 6: Esempi d'usu di l'API MicroProfile Health supportate.

Funzioni di MicroProfile Health
discrizzione
esempi

@Vivanza

A piattaforma riavvia l'applicazioni containerizzate falluti
Puntu finale:
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();  
}

@Pronta

A piattaforma ùn mandarà micca u trafficu à l'applicazioni containerizzate se ùn hè micca pronta
Puntu finale:
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();  
}

Metriche

L'applicazioni furniscenu metriche sia per scopi operativi (per monitorà SLA di rendiment) sia per scopi non operativi (SLA di cummerciale). I sviluppatori di primavera furniscenu metriche cù Spring Boot Actuator è Micrometer. In turnu, Quarkus usa MicroProfile Metrics per furnisce metriche di basa (JVM è sistema operatore), metriche di venditore (Quarkus) è metriche di l'applicazione. MicroProfile Metrics richiede chì l'implementazione supporta i formati di output JSON è OpenMetrics (Prometheus). Esempii di usu di l'API MicroProfile Metrics sò datu in a Tabella 7.

В prughjettu da u nostru esempiu MicroProfile Metrics sò usati per furnisce metriche di l'applicazione. Per più infurmazione, vede u manuale di Quarkus Guida di metrica.

Table 7. Esempii di usu di MicroProfile Metrics API.

Funzioni di MicroProfile Metrics
discrizzione
esempi

@cuntatu

Denota un contatore contatore chì conta u numeru di volte chì un oggettu annotatu hè statu chjamatu

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

@ConcurrentGauge

Denota un gauge chì conta u numeru di chjamate simultanee à un oggettu annotatu

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

@Gauge

Denota un sensor di calibre chì misura u valore di un oggettu annotatu

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

@Metered

Denota un sensoru di metru chì monitorizza a freccia di chjama di un oggettu annotatu

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

Metrica

Una annotazione chì cuntene infurmazione nantu à i metadati quandu una dumanda hè ricevuta per inserisce o pruduce una metrica

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

Tempo

Indica un timer chì traccia a durata di un oggettu annotatu

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

Punti finali di metrica

Metri di l'applicazione localhost: 8080/metrics/application
Metriche basiche localhost: 8080/metrics/base
metrica di u venditore localhost: 8080/metrics/vendor
Tutti i metrichi localhost: 8080/metrics

MicroProfile Rest Client

I microservizi spessu furniscenu punti finali RESTful chì necessitanu API di cliente currispondenti per travaglià. Per utilizà l'endpoint RESTful, i sviluppatori Spring generalmente utilizanu RestTemplate. Quarkus offre MicroProfile Rest Client APIs per risolve stu prublema, esempi di usu di quale sò datu in a Tabella 8.

В prughjettu da u nostru esempiu l'usu di l'endpoint RESTful hè fattu cù u MicroProfile Rest Client. Più infurmazione è esempi nantu à questu tema ponu esse truvati in u manuale di Quarkus Guida di u Cliente Rest.

Table 8. Esempii di usu di MicroProfile Rest Client API.

MicroProfile Rest Client Features
discrizzione
esempi

@RegisterRestClient

Registra una interfaccia Java digitata cum'è un cliente REST

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

@RestClient

Marca l'implementazione di una istanza di una interfaccia cliente REST tipata

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

Invocazione

Chjama un endpoint REST

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

mp-rest/url

Specifica l'endpoint REST

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

Risultati

In questu blog, destinatu principarmenti à i sviluppatori di Spring, avemu fattu un sguardu rapidu à cumu utilizà l'API Spring cù l'API MicroProfile in Quarkus per sviluppà i microservizi Java è poi compilalli in codice binariu nativu chì salva centinaie di megabyte di RAM è lancia in una questione di millisecondi.

Comu avete digià capitu, più infurmazione nantu à u supportu per l'API Spring è MicroProfile, è ancu assai altre informazioni utili, ponu esse truvate in Manuali Quarkus.

Source: www.habr.com

Add a comment