Com Quarkus combina MicroProfile i Spring

Hola a tots, aquí teniu la tercera publicació de la sèrie Quarkus!

Com Quarkus combina MicroProfile i Spring

Quan es desenvolupen microserveis Java, sovint es creu que eclipsi MicroProfile и Arrencada de primavera són API separades i independents. Per defecte, els programadors solen utilitzar les API a les quals ja estan acostumats, ja que l'aprenentatge de nous frameworks i components d'execució requereix molt de temps. Avui intentarem simplificar el desenvolupament d'alguns populars API MicroProfile per a desenvolupadors de Spring i us mostrarà com utilitzar simultàniament l'API Spring i noves funcions útils Quarkus.

Amb una mica més de detall, primer veurem l'abast i els detalls de com Quarkus admet les API de Spring per mostrar als desenvolupadors de Spring com utilitzar l'API MicroProfile en el seu dia a dia. A continuació, tractarem les API de MicroProfile, que són útils per als desenvolupadors de Spring quan creen microserveis.

Per què Quarkus? En primer lloc, es tracta de codificació en directe, és a dir, la recàrrega automàtica de qualsevol canvi a l'API MicroProfile, l'API Spring i altres API de Java, que es realitza amb només una ordre: mvn quarkus:dev. En segon lloc, comentat a en el nostre exemple el servei Person (que es compila des de les API Spring, MicroProfile i JPA en un binari mitjançant la imatge nativa de GraalVM) s'inicia en només 0.055 segons i ocupa uns 90 MB de RAM (RSS) al punt final de l'aplicació RESTful. A més, la seva compilació en si es realitza amb una sola ordre: mvn package -Pnative.

No entrarem en detalls sobre MicroProfile, sinó per ajudar els desenvolupadors de Spring a entendre com poden utilitzar les API de Spring amb les API de MicroProfile a Quarkus.

Contenidors i Kubernetes

Per mantenir aquest article senzill, només tractarem els aspectes d'alt nivell del suport aquí. Kubernetes, perquè és important entendre. Quarkus es posiciona com una pila Java per a Kubernetes, està dissenyat per minimitzar el consum de memòria i el temps d'inici de les aplicacions i serveis Java i, com a resultat, augmentar la seva densitat a l'amfitrió i reduir els costos globals.

Quarkus també admet la generació automàtica Recursos i ofertes de Kubernetes guies per al desplegament a les plataformes Kubernetes i Red Hat OpenShift. A més, Quarkus genera automàticament els fitxers Dockerfile.jvm (embalatge JVM) i Dockerfile.native (embalatge binari natiu) necessaris per crear contenidors.

Finalment, en centrar-se en Kubernetes com a entorn de desplegament objectiu, Quarkus no utilitza marcs Java en els casos en què s'implementa una funcionalitat similar al nivell de la pròpia plataforma Kubernetes. La taula 1 proporciona un mapa de la correspondència funcional entre Kubernetes i els frameworks Java típics utilitzats pels desenvolupadors de Spring.

Taula 1. Mapa de correspondència funcional entre frameworks Java i Kubernetes.

Funcional
Bota de primavera tradicional
Kubernetes

Descobriment de serveis
Eureka
DNS

Configuració
Spring Cloud Configuració
Configuració de mapes/secrets

Equilibri de càrregues
Cinta (costat del client)
Servei, controlador de rèplica (costat del servidor)

Compilant i executant el codi de l'exemple

En aquest article ens referim projecte exemple, on s'utilitzen conjuntament les API Spring i MicroProfile i fins i tot la mateixa classe Java. El codi d'aquest exemple es pot compilar i executar des de la línia d'ordres; consulteu el fitxer README.md per obtenir-ne més informació.

API de Spring Framework

Injecció de dependència

Quarkus admet una varietat de API de contexts i injecció de dependències (CDI). i les API Spring Dependency Injection (Spring DI). Si esteu treballant amb MicroProfile, Java EE i Jakarta EE, llavors ja estàs molt familiaritzat amb CDI. D'altra banda, els desenvolupadors de Spring poden utilitzar l'API de Quarkus Extension for Spring DI per aconseguir la compatibilitat amb Spring DI. A la taula 2 es donen exemples d'ús de les API Spring DI admeses.

В projecte a partir del nostre exemple Utilitza tant CDI com Spring Dependency Injection. Podeu trobar més informació i exemples sobre aquest tema a la guia Quarkus anomenada Guia de primavera DI.

Taula 2. Exemples d'ús de les API Spring DI admeses.

Funcions de Spring DI compatibles
Примеры

Injecció del constructor

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

Injecció de camp
Cablejat automàticament
Valor

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Fesol
@Configuració

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

servei

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

   public String getPrefix() {
      return message;
   }
}

Marc web

Els usuaris de MicroProfile els encantarà que Quarkus admeti JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B com a model de programació web principal. Els desenvolupadors de Spring estaran satisfets amb el suport recent de Quarkus per a l'API Spring Web, en particular les interfícies REST. De manera similar al Spring DI, l'objectiu principal del suport de l'API Spring Web és permetre als desenvolupadors de Spring utilitzar les API web de Spring juntament amb les API de MicroProfile. A la taula 3 es proporcionen exemples de com utilitzar les API web de Spring admeses, i es poden trobar més informació i exemples sobre aquest tema al tutorial de Quarkus anomenat Guia web de primavera.

Taula 3. Exemples d'ús de les API web de Spring admeses.

Funcions web de Spring compatibles
Примеры

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (parcial)

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

Spring DataJPA

Els usuaris de MicroProfile també apreciaran que Quarkus admet JPA mitjançant l'ORM d'Hibernate. També hi ha bones notícies per als desenvolupadors de Spring: Quarkus admet anotacions i tipus JPA de Spring Data comunes. A la taula 4 es donen exemples d'ús de les API JPA de Spring Data admeses.
В projecte a partir del nostre exemple S'utilitzen les API JPA de Spring Data i hi ha més informació disponible al tutorial de Quarkus anomenat Spring Data Guia JPA.

Taula 4. Exemples d'ús de les API JPA de Spring Data admeses.

Característiques JPA de Spring Data compatibles
Примеры

CrudRepository

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

Dipòsit
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragments del dipòsit

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

Mètodes de consulta derivats

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Consultes definides per l'usuari

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 de MicroProfile

Falta de tolerància

Les construccions de tolerància a errors són molt importants per prevenir errors en cascada i crear arquitectures de microserveis fiables. Els desenvolupadors de Spring han estat utilitzant interruptors per a la tolerància a fallades durant molts anys. Hystrix. Tanmateix, Hystrix no s'ha actualitzat des de fa molt de temps, però la Fault Tolerance de MicroProfile s'està desenvolupant activament i té diversos anys d'ús de producció darrere. Per tant, per millorar la fiabilitat dels serveis a Quarkus, es recomana utilitzar les API de tolerància a errors de MicroProfile, exemples de les quals s'utilitzen a la Taula 5. Per obtenir més informació sobre això, consulteu el manual de Quarkus Guia de tolerància a fallades.

Taula 5. Exemples d'ús de les API de tolerància a errors de MicroProfile compatibles.

Característiques de tolerància a errors de MicroProfile
Descripció
Примеры

@Asíncrons

Executant la lògica en un fil separat

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

@Mampara

Limitació del nombre de peticions simultànies

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

@Tallacircuits

Gestió intel·ligent de fallades i recuperació de fallades

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

@Retrocedir

Crida a lògica alternativa en cas de fallada

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

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

tornar a intentar

Torna-ho a provar en cas d'error de sol·licitud

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

Temps d'espera

Temps d'espera del control d'errors

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

Serveis de comprovació (Salut del servei)

Les plataformes Kubernetes controlen la salut dels contenidors mitjançant serveis especials. Per permetre que la plataforma subjacent supervisi els serveis, els desenvolupadors de Spring solen utilitzar un HealthIndicator i un actuador d'arrencada de Spring personalitzats. A Quarkus, això es pot fer mitjançant MicroProfile Health, que de manera predeterminada realitza una comprovació de vivacitat, però es pot configurar per comprovar simultàniament la vitalitat i la preparació. A la Taula 6 es proporcionen exemples de com utilitzar les API de MicroProfile Health admeses i es proporciona informació addicional al manual de Quarkus Guia de salut.

Taula 6: exemples d'ús de les API MicroProfile Health admeses.

Característiques de MicroProfile Health
Descripció
Примеры

@Vivència

La plataforma reinicia les aplicacions en contenidors fallides
Punt final:
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();  
}

@Preparació

La plataforma no enviarà trànsit a aplicacions en contenidors si no està preparada
Punt final:
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();  
}

Mètriques

Les aplicacions proporcionen mètriques amb finalitats operatives (per supervisar els SLA de rendiment) o amb finalitats no operatives (SLA comercials). Els desenvolupadors de Spring proporcionen mètriques mitjançant Spring Boot Actuator i Micrometer. Al seu torn, Quarkus utilitza MicroProfile Metrics per proporcionar mètriques de referència (JVM i sistema operatiu), mètriques de proveïdors (Quarkus) i mètriques d'aplicacions. MicroProfile Metrics requereix que la implementació admeti els formats de sortida JSON i OpenMetrics (Prometheus). A la taula 7 es donen exemples d'ús de l'API de mètriques de MicroProfile.

В projecte a partir del nostre exemple Les mètriques MicroProfile s'utilitzen per proporcionar mètriques d'aplicació. Per obtenir més informació, consulteu el manual de Quarkus Guia de mètriques.

Taula 7. Exemples d'ús de les API de mètriques de MicroProfile.

Característiques de mètriques de microprofil
Descripció
Примеры

@Comptat

Indica un comptador que compta el nombre de vegades que s'ha cridat un objecte anotat

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

@ConcurrentGauge

Indica un indicador que compta el nombre de trucades concurrents a un objecte anotat

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

@Gauge

Indica un sensor de mesura que mesura el valor d'un objecte anotat

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

@mesurat

Indica un sensor de mesura que supervisa la freqüència de trucada d'un objecte anotat

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

Mètric

Una anotació que conté informació sobre metadades quan es rep una sol·licitud per introduir o produir una mètrica

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

Temporitzat

Indica un temporitzador que fa un seguiment de la durada d'un objecte anotat

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

Punts finals de mètriques

Mètriques de l'aplicació localhost:8080/metrics/application
Mètriques bàsiques localhost:8080/metrics/base
Mètriques de proveïdors localhost:8080/metrics/vendor
Totes les mètriques localhost:8080/mètrica

Client Rest de MicroProfile

Els microserveis sovint proporcionen punts finals RESTful que requereixen les API de client corresponents per treballar-hi. Per utilitzar els punts finals RESTful, els desenvolupadors de Spring solen utilitzar RestTemplate. Quarkus ofereix API MicroProfile Rest Client per resoldre aquest problema, a la taula 8 es donen exemples d'ús.

В projecte a partir del nostre exemple l'ús de punts finals RESTful es fa mitjançant el MicroProfile Rest Client. Podeu trobar més informació i exemples sobre aquest tema al manual de Quarkus Guia del client de descans.

Taula 8. Exemples d'ús de les API de client MicroProfile Rest.

Característiques del client MicroProfile Rest
Descripció
Примеры

@RegisterRestClient

Registra una interfície Java escrita com a client REST

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

@RestClient

Marca la implementació d'una instància d'una interfície de client REST escrita

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

Invocació

Crida a un punt final REST

System.out.println(
   restClient.getSalutation());

mp-rest/url

Especifica el punt final REST

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Resultats de

En aquest bloc, adreçat principalment als desenvolupadors de Spring, hem fet una ullada ràpida a com utilitzar les API Spring amb les API MicroProfile a Quarkus per desenvolupar microserveis Java i després compilar-los en codi binari natiu que estalvia centenars de megabytes de RAM i es llança en qüestió de mil·lisegons.

Com ja heu entès, podeu trobar més informació sobre el suport per a les API Spring i MicroProfile, així com molta altra informació útil, a Manuals de Quarkus.

Font: www.habr.com

Afegeix comentari