Come Quarkus combina MicroProfile e Spring

Ciao a tutti, ecco il terzo post della serie Quarkus!

Come Quarkus combina MicroProfile e Spring

Quando si sviluppano microservizi Java, si crede spesso che Microprofilo Eclipse и Stivale primaverile sono API separate e indipendenti. Per impostazione predefinita, i programmatori tendono a utilizzare le API a cui sono già abituati, poiché l'apprendimento di nuovi framework e componenti runtime richiede molto tempo. Oggi proveremo a semplificare lo sviluppo di alcuni popolari API MicroProfile per gli sviluppatori Spring e mostrarti come utilizzare contemporaneamente l'API Spring e nuove utili funzionalità Quarkù.

Un po' più in dettaglio, esamineremo innanzitutto l'ambito e i dettagli del modo in cui Quarkus supporta le API Spring per mostrare agli sviluppatori Spring come utilizzare l'API MicroProfile nel loro lavoro quotidiano. Successivamente, introdurremo le API MicroProfile, utili per gli sviluppatori Spring durante la creazione di microservizi.

Perchè Quarkus? Innanzitutto, si tratta di codifica in tempo reale, ovvero il ricaricamento automatico di eventuali modifiche nell'API MicroProfile, nell'API Spring e in altre API Java, che viene eseguito con un solo comando: mvn quarkus:dev. In secondo luogo, discusso in nel nostro esempio сервис Person (он компилируется из API-интерфейсов Spring, MicroProfile и JPA в двоичный файл с использованием нативного образа GraalVM) запускается всего за 0.055 секунды и занимает около 90 МБ в оперативной памяти (RSS) на конечной точке приложения RESTful. Причем сама его компиляция выполняется всего одной командой: mvn package -Pnative.

Non entreremo nei dettagli su MicroProfile, se non per aiutare gli sviluppatori Spring a capire come possono utilizzare le API Spring con le API MicroProfile in Quarkus.

Contenitori e Kubernetes

Per mantenere questo articolo semplice, qui tratteremo solo gli aspetti di alto livello del supporto. kubernetes, perché è importante capire. Quarkus si posiziona come stack Java per Kubernetes, è progettato per ridurre al minimo il consumo di memoria e il tempo di avvio delle applicazioni e dei servizi Java e, di conseguenza, aumentarne la densità sull'host e ridurre i costi complessivi.

Anche Quarkus supporta la generazione automatica ресурсов Kubernetes и предлагает guide per la distribuzione su piattaforme Kubernetes e Red Hat OpenShift. Inoltre, Quarkus genera automaticamente i file Dockerfile.jvm (pacchetto JVM) e Dockerfile.native (pacchetto binario nativo) necessari per creare contenitori.

Infine, concentrandosi su Kubernetes come ambiente di distribuzione di destinazione, Quarkus non utilizza i framework Java nei casi in cui funzionalità simili sono implementate a livello della piattaforma Kubernetes stessa. La tabella 1 fornisce una mappa della corrispondenza funzionale tra Kubernetes e i tipici framework Java utilizzati dagli sviluppatori Spring.

Tabella 1. Mappa della corrispondenza funzionale tra framework Java e Kubernetes.

funzionale
Stivale primaverile tradizionale
kubernetes

Scoperta del servizio
Eureka
DNS

Configurazione
Configurazione cloud primaverile
Mappe di configurazione/Segreti

Bilancio del carico
Barra multifunzione (lato client)
Servizio, controller di replica (lato server)

Compilazione ed esecuzione del codice dall'esempio

In questo articolo facciamo riferimento a progetto di esempio, где совместно используются API-интерфейсы Spring и MicroProfile и даже тот самый Java-класс. Код из этого примера можно скомпилировать и запустить из командной строки, подробнее см. файл README.md.

API del framework primaverile

Iniezione di dipendenza

Quarkus supporta una gamma di Contesti e API CDI (Dependency Injection). e API Spring Dependency Injection (Spring DI). Se lavori con MicroProfile, Java EE e Giacarta EE, allora hai già molta familiarità con il CDI. D'altro canto, gli sviluppatori Spring possono utilizzare l'estensione Quarkus per l'API Spring DI per ottenere la compatibilità con Spring DI. Esempi di utilizzo delle API Spring DI supportate sono forniti nella Tabella 2.

В progetto dal nostro esempio Utilizza sia CDI che Spring Dependency Injection. Maggiori informazioni ed esempi su questo argomento possono essere trovati nella guida Quarkus chiamata Guida DI primavera.

Tabella 2. Esempi di utilizzo delle API Spring DI supportate.

Funzionalità Spring DI supportate
Примеры

Iniezione del costruttore

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

Iniezione sul campo
Autocablato
Valore

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Fagiolo
@Configurazione

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

Componente

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

Servizi

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

   public String getPrefix() {
      return message;
   }
}

Веб-фреймворк

Gli utenti di MicroProfile apprezzeranno il fatto che Quarkus supporti JAX-RS, MicroProfile Rest Client, JSON-P e JSON-B come modello di programmazione web principale. Gli sviluppatori Spring saranno soddisfatti del recente supporto di Quarkus per l'API Web Spring, in particolare per le interfacce REST. Analogamente a Spring DI, l'obiettivo principale del supporto dell'API Spring Web è consentire agli sviluppatori Spring di utilizzare le API Web Spring insieme alle API MicroProfile. Esempi di come utilizzare le API Web Spring supportate sono forniti nella Tabella 3 e ulteriori informazioni ed esempi su questo argomento possono essere trovati nel tutorial di Quarkus chiamato Guida web primaverile.

Tabella 3. Esempi di utilizzo delle API Web Spring supportate.

Funzionalità Web primaverili supportate
Примеры

@RestController
@RequestMapping

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

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

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

Dati di primavera JPA

Gli utenti MicroProfile apprezzeranno anche il fatto che Quarkus supporti JPA utilizzando Hibernate ORM. Ci sono anche buone notizie per gli sviluppatori Spring: Quarkus supporta annotazioni e tipi JPA Spring Data comuni. Esempi di utilizzo delle API JPA Spring Data supportate sono forniti nella Tabella 4.
В progetto dal nostro esempio Vengono utilizzate le API Spring Data JPA e ulteriori informazioni sono disponibili nel tutorial di Quarkus chiamato Guida all'APP sui dati di primavera.

Tabella 4. Esempi di utilizzo delle API JPA Spring Data supportate.

Funzionalità JPA Spring Data supportate
Примеры

CrudRepository

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

Repository
JpaRepository
Repository PagingAndSorting

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Frammenti del repository

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

Metodi di interrogazione derivati

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Query definite dall'utente

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 MicroProfilo

Tolleranza ai guasti

I costrutti di tolleranza agli errori sono molto importanti per prevenire errori a cascata e creare architetture di microservizi affidabili. Gli sviluppatori di Spring utilizzano da molti anni gli interruttori automatici per la tolleranza ai guasti. Istrige. Tuttavia, Hystrix non viene aggiornato da molto tempo, ma la tolleranza agli errori di MicroProfile è ora in fase di sviluppo attivo e ha alle spalle diversi anni di utilizzo in produzione. Pertanto, per migliorare l'affidabilità dei servizi in Quarkus, si consiglia di utilizzare le API MicroProfile Fault Tolerance, i cui esempi sono utilizzati nella Tabella 5. Per ulteriori informazioni a riguardo, consultare il manuale di Quarkus Guida alla tolleranza agli errori.

Tabella 5. Esempi di utilizzo delle API MicroProfile Fault Tolerance supportate.

Funzionalità di tolleranza agli errori MicroProfile
descrizione
Примеры

@Asincrono

Esecuzione della logica in un thread separato

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

@Paratia

Limita il numero di richieste simultanee

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

@Interruttore

Gestione intelligente dei guasti e ripristino dai guasti

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

@Ricaderci

Richiamo della logica alternativa in caso di guasto

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

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

Riprova

Riprovare in caso di errore della richiesta

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

timeout

Timeout del controllo errori

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

Controllo dei servizi (integrità del servizio)

Le piattaforme Kubernetes monitorano lo stato dei container utilizzando servizi speciali. Per consentire alla piattaforma sottostante di monitorare i servizi, gli sviluppatori Spring utilizzano in genere un HealthIndicator e un Spring Boot Actuator personalizzati. In Quarkus, questo può essere fatto utilizzando MicroProfile Health, che per impostazione predefinita esegue un controllo di attività, ma può essere configurato per verificare simultaneamente l'attività e la disponibilità. Esempi di come utilizzare le API MicroProfile Health supportate sono forniti nella Tabella 6 e ulteriori informazioni sono fornite nel manuale Quarkus Guida alla salute.

Tabella 6: esempi di utilizzo delle API MicroProfile Health supportate.

Funzionalità di salute di MicroProfile
descrizione
Примеры

@Vitalità

La piattaforma riavvia le applicazioni containerizzate non riuscite
endpoint:
host:8080/salute/live

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

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

@Prontezza

La piattaforma non invierà traffico alle applicazioni containerizzate se non è pronta
endpoint:
host:8080/salute/pronto

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

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

Metrica

Le applicazioni forniscono metriche per scopi operativi (per monitorare gli SLA prestazionali) o per scopi non operativi (SLA aziendali). Gli sviluppatori Spring forniscono misurazioni utilizzando Spring Boot Actuator e Micrometer. A sua volta, Quarkus utilizza MicroProfile Metrics per fornire metriche di base (JVM e sistema operativo), metriche dei fornitori (Quarkus) e metriche delle applicazioni. MicroProfile Metrics richiede che l'implementazione supporti i formati di output JSON e OpenMetrics (Prometheus). Esempi di utilizzo dell'API MicroProfile Metrics sono forniti nella Tabella 7.

В progetto dal nostro esempio Le metriche MicroProfile vengono utilizzate per fornire metriche dell'applicazione. Per ulteriori informazioni consultare il manuale di Quarkus Guida alle metriche.

Tabella 7. Esempi di utilizzo delle API MicroProfile Metrics.

Funzionalità metriche microprofilo
descrizione
Примеры

@Contato

Denota un contatore che conta il numero di volte in cui è stato chiamato un oggetto annotato

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

@ConcurrentGauge

Indica un indicatore che conta il numero di chiamate simultanee a un oggetto annotato

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

@Misura

Indica un sensore di livello che misura il valore di un oggetto annotato

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

@Metered

Indica un sensore del misuratore che monitora la frequenza di chiamata di un oggetto annotato

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

Metrico

Un'annotazione contenente informazioni sui metadati quando viene ricevuta una richiesta per inserire o produrre una metrica

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

Timed

Обозначает таймер, отслеживающий длительность аннотированного объекта

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

Endpoint delle metriche

Metriche dell'applicazione localhost:8080/metriche/applicazione
Metriche di base localhost:8080/metrica/base
Metriche del fornitore localhost:8080/metriche/venditore
Tutte le metriche localhost:8080/metrica

Client di riposo MicroProfile

I microservizi spesso forniscono endpoint RESTful che richiedono il funzionamento delle API client corrispondenti. Per utilizzare gli endpoint RESTful, gli sviluppatori Spring utilizzano in genere RestTemplate. Quarkus offre API Rest Client MicroProfile per risolvere questo problema, i cui esempi di utilizzo sono riportati nella Tabella 8.

В progetto dal nostro esempio l'uso degli endpoint RESTful viene effettuato utilizzando MicroProfile Rest Client. Maggiori informazioni ed esempi su questo argomento possono essere trovati nel manuale Quarkus Guida per il cliente Resto.

Tabella 8. Esempi di utilizzo delle API Rest Client MicroProfile.

Funzionalità client di riposo MicroProfile
descrizione
Примеры

@RegisterRestClient

Registra un'interfaccia Java tipizzata come client REST

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

@RestClient

Contrassegna l'implementazione di un'istanza di un'interfaccia client REST tipizzata

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

Invocazione

Chiama 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 di

In questo blog, rivolto principalmente agli sviluppatori Spring, abbiamo dato una rapida occhiata a come utilizzare le API Spring con le API MicroProfile in Quarkus per sviluppare microservizi Java e poi compilarli in codice binario nativo che consente di risparmiare centinaia di megabyte di RAM e si avvia in questione di millisecondi.

Come hai già capito, maggiori informazioni sul supporto per le API Spring e MicroProfile, oltre a molte altre informazioni utili, possono essere trovate in Manuali Quarkus.

Fonte: habr.com

Aggiungi un commento