Hola a todos, ¡aquí está la tercera publicación de la serie Quarkus!
Al desarrollar microservicios Java, a menudo se cree que
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
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.
Quarkus también
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
API de Spring Framework
Inyección de dependencia
Quarkus admite una variedad de
В
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
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuración
@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;
}
}
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
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.
В
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.
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";
}
Reintentar en caso de error de solicitud
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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.
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.
В
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;
}
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;
}
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
Métricas básicas
Métricas de proveedores
Todas las 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.
В
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
Fuente: habr.com