Ciao a tutti, ecco il terzo post della serie Quarkus!
Quando si sviluppano microservizi Java, si crede spesso che
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
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.
Anche Quarkus
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
API del framework primaverile
Iniezione di dipendenza
Quarkus supporta una gamma di
В
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
@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;
}
}
Веб-фреймворк
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
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.
В
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.
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";
}
Riprovare in caso di errore della richiesta
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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
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.
В
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;
}
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(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Endpoint delle metriche
Metriche dell'applicazione
Metriche di base
Metriche del fornitore
Tutte le metriche
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.
В
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
Fonte: habr.com