Cum combină Quarkus MicroProfile și Spring

Salutare tuturor, iată a treia postare din seria Quarkus!

Cum combină Quarkus MicroProfile și Spring

Când se dezvoltă microservicii Java, se crede adesea că Eclipse MicroProfile и Cizmă de primăvară sunt API-uri separate și independente. În mod implicit, programatorii tind să folosească API-urile cu care sunt deja obișnuiți, deoarece învățarea de noi cadre și componente de execuție necesită mult timp. Astăzi vom încerca să simplificăm dezvoltarea unor populare API MicroProfile pentru dezvoltatorii Spring și vă arată cum să utilizați simultan API-ul Spring și noi funcții utile quarkus.

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 în exemplul nostru serviciul Person (care se compilează din API-urile Spring, MicroProfile și JPA într-un binar folosind imaginea nativă GraalVM) începe în doar 0.055 secunde și ocupă aproximativ 90 MB de RAM (RSS) pe punctul final al aplicației RESTful. Mai mult decât atât, compilarea sa în sine este efectuată cu o singură comandă: mvn package -Pnative.

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. Kubernetes, pentru că este important să înțelegeți. Quarkus este poziționat ca o stivă Java pentru Kubernetes, este conceput pentru a minimiza consumul de memorie și timpul de pornire al aplicațiilor și serviciilor Java și, ca urmare, să crească densitatea acestora pe gazdă și să reducă costurile totale.

Quarkus, de asemenea acceptă generarea automată Resurse și oferte Kubernetes ghiduri pentru implementare pe platformele Kubernetes și Red Hat OpenShift. În plus, Quarkus generează automat fișierele Dockerfile.jvm (ambalaj JVM) și Dockerfile.native (ambalaj binar nativ) necesare pentru a crea containere.

Î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 exemplu de proiect, unde API-urile Spring și MicroProfile și chiar aceeași clasă Java sunt utilizate împreună. Codul din acest exemplu poate fi compilat și rulat din linia de comandă, consultați fișierul README.md pentru detalii.

API-urile Spring Framework

Injecție de dependență

Quarkus acceptă o serie de API-uri Contexts and Dependency Injection (CDI). și API-uri Spring Dependency Injection (Spring DI). Dacă lucrați cu MicroProfile, Java EE și Jakarta EE, atunci ești deja foarte familiarizat cu CDI. Pe de altă parte, dezvoltatorii Spring pot folosi Quarkus Extension for Spring DI API pentru a obține compatibilitatea cu Spring DI. Exemple de utilizare a API-urilor Spring DI acceptate sunt date în Tabelul 2.

В proiect din exemplul nostru Utilizează atât CDI, cât și Spring Dependency Injection. Pentru mai multe informații și exemple pe acest subiect, consultați ghidul Quarkus numit Ghid de primăvară DI.

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
Cablat automat
Valoare

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Fasole
@Configurare

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

Component

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

serviciu

@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 Ghid web de primăvară.

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.
В proiect din exemplul nostru Sunt utilizate API-urile Spring Data JPA și mai multe informații sunt disponibile în tutorialul Quarkus numit Ghidul JPA de date de primăvară.

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. Hystrix. Cu toate acestea, Hystrix nu a fost actualizat de mult timp, dar Fault Tolerance a MicroProfile se dezvoltă acum activ și are în spate câțiva ani de utilizare în producție. Prin urmare, pentru a îmbunătăți fiabilitatea serviciilor în Quarkus, se recomandă utilizarea API-urilor MicroProfile Fault Tolerance, exemple ale cărora sunt folosite în Tabelul 5. Pentru mai multe informații despre aceasta, consultați manualul Quarkus Ghid de toleranță la erori.

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

Reîncercați la eșec la cerere

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

Pauză

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 Ghid de sănătate.

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.

В proiect din exemplul nostru Măsurile MicroProfile sunt utilizate pentru a furniza valori ale aplicației. Pentru mai multe informații, consultați manualul Quarkus Ghid de metrici.

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

metric

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

Contra cronometru

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 localhost:8080/metrics/application
Valori de bază localhost:8080/metrics/bază
Valorile furnizorului localhost:8080/metrics/vendor
Toate valorile localhost:8080/metric

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.

В proiect din exemplul nostru utilizarea punctelor finale RESTful se face folosind MicroProfile Rest Client. Mai multe informații și exemple despre acest subiect pot fi găsite în manualul Quarkus Ghidul clientului Rest.

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 Manuale Quarkus.

Sursa: www.habr.com

Adauga un comentariu