Salutare tuturor, iată a treia postare din seria Quarkus!
Când se dezvoltă microservicii Java, se crede adesea că
Mai în detaliu, vom analiza mai întâi domeniul de aplicare și detaliile modului în care Quarkus acceptă API-urile Spring pentru a le arăta dezvoltatorilor Spring cum să folosească API-ul MicroProfile în munca lor de zi cu zi. Apoi vom aborda API-urile MicroProfile, care sunt utile pentru dezvoltatorii Spring atunci când creează microservicii.
De ce Quarkus? În primul rând, aceasta este codare live, adică reîncărcarea automată a oricăror modificări în API-ul MicroProfile, API-ul Spring și alte API-uri Java, care se realizează cu o singură comandă: mvn quarkus:dev. În al doilea rând, considerat în
Nu vom intra în detalii despre MicroProfile, decât pentru a ajuta dezvoltatorii Spring să înțeleagă cum pot folosi API-urile Spring cu API-urile MicroProfile în Quarkus.
Containere și Kubernetes
Pentru a menține acest articol simplu, vom acoperi aici doar aspectele de nivel înalt ale asistenței.
Quarkus, de asemenea
În cele din urmă, concentrându-se pe Kubernetes ca mediu de implementare țintă, Quarkus nu utilizează cadre Java în cazurile în care funcționalități similare sunt implementate la nivelul platformei Kubernetes în sine. Tabelul 1 oferă o hartă a corespondenței funcționale dintre Kubernetes și cadrele Java tipice utilizate de dezvoltatorii Spring.
Tabelul 1. Harta corespondenței funcționale dintre cadrele Java și Kubernetes.
funcțional
Cizme tradiționale de primăvară
Kubernetes
Descoperirea serviciului
Evrica
DNS
Configuraţie
Spring Cloud Config
Configurare Hărți/Secrete
Echilibrarea sarcinii
Panglică (partea client)
Service, controler de replicare (partea server)
Compilarea și rularea codului din exemplu
În acest articol ne referim
API-urile Spring Framework
Injecție de dependență
Quarkus acceptă o serie de
В
Tabelul 2. Exemple de utilizare a API-urilor Spring DI acceptate.
Caracteristici Spring DI acceptate
exemple
Injecție de constructor
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Injecție în câmp
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configurare
@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;
}
}
Cadru web
Utilizatorilor MicroProfile le va plăcea că Quarkus acceptă JAX-RS, MicroProfile Rest Client, JSON-P și JSON-B ca model principal de programare web. Dezvoltatorii Spring vor fi mulțumiți de suportul recent al Quarkus pentru API-ul Spring Web, în special pentru interfețele REST. Similar cu Spring DI, scopul principal al suportului Spring Web API este de a permite dezvoltatorilor Spring să utilizeze Spring Web API împreună cu API-urile MicroProfile. Exemple de utilizare a API-urilor Spring Web acceptate sunt furnizate în Tabelul 3, iar mai multe informații și exemple despre acest subiect pot fi găsite în tutorialul Quarkus numit
Tabelul 3. Exemple de utilizare a API-urilor Spring Web acceptate.
Funcții Spring Web acceptate
exemple
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (parțial)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
Utilizatorii MicroProfile vor aprecia, de asemenea, că Quarkus acceptă JPA utilizând Hibernate ORM. Există și o veste bună pentru dezvoltatorii Spring: Quarkus acceptă adnotări și tipuri comune Spring Data JPA. Exemple de utilizare a API-urilor Spring Data JPA acceptate sunt date în Tabelul 4.
В
Tabelul 4. Exemple de utilizare a API-urilor Spring Data JPA acceptate.
Caracteristici JPA de date Spring acceptate
exemple
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repertoriu
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Fragmente de depozit
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Metode de interogare derivate
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Interogări definite de utilizator
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-uri MicroProfile
Toleranță la erori
Construcțiile de toleranță la erori sunt foarte importante pentru prevenirea eșecurilor în cascadă și pentru crearea arhitecturii de microservicii de încredere. Dezvoltatorii de arcuri au folosit întrerupătoare pentru toleranța la erori de mulți ani.
Tabelul 5. Exemple de utilizare a API-urilor MicroProfile Fault Tolerance acceptate.
Caracteristici MicroProfile Fault Tolerance
descriere
exemple
@Asincron
Executarea logicii într-un fir separat
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Perete despărțitor
Limitați numărul de solicitări simultane
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Întrerupător de circuit
Gestionarea inteligentă a defecțiunilor și recuperarea după defecțiuni
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Da înapoi
Apelarea unei logici alternative în caz de eșec
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Reîncercați la eșec la cerere
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Timeout pentru controlul eșecului
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Servicii de verificare (Service Health)
Platformele Kubernetes monitorizează starea containerelor folosind servicii speciale. Pentru a permite platformei de bază să monitorizeze serviciile, dezvoltatorii Spring folosesc de obicei un HealthIndicator personalizat și un Spring Boot Actuator. În Quarkus, acest lucru se poate face folosind MicroProfile Health, care în mod implicit efectuează o verificare a vieții, dar poate fi configurat pentru a verifica simultan gradul de viață și pregătirea. Exemple de utilizare a API-urilor MicroProfile Health acceptate sunt furnizate în Tabelul 6, iar informații suplimentare sunt furnizate în manualul Quarkus
Tabelul 6: Exemple de utilizare a API-urilor MicroProfile Health acceptate.
Caracteristici MicroProfile Health
descriere
exemple
@Vietate
Platforma repornește aplicațiile containerizate eșuate
Punct final:
gazdă:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Pregătire
Platforma nu va trimite trafic către aplicațiile containerizate dacă nu este gata
Punct final:
gazdă:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrici
Aplicațiile oferă valori fie în scopuri operaționale (pentru a monitoriza SLA-urile de performanță), fie în scopuri non-operaționale (SLA-uri de afaceri). Dezvoltatorii Spring oferă valori folosind Spring Boot Actuator și Micrometer. La rândul său, Quarkus folosește MicroProfile Metrics pentru a furniza valori de bază (JVM și sistem de operare), valori ale furnizorilor (Quarkus) și valori ale aplicațiilor. MicroProfile Metrics necesită ca implementarea să accepte formatele de ieșire JSON și OpenMetrics (Prometheus). Exemple de utilizare a API-ului MicroProfile Metrics sunt date în Tabelul 7.
В
Tabelul 7. Exemple de utilizare a API-urilor MicroProfile Metrics.
Caracteristici MicroProfile Metrics
descriere
exemple
@Numărate
Indică un numărător de contor care numără de câte ori a fost apelat un obiect adnotat
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Indică un indicator care numără numărul de apeluri simultane către un obiect adnotat
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Ecartament
Indică un senzor de măsurare care măsoară valoarea unui obiect adnotat
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Contorizat
Indică un senzor de contor care monitorizează frecvența apelurilor unui obiect adnotat
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
O adnotare care conține informații despre metadate atunci când se primește o solicitare de introducere sau producere a unei valori
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Indică un temporizator care urmărește durata unui obiect adnotat
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Puncte finale pentru valori
Valorile aplicației
Valori de bază
Valorile furnizorului
Toate valorile
MicroProfile Rest Client
Microserviciile furnizează adesea puncte finale RESTful care necesită API-uri client corespunzătoare pentru a lucra. Pentru a utiliza punctele finale RESTful, dezvoltatorii Spring folosesc de obicei RestTemplate. Quarkus oferă API-uri MicroProfile Rest Client pentru a rezolva această problemă, exemple de utilizare ale cărora sunt date în Tabelul 8.
В
Tabelul 8. Exemple de utilizare a API-urilor MicroProfile Rest Client.
Caracteristicile clientului MicroProfile Rest
descriere
exemple
@RegisterRestClient
Înregistrează o interfață Java tastata ca client REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Marchează implementarea unei instanțe a unei interfețe client REST tastate
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Invocare
Apelează un punct final REST
System.out.println(
restClient.getSalutation());
mp-rest/url
Specifică punctul final REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Rezultatele
În acest blog, destinat în principal dezvoltatorilor Spring, am aruncat o privire rapidă asupra modului de utilizare a API-urilor Spring cu API-urile MicroProfile în Quarkus pentru a dezvolta microservicii Java și apoi a le compila în cod binar nativ care salvează sute de megaocteți de RAM și se lansează în o chestiune de milisecunde.
După cum ați înțeles deja, mai multe informații despre suportul pentru API-urile Spring și MicroProfile, precum și multe alte informații utile, pot fi găsite în
Sursa: www.habr.com