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

Quandu si sviluppanu microservizi Java, hè spessu crede chì и 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 è vi mostra cumu utilizà simultaneamente l'API Spring è novi funziunalità utili .
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 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ì. , 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 Risorse è offerte Kubernetes 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 , 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 è l'API Spring Dependency Injection (Spring DI). Sè vo travaglià cù MicroProfile, , 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.
В Aduprà sia CDI è Spring Dependency Injection. Per più infurmazione è esempi nantu à questu tema, vede a guida Quarkus chjamata .
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
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configurazione
@Configuration
public class AppConfiguration {
@Bean(name = "capitalizeFunction")
public StringFunction capitalizer() {
return String::toUpperCase;
}
}
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
@Override
public String apply(String s) {
return s;
}
}
@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. .
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.
В Spring Data JPA API sò usati è più infurmazione hè dispunibule in u tutoriale Quarkus chjamatu .
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. . 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. .
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";
}
Riprova in casu di fallimentu di a dumanda
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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. .
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.
В MicroProfile Metrics sò usati per furnisce metriche di l'applicazione. Per più infurmazione, vede u manuale di Quarkus .
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;
}
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;
}
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 : 8080/metrics/application
Metriche basiche : 8080/metrics/base
metrica di u venditore : 8080/metrics/vendor
Tutti i metrichi : 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.
В 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 .
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 .
Source: www.habr.com
