{"id":79987,"date":"2020-05-02T01:42:42","date_gmt":"2020-05-01T23:42:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring"},"modified":"2020-05-02T01:42:42","modified_gmt":"2020-05-01T23:42:42","slug":"kak-quarkus-obedinyaet-microprofile-i-spring","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"C\u00f3mo Quarkus combina MicroProfile y Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola a todos! Y aqu\u00ed est\u00e1 la tercera publicaci\u00f3n de la serie sobre Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"C\u00f3mo Quarkus combina MicroProfile y Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAl desarrollar microservicios en Java, a menudo se considera que <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> son API separadas e independientes entre s\u00ed. Por defecto, los programadores tienden a usar las API con las que ya est\u00e1n familiarizados, ya que aprender nuevos frameworks y componentes runtime requiere mucho tiempo. Hoy intentaremos facilitar el aprendizaje de algunas APIs populares <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile para desarrolladores de Spring<\/a><\/noindex> y mostraremos c\u00f3mo utilizar simult\u00e1neamente las API de Spring y nuevas funcionalidades \u00fatiles. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSi nos adentramos un poco m\u00e1s, primero exploraremos el \u00e1mbito de aplicaci\u00f3n y los detalles de c\u00f3mo Quarkus soporta las interfaces API de Spring, para mostrar a los desarrolladores de Spring c\u00f3mo pueden aplicar las APIs de MicroProfile en su trabajo diario. Luego hablaremos sobre las APIs de MicroProfile que ser\u00e1n \u00fatiles para los desarrolladores de Spring al crear microservicios.<\/p>\n<p>\u00bfPor qu\u00e9 Quarkus? En primer lugar, permite la codificaci\u00f3n en vivo (live coding), es decir, la recarga autom\u00e1tica de cualquier cambio en las APIs de MicroProfile, las APIs de Spring y otras APIs de Java, que se realiza con un solo comando: mvn quarkus:dev. En segundo lugar, el servicio que discutimos en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nuestro ejemplo<\/a><\/noindex> el servicio Person (que se compila desde las interfaces de API de Spring, MicroProfile y JPA en un archivo binario utilizando la imagen nativa de GraalVM) se inicia en solo 0.055 segundos y ocupa alrededor de 90 MB de RAM (RSS) en el punto final de una aplicaci\u00f3n RESTful. Adem\u00e1s, su compilaci\u00f3n se lleva a cabo con un solo comando: mvn package -Pnative.<\/p>\n<p>No profundizaremos en los detalles de MicroProfile, sino que intentaremos ayudar a los desarrolladores de Spring a comprender c\u00f3mo se pueden utilizar las interfaces de API de Spring junto con las interfaces de API de MicroProfile en Quarkus.<\/p>\n<h3>Contenedores y Kubernetes<\/h3>\n<p>\nPara no sobrecargar este art\u00edculo, aqu\u00ed examinaremos solo los aspectos de alto nivel del soporte <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, ya que es importante entender. Quarkus se posiciona como un stack de Java para Kubernetes, dise\u00f1ado para minimizar el consumo de memoria y el tiempo de arranque de las aplicaciones y servicios Java, y, como resultado, aumentar la densidad de su despliegue en el host y reducir los costos generales.<\/p>\n<p>Quarkus tambi\u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">soporta la autogeneraci\u00f3n<\/a><\/noindex> de recursos de Kubernetes y ofrece <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">gu\u00edas<\/a><\/noindex> para el despliegue en plataformas Kubernetes y Red Hat OpenShift. Adem\u00e1s, Quarkus genera autom\u00e1ticamente los archivos Dockerfile.jvm (empaquetado JVM) y Dockerfile.native (empaquetado binario nativo) necesarios para crear contenedores.<\/p>\n<p>Y finalmente, al orientar Kubernetes como el entorno objetivo de despliegue, Quarkus no utiliza marcos de Java en los casos en que la funcionalidad equivalente se implementa a nivel de la propia plataforma Kubernetes. En la tabla 1 se presenta un mapa de correspondencia funcional entre Kubernetes y los marcos de Java t\u00edpicos utilizados por los desarrolladores de Spring.<\/p>\n<p><i>Tabla 1. Mapa de correspondencia funcional entre marcos de Java y Kubernetes.<\/i><\/p>\n<p>Funcionalidad<br \/>\nSpring Boot tradicional<br \/>\nKubernetes<\/p>\n<p>Descubrimiento de servicios<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Configuraci\u00f3n<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Balanceo de carga<br \/>\nRibbon (del lado del cliente)<br \/>\nServicio, Replication Controller (del lado del servidor)<\/p>\n<p><\/p>\n<h3>Compilaci\u00f3n y ejecuci\u00f3n del c\u00f3digo del ejemplo<\/h3>\n<p>\nEn este art\u00edculo nos referimos a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">el ejemplo de proyecto<\/a><\/noindex>, donde se utilizan conjuntamente las API de Spring y MicroProfile, y el mismo Java. El c\u00f3digo de este ejemplo se puede compilar y ejecutar desde la l\u00ednea de comandos; para m\u00e1s detalles, consulte el archivo README.md.<\/p>\n<h3>APIs del Spring Framework<\/h3>\n<p><\/p>\n<h4>Inyecci\u00f3n de Dependencias<\/h4>\n<p>\nQuarkus admite toda una serie de <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">APIs de Contextos e Inyecci\u00f3n de Dependencias (CDI)<\/a><\/noindex> y APIs de Inyecci\u00f3n de Dependencias de Spring (Spring DI). Si trabaja con MicroProfile, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/09\/12\/jakarta-ee-8-the-new-era-of-java-ee-explained\/\">Java EE y Jakarta EE<\/a><\/noindex>, ya estar\u00e1 familiarizado con CDI. Por otro lado, los desarrolladores de Spring pueden usar la Extensi\u00f3n Quarkus para la API de Spring DI para asegurar la compatibilidad con Spring DI. Se presentan ejemplos de uso de las APIs de Spring DI compatibles en la tabla 2.<\/p>\n<p>En <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">en el proyecto de nuestro ejemplo<\/a><\/noindex> se utiliza tanto CDI como Inyecci\u00f3n de Dependencias de Spring. Se pueden encontrar m\u00e1s detalles y ejemplos sobre este tema en la gu\u00eda de Quarkus titulada <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Gu\u00eda de Spring DI<\/a><\/noindex>.<\/p>\n<p><i>Tabla 2. Ejemplos de uso de las APIs de Spring DI compatibles.<\/i><\/p>\n<p>Funciones compatibles de Spring DI<br \/>\nEjemplos<\/p>\n<p>Inyecci\u00f3n por Constructor<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ inyectado      \n   PersonSpringMPService personService) {    \/\/ inyectado\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Inyecci\u00f3n por Campo<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/value\/\" class=\"user_link\">Value<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Autowired\n@RestClient\nSalutationRestClient salutationRestClient;\n\n@Value(\"${fallbackSalutation}\")\nString fallbackSalutation;\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/bean\/\" class=\"user_link\">Bean<\/a><\/noindex><br \/>\n@Configuration<\/p>\n<pre><code class=\"plaintext\">@Configuration\npublic class AppConfiguration {\n   @Bean(name = \"capitalizeFunction\")\n   public StringFunction capitalizer() {\n      return String::toUpperCase;\n   }\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/component\/\" class=\"user_link\">Componente<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Component(\"noopFunction\")\npublic class NoOpSingleStringFunction implements StringFunction {\n   @Override\n   public String apply(String s) {\n      return s;\n   }\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/service\/\" class=\"user_link\">Servicio<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Service\npublic class MessageProducer {\n   @Value(\"${greeting.message}\")\n   String message;\n\n   public String getPrefix() {\n      return message;\n   }\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Marco web<\/h4>\n<p>\nA los usuarios de MicroProfile les gustar\u00e1 que Quarkus soporte JAX-RS, MicroProfile Rest Client, JSON-P y JSON-B como su modelo principal de programaci\u00f3n web. Los desarrolladores de Spring estar\u00e1n complacidos con la reciente adici\u00f3n del soporte para la Spring Web API en Quarkus, especialmente para las interfaces que manejan REST. Al igual que con la inyecci\u00f3n de dependencias de Spring, el objetivo principal del soporte para la Spring Web API es que los desarrolladores de Spring puedan usar las interfaces de la Spring Web junto con las interfaces de MicroProfile. Los ejemplos de uso de las API de Spring Web soportadas se encuentran en la tabla 3, y m\u00e1s informaci\u00f3n y ejemplos sobre este tema pueden encontrarse en la gu\u00eda de Quarkus llamada <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Gu\u00eda de Spring Web<\/a><\/noindex>.<\/p>\n<p><i>Tabla 3. Ejemplos de uso de las API de Spring Web soportadas.<\/i><\/p>\n<p>Funciones soportadas de Spring Web<br \/>\nEjemplos<\/p>\n<p>@RestController<br \/>\n@RequestMapping<\/p>\n<pre><code class=\"plaintext\">@RestController\n@RequestMapping(\"\/person\")\npublic class PersonSpringController {\n   ...\n   ...\n   ...\n}\n<\/code><\/pre>\n<p>@GetMapping<br \/>\n@PostMapping<br \/>\n@PutMapping<br \/>\n@DeleteMapping<br \/>\n@PatchMapping<br \/>\n@RequestParam<br \/>\n@RequestHeader<br \/>\n@MatrixVariable<br \/>\n@PathVariable<br \/>\n@CookieValue<br \/>\n@RequestBody<br \/>\n@ResponseStatus<br \/>\n@ExceptionHandler<br \/>\n@RestControllerAdvice (parcial)<\/p>\n<pre><code class=\"plaintext\">@GetMapping(path = \"\/greet\/{id}\",\n   produces = \"text\/plain\")\n   public String greetPerson(\n   @PathVariable(name = \"id\") long id) {\n   ...\n   ...\n   ...\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Spring Data JPA<\/h4>\n<p>\nA los usuarios de MicroProfile tambi\u00e9n les agradar\u00e1 que Quarkus soporte JPA utilizando Hibernate ORM. Tambi\u00e9n hay buenas noticias para los desarrolladores de Spring: Quarkus soporta las anotaciones y tipos comunes de Spring Data JPA. Los ejemplos de uso de las API de Spring Data JPA soportadas se encuentran en la tabla 4.<br \/>\nEn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">en el proyecto de nuestro ejemplo<\/a><\/noindex> se utilizan las API de Spring Data JPA, y m\u00e1s informaci\u00f3n est\u00e1 disponible en la gu\u00eda de Quarkus titulada <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Gu\u00eda de Spring Data JPA<\/a><\/noindex>.<\/p>\n<p><i>Tabla 4. Ejemplos de uso de las API de Spring Data JPA soportadas.<\/i><\/p>\n<p>Funciones soportadas de Spring Data JPA<br \/>\nEjemplos<\/p>\n<p>CrudRepository<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Repositorio<br \/>\nJpaRepository<br \/>\nPagingAndSortingRepository<\/p>\n<pre><code class=\"plaintext\">public class PersonRepository extends \n\n    Repository {\n\n    Person save(Person entity);\n\n    Optional findById(Person entity);\n}\n<\/code><\/pre>\n<p>Fragmentos de Repositorio<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>M\u00e9todos de consulta derivados<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository extends CrudRepository {\n\n    List findByName(String name);\n    \n    Person findByNameBySsn(String ssn);\n    \n    Optional \n       findByNameBySsnIgnoreCase(String ssn);\n\n    Boolean existsBookByYearOfBirthBetween(\n            Integer start, Integer end);\n}\n<\/code><\/pre>\n<p>Consultas definidas por el usuario<\/p>\n<pre><code class=\"plaintext\">public interface MovieRepository\n         extends CrudRepository {\n\n    Movie findFirstByOrderByDurationDesc();\n\n    @Query(\"select m from Movie m where m.rating = ?1\")\n    Iterator findByRating(String rating);\n\n    @Query(\"from Movie where title = ?1\")\n    Movie findByTitle(String title);\n}\n<\/code><\/pre>\n<p><\/p>\n<h3>API de MicroProfile<\/h3>\n<p><\/p>\n<h4>Tolerancia a fallos<\/h4>\n<p>\nLas construcciones de tolerancia a fallos son muy importantes para prevenir fallos en cascada y crear arquitecturas de microservicios confiables. Los desarrolladores de Spring han estado utilizando durante a\u00f1os circuit-breakers para la tolerancia a fallos. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Sin embargo, Hystrix no se ha actualizado desde hace tiempo, mientras que la tolerancia a fallos de MicroProfile est\u00e1 actualmente en desarrollo activo y cuenta con varios a\u00f1os de uso en producci\u00f3n. Por lo tanto, para aumentar la fiabilidad de los servicios en Quarkus, se recomienda utilizar las interfaces de API de MicroProfile Fault Tolerance, cuyos ejemplos de uso se presentan en la tabla 5. Puede encontrar informaci\u00f3n adicional sobre esto en la gu\u00eda de Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Gu\u00eda de Tolerancia a Fallos<\/a><\/noindex>.<\/p>\n<p><i>Tabla 5. Ejemplos de uso de las interfaces de API de MicroProfile Fault Tolerance soportadas.<\/i><\/p>\n<p>Funciones de MicroProfile Fault Tolerance<br \/>\nDescripci\u00f3n<br \/>\nEjemplos<\/p>\n<p>@Asynchronous<\/p>\n<p>Ejecuci\u00f3n de l\u00f3gica en un hilo separado<\/p>\n<pre><code class=\"plaintext\">@Asynchronous\n@Retry\npublic Future getSalutation() {\n   ...\n   return future;\n}\n<\/code><\/pre>\n<p>@Bulkhead<\/p>\n<p>L\u00edmite en la cantidad de solicitudes simult\u00e1neas<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Manejo inteligente de fallos y recuperaci\u00f3n de fallos<\/p>\n<pre><code class=\"plaintext\">@CircuitBreaker(delay=500   \/\/ milliseconds\n   failureRatio = .75,\n   requestVolumeThreshold = 20,\n   successThreshold = 5)\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@Fallback<\/p>\n<p>Llamado a l\u00f3gica alternativa en caso de fallo<\/p>\n<pre><code class=\"plaintext\">@Timeout(500) \/\/ milliseconds\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n\npublic String fallback() {\n   return \"hello\";\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/retry\/\" class=\"user_link\">Retry<\/a><\/noindex><\/p>\n<p>Reintento ante un fallo de solicitud<\/p>\n<pre><code class=\"plaintext\">@Retry(maxRetries=3)\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/timeout\/\" class=\"user_link\">Timeout<\/a><\/noindex><\/p>\n<p>Tiempo m\u00e1ximo de espera ante un fallo<\/p>\n<pre><code class=\"plaintext\">@Timeout(value = 500 )   \/\/ milliseconds\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Verificaci\u00f3n de servicios (Service Health)<\/h4>\n<p>\nLas plataformas de Kubernetes monitorean la salud de los contenedores mediante servicios espec\u00edficos. Para que la plataforma subyacente pueda monitorear los servicios, los desarrolladores de Spring suelen utilizar HealthIndicator personalizables y Spring Boot Actuator. En Quarkus, esto se puede lograr mediante MicroProfile Health, que por defecto realiza una verificaci\u00f3n de operatividad (liveness check), aunque tambi\u00e9n se pueden configurar para verificar simult\u00e1neamente la operatividad y la preparaci\u00f3n (readiness). Los ejemplos de uso de las API soportadas de MicroProfile Health se presentan en la tabla 6, y m\u00e1s informaci\u00f3n se proporciona en la gu\u00eda de Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Gu\u00eda de Salud<\/a><\/noindex>.<\/p>\n<p><i>Tabla 6. Ejemplos de uso de las interfaces de API de MicroProfile Health soportadas.<\/i><\/p>\n<p>Funciones de MicroProfile Health<br \/>\nDescripci\u00f3n<br \/>\nEjemplos<\/p>\n<p>@Liveness<\/p>\n<p>La plataforma reinicia aplicaciones contenedorizadas defectuosas<br \/>\nEndpoint:<br \/>\nhost:8080\/health\/live<\/p>\n<pre><code class=\"plaintext\">@Liveness\npublic class MyHC implements HealthCheck {\n  public HealthCheckResponse call() {\n\n   ...\n   return HealthCheckResponse\n     .named(\"myHCProbe\")\n     .status(ready ? true:false)\n     .withData(\"mydata\", data)\n     .build();  \n}\n<\/code><\/pre>\n<p>@Readiness<\/p>\n<p>La plataforma no enviar\u00e1 tr\u00e1fico a la aplicaci\u00f3n containerizada si no est\u00e1 lista.<br \/>\nEndpoint:<br \/>\nhost:8080\/health\/ready<\/p>\n<pre><code class=\"plaintext\">@Readiness\npublic class MyHC implements HealthCheck {\n  public HealthCheckResponse call() {\n\n   ...\n   return HealthCheckResponse\n     .named(\"myHCProbe\")\n     .status(live ? true:false)\n     .withData(\"mydata\", data)\n     .build();  \n}\n<\/code><\/pre>\n<p><\/p>\n<h4>M\u00e9tricas<\/h4>\n<p>\nLas aplicaciones proporcionan m\u00e9tricas ya sea para fines operativos (para monitorear los indicadores de rendimiento de SLA) o no operativos (indicadores comerciales de SLA). Los desarrolladores de Spring proporcionan m\u00e9tricas utilizando Spring Boot Actuator y Micrometer. A su vez, Quarkus utiliza MicroProfile Metrics para proporcionar m\u00e9tricas b\u00e1sicas (JVM y sistema operativo), m\u00e9tricas de proveedores (Quarkus) y m\u00e9tricas de aplicaciones. MicroProfile Metrics requiere que la implementaci\u00f3n soporte los formatos de salida JSON y OpenMetrics (Prometheus). Ejemplos de uso de la API de MicroProfile Metrics se presentan en la tabla 7.<\/p>\n<p>En <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">en el proyecto de nuestro ejemplo<\/a><\/noindex> Las m\u00e9tricas de MicroProfile se utilizan para proporcionar m\u00e9tricas de aplicaci\u00f3n. M\u00e1s informaci\u00f3n se puede encontrar en la gu\u00eda de Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Gu\u00eda de M\u00e9tricas<\/a><\/noindex>.<\/p>\n<p><i>Tabla 7. Ejemplos de uso de las API de MicroProfile Metrics.<\/i><\/p>\n<p>Funciones de MicroProfile Metrics<br \/>\nDescripci\u00f3n<br \/>\nEjemplos<\/p>\n<p>@Counted<\/p>\n<p>Indica un contador que cuenta la cantidad de llamadas al objeto anotado.<\/p>\n<pre><code class=\"plaintext\">@Counted(name = \"fallbackCounter\", \n  displayName = \"Fallback Counter\", \n  description = \"Fallback Counter\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@ConcurrentGauge<\/p>\n<p>Indica un medidor que cuenta la cantidad de llamadas concurrentes al objeto anotado.<\/p>\n<pre><code class=\"plaintext\">@ConcurrentGuage(\n  name = \"fallbackConcurrentGauge\", \n  displayName=\"Fallback Concurrent\", \n  description=\"Fallback Concurrent\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@Gauge<\/p>\n<p>Indica un medidor que mide el valor del objeto anotado.<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"FallbackGauge\",\n   displayName=\"Fallback Gauge\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@Metered<\/p>\n<p>Indica un medidor que rastrea la frecuencia de llamadas al objeto anotado.<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/metric\/\" class=\"user_link\">M\u00e9trica<\/a><\/noindex><\/p>\n<p>Anotaci\u00f3n que contiene informaci\u00f3n sobre los metadatos al recibir una solicitud para agregar o producir una m\u00e9trica.<\/p>\n<pre><code class=\"plaintext\">@Metric\n@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/timed\/\" class=\"user_link\">Temporal<\/a><\/noindex><\/p>\n<p>Indica un temporizador que rastrea la duraci\u00f3n del objeto anotado.<\/p>\n<pre><code class=\"plaintext\">@Timed(name = \"TimedFallback\",\n   displayName=\"Timed Fallback\",\n   description=\"Fallback delay\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>\n<b>Puntos finales de m\u00e9tricas<\/b><\/p>\n<p>M\u00e9tricas de aplicaciones <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nM\u00e9tricas b\u00e1sicas <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nM\u00e9tricas del proveedor <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nTodas las m\u00e9tricas <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Cliente REST de MicroProfile<\/h4>\n<p>\nLos microservicios suelen proporcionar puntos finales RESTful, para los cuales se requieren API de cliente adecuadas. Para utilizar estos puntos finales RESTful, los desarrolladores de Spring normalmente utilizan RestTemplate. Quarkus, por su parte, ofrece interfaces API de MicroProfile Rest Client, cuyos ejemplos de uso se muestran en la tabla 8.<\/p>\n<p>En <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">en el proyecto de nuestro ejemplo<\/a><\/noindex> El uso de los puntos finales RESTful se realiza a trav\u00e9s de MicroProfile Rest Client. Puede encontrar m\u00e1s informaci\u00f3n y ejemplos sobre este tema en la gu\u00eda de Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Gu\u00eda del cliente REST<\/a><\/noindex>.<\/p>\n<p><i>Tabla 8. Ejemplos de uso de las interfaces API de MicroProfile Rest Client.<\/i><\/p>\n<p>Funciones del cliente REST de MicroProfile<br \/>\nDescripci\u00f3n<br \/>\nEjemplos<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registra una interfaz Java tipificada como cliente REST<\/p>\n<pre><code class=\"plaintext\">@RegisterRestClient\n@Path(\"\/\")\npublic interface MyRestClient {\n    @GET\n    @Produces(MediaType.TEXT_PLAIN)\n    public String getSalutation();\n}\n<\/code><\/pre>\n<p>@RestClient<\/p>\n<p>Marca la inyecci\u00f3n de una instancia de la interfaz tipificada del cliente REST<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ o @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invocaci\u00f3n<\/p>\n<p>Llama al punto final REST<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Define el punto final REST<\/p>\n<pre><code class=\"plaintext\">application.properties:\norg.example.MyRestClient\/mp-rest\/url=\n   http:\/\/localhost:8081\/myendpoint\n<\/code><\/pre>\n<p><\/p>\n<h3>Resultados<\/h3>\n<p>\nEn este blog, que ser\u00e1 especialmente \u00fatil para los desarrolladores de Spring, hemos explorado brevemente c\u00f3mo utilizar las interfaces API de Spring junto con las interfaces de MicroProfile en Quarkus para desarrollar microservicios Java y luego compilarlos en un binario nativo que ahorra cientos de megabytes de memoria RAM y se inicia en cuesti\u00f3n de milisegundos.<\/p>\n<p>Como ya habr\u00e1s entendido, puede encontrar m\u00e1s informaci\u00f3n sobre el soporte para las API de Spring y MicroProfile, as\u00ed como mucha otra informaci\u00f3n \u00fatil en <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">las gu\u00edas de Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/497504\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus! \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Java-\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Eclipse MicroProfile \u0438 Spring Boot \u2013 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 API. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u0435 API, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0438 runtime-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79988,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 MicroProfile \u0438 Spring | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-01T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-01T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47C\u00f3mo Quarkus integra MicroProfile y Spring | ProHoster","description":"\u00a1Hola a todos! Y aqu\u00ed est\u00e1 la tercera publicaci\u00f3n de la serie sobre Quarkus.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 MicroProfile \u0438 Spring | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-01T23:42:42+00:00","article:modified_time":"2020-05-01T23:42:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79987","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:27:13","updated":"2022-09-30 14:08:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}