Cómo Quarkus combina MicroProfile y Spring

Hola a todos, ¡aquí está la tercera publicación de la serie Quarkus!

Cómo Quarkus combina MicroProfile y Spring

Al desarrollar microservicios Java, a menudo se cree que Microperfil Eclipse и Bota de primavera son API separadas e independientes. De forma predeterminada, los programadores tienden a utilizar las API a las que ya están acostumbrados, ya que aprender nuevos marcos y componentes de tiempo de ejecución lleva mucho tiempo. Hoy intentaremos simplificar el desarrollo de algunos populares. API MicroProfile para desarrolladores de Spring y mostrarle cómo usar simultáneamente la API Spring y nuevas funciones útiles cuarcus.

Con un poco más de detalle, primero veremos el alcance y los detalles de cómo Quarkus admite las API de Spring para mostrar a los desarrolladores de Spring cómo usar la API MicroProfile en su trabajo diario. Luego cubriremos las API de MicroProfile, que son útiles para los desarrolladores de Spring al crear microservicios.

¿Por qué Quarkús? En primer lugar, se trata de codificación en vivo, es decir, recarga automática de cualquier cambio en MicroProfile API, Spring API y otras API de Java, que se realiza con un solo comando: mvn quarkus:dev. En segundo lugar, discutido en en nuestro ejemplo El servicio Person (que compila desde las API Spring, MicroProfile y JPA en un binario utilizando la imagen nativa de GraalVM) se inicia en solo 0.055 segundos y ocupa aproximadamente 90 MB de RAM (RSS) en el punto final de la aplicación RESTful. Además, su compilación se realiza con un solo comando: mvn package -Pnative.

No entraremos en detalles sobre MicroProfile, más que para ayudar a los desarrolladores de Spring a comprender cómo pueden usar las API de Spring con las API de MicroProfile en Quarkus.

Contenedores y Kubernetes

Para que este artículo sea sencillo, aquí solo cubriremos los aspectos de soporte de alto nivel. Kubernetes, porque es importante entender. Quarkus se posiciona como una pila de Java para Kubernetes, está diseñado para minimizar el consumo de memoria y el tiempo de inicio de las aplicaciones y servicios Java y, como resultado, aumentar su densidad en el host y reducir los costos generales.

Quarkus también admite generación automática Recursos y ofertas de Kubernetes guías para implementación en plataformas Kubernetes y Red Hat OpenShift. Además, Quarkus genera automáticamente los archivos Dockerfile.jvm (empaquetado JVM) y Dockerfile.native (empaquetado binario nativo) necesarios para crear contenedores.

Finalmente, al centrarse en Kubernetes como entorno de implementación de destino, Quarkus no utiliza marcos Java en los casos en que se implementa una funcionalidad similar a nivel de la propia plataforma Kubernetes. La Tabla 1 proporciona un mapa de la correspondencia funcional entre Kubernetes y los marcos Java típicos utilizados por los desarrolladores de Spring.

Tabla 1. Mapa de correspondencia funcional entre frameworks Java y Kubernetes.

Funcional
Bota de primavera tradicional
Kubernetes

Descubrimiento de servicio
Eureka
DNS

Configuración
Configuración de la nube de primavera
Configurar mapas/secretos

Balanceo de carga
Cinta (lado del cliente)
Servicio, Controlador de replicación (lado del servidor)

Compilando y ejecutando el código del ejemplo.

En este artículo nos referimos a proyecto de ejemplo, donde las API Spring y MicroProfile e incluso la misma clase Java se usan juntas. El código de este ejemplo se puede compilar y ejecutar desde la línea de comandos; consulte el archivo README.md para obtener más detalles.

API de Spring Framework

Inyección de dependencia

Quarkus admite una variedad de API de contextos e inyección de dependencias (CDI) y API de inyección de dependencia de Spring (Spring DI). Si está trabajando con MicroProfile, Java EE y Yakarta EE, entonces ya estás muy familiarizado con el CDI. Por otro lado, los desarrolladores de Spring pueden usar la extensión Quarkus para la API Spring DI para lograr compatibilidad con Spring DI. En la Tabla 2 se proporcionan ejemplos del uso de las API Spring DI compatibles.

В proyecto de nuestro ejemplo Utiliza CDI e inyección de dependencia de Spring. Para obtener más información y ejemplos sobre este tema, consulte la guía de Quarkus llamada Guía DI de resorte.

Tabla 2. Ejemplos de uso de las API Spring DI compatibles.

Funciones Spring DI compatibles
Примеры

Inyección de constructor

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

Inyección de campo
Autocableado
Valor

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Frijol
@Configuración

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

Componente

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

Service

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

   public String getPrefix() {
      return message;
   }
}

marco web

A los usuarios de MicroProfile les encantará que Quarkus admita JAX-RS, MicroProfile Rest Client, JSON-P y JSON-B como modelo de programación web principal. Los desarrolladores de Spring estarán satisfechos con el reciente soporte de Quarkus para Spring Web API, en particular las interfaces REST. Al igual que Spring DI, el objetivo principal del soporte de Spring Web API es permitir a los desarrolladores de Spring utilizar las API web de Spring junto con las API de MicroProfile. En la Tabla 3 se proporcionan ejemplos de cómo utilizar las API web de Spring compatibles, y se puede encontrar más información y ejemplos sobre este tema en el tutorial de Quarkus llamado Guía web de primavera.

Tabla 3. Ejemplos de uso de las API web de Spring compatibles.

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

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@matrizvariable
@Variable
@CookieValue
@RequestCuerpo
@EstadoRespuesta
@Manejador de excepciones
@RestControllerAdvice (parcial)

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

JPA de datos de primavera

Los usuarios de MicroProfile también apreciarán que Quarkus admita JPA utilizando Hibernate ORM. También hay buenas noticias para los desarrolladores de Spring: Quarkus admite anotaciones y tipos comunes de Spring Data JPA. En la Tabla 4 se proporcionan ejemplos del uso de las API Spring Data JPA compatibles.
В proyecto de nuestro ejemplo Se utilizan las API de Spring Data JPA y hay más información disponible en el tutorial de Quarkus llamado Guía JPA de datos de primavera.

Tabla 4. Ejemplos de uso de las API JPA de Spring Data compatibles.

Funciones JPA de Spring Data compatibles
Примеры

Repositorio Crud

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

Repositorio
JpaRepositorio
Repositorio de paginación y clasificación

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmentos del repositorio

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

Métodos de consulta derivados

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Consultas definidas por el usuario

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 microperfil

Tolerancia a fallos

Las construcciones de tolerancia a fallas son muy importantes para prevenir fallas en cascada y crear arquitecturas de microservicios confiables. Los desarrolladores de Spring han estado utilizando disyuntores para la tolerancia a fallas durante muchos años. histrix. Sin embargo, Hystrix no se ha actualizado durante mucho tiempo, pero Fault Tolerance de MicroProfile ahora se está desarrollando activamente y tiene varios años de uso en producción detrás. Por lo tanto, para mejorar la confiabilidad de los servicios en Quarkus, se recomienda utilizar las API de MicroProfile Fault Tolerance, cuyos ejemplos se utilizan en la Tabla 5. Para obtener más información sobre esto, consulte el manual de Quarkus. Guía de tolerancia a fallos.

Tabla 5. Ejemplos de uso de las API de MicroProfile Fault Tolerance compatibles.

Funciones de tolerancia a fallos del microperfil
Descripción
Примеры

@Asincrónico

Ejecutar lógica en un hilo separado

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

@Mamparo

Limitar el número de solicitudes simultáneas

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

@Cortacircuitos

Manejo inteligente de fallas y recuperación de fallas

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

@Retroceder

Llamar a lógica alternativa en caso de falla

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

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

Reintente

Reintentar en caso de error de solicitud

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

Tiempo de espera

Tiempo de espera de control de fallas

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

Servicios de verificación (Servicio de Salud)

Las plataformas Kubernetes monitorean el estado de los contenedores mediante servicios especiales. Para permitir que la plataforma subyacente supervise los servicios, los desarrolladores de Spring suelen utilizar un HealthIndicator y un Spring Boot Actuator personalizados. En Quarkus, esto se puede hacer usando MicroProfile Health, que de forma predeterminada realiza una verificación de actividad, pero se puede configurar para verificar simultáneamente la actividad y la preparación. En la Tabla 6 se proporcionan ejemplos de cómo utilizar las API de MicroProfile Health compatibles y en el manual de Quarkus se proporciona información adicional. Guía de salud.

Tabla 6: Ejemplos de uso de las API de MicroProfile Health compatibles.

Funciones de salud del microperfil
Descripción
Примеры

@Vivacidad

La plataforma reinicia aplicaciones en contenedores fallidas.
Punto final:
anfitrión:8080/salud/en vivo

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Preparación

La plataforma no enviará tráfico a aplicaciones en contenedores si no está lista
Punto final:
anfitrión:8080/salud/listo

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Métrica

Las aplicaciones proporcionan métricas para fines operativos (para monitorear los SLA de desempeño) o no operativos (SLA comerciales). Los desarrolladores de Spring proporcionan métricas utilizando Spring Boot Actuator y Micrometer. A su vez, Quarkus utiliza MicroProfile Metrics para proporcionar métricas de referencia (JVM y sistema operativo), métricas de proveedores (Quarkus) y métricas de aplicaciones. MicroProfile Metrics requiere que la implementación admita formatos de salida JSON y OpenMetrics (Prometheus). En la Tabla 7 se proporcionan ejemplos de uso de la API MicroProfile Metrics.

В proyecto de nuestro ejemplo Las métricas de MicroProfile se utilizan para proporcionar métricas de aplicaciones. Para más información, consulte el manual de Quarkus. Guía de métricas.

Tabla 7. Ejemplos de uso de las API de MicroProfile Metrics.

Funciones de métricas de microperfil
Descripción
Примеры

@Contado

Denota un contador que cuenta el número de veces que se ha llamado a un objeto anotado.

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

@ConcurrentGauge

Denota un indicador que cuenta el número de llamadas simultáneas a un objeto anotado.

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

@Indicador

Denota un sensor de calibre que mide el valor de un objeto anotado

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

@medido

Denota un sensor de medidor que monitorea la frecuencia de llamada de un objeto anotado

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

Métricos

Una anotación que contiene información sobre metadatos cuando se recibe una solicitud para ingresar o producir una métrica.

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

Programado

Indica un temporizador que rastrea la duración de un objeto anotado

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

Puntos finales de métricas

Métricas de aplicación localhost:8080/métricas/aplicación
Métricas básicas localhost:8080/métricas/base
Métricas de proveedores localhost:8080/métricas/proveedor
Todas las métricas localhost:8080/métricas

Cliente de descanso MicroProfile

Los microservicios a menudo proporcionan puntos finales RESTful que requieren las API de cliente correspondientes para funcionar. Para utilizar puntos finales RESTful, los desarrolladores de Spring suelen utilizar RestTemplate. Quarkus ofrece API de MicroProfile Rest Client para resolver este problema, cuyos ejemplos de uso se dan en la Tabla 8.

В proyecto de nuestro ejemplo el uso de puntos finales RESTful se realiza mediante MicroProfile Rest Client. Puede encontrar más información y ejemplos sobre este tema en el manual de Quarkus. Guía del cliente de descanso.

Tabla 8. Ejemplos de uso de las API de cliente Rest de MicroProfile.

Características del cliente Rest de MicroProfile
Descripción
Примеры

@RegisterRestClient

Registra una interfaz Java escrita como cliente REST

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

@RestCliente

Marca la implementación de una instancia de una interfaz de cliente REST escrita.

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

Invocación

Llama a un punto final REST

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

mp-rest/url

Especifica el punto final REST

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

resultados

En este blog, dirigido principalmente a desarrolladores de Spring, analizamos rápidamente cómo utilizar las API de Spring con las API de MicroProfile en Quarkus para desarrollar microservicios de Java y luego compilarlos en código binario nativo que ahorra cientos de megabytes de RAM y se inicia en cuestión de milisegundos.

Como ya entendió, puede encontrar más información sobre la compatibilidad con las API Spring y MicroProfile, así como mucha otra información útil, en Quarkus manuales.

Fuente: habr.com

Añadir un comentario