{"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\/pt\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Como o Quarkus une MicroProfile e Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1 a todos, e aqui est\u00e1 o terceiro post da s\u00e9rie sobre Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Como o Quarkus une MicroProfile e Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAo desenvolver microsservi\u00e7os Java, muitas vezes considera-se que <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u00e9 um conjunto de APIs distintas e independentes. Por padr\u00e3o, os programadores tendem a usar as APIs \u00e0s quais j\u00e1 est\u00e3o acostumados, pois estudar novas estruturas e componentes de tempo de execu\u00e7\u00e3o leva tempo. Hoje, vamos tentar simplificar a aprendizagem de algumas APIs populares do <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile para desenvolvedores Spring<\/a><\/noindex> e mostrar como utilizar simultaneamente as APIs do Spring e novas funcionalidades \u00fateis. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSe formos um pouco mais detalhados, primeiro examinaremos o escopo e os detalhes de como o Quarkus suporta interfaces de API do Spring, para mostrar aos desenvolvedores Spring como aplicar a API MicroProfile em seu trabalho cotidiano. Em seguida, falaremos sobre a API MicroProfile que ser\u00e1 \u00fatil para desenvolvedores Spring na cria\u00e7\u00e3o de microsservi\u00e7os.<\/p>\n<p>Por que Quarkus? Primeiro, porque oferece codifica\u00e7\u00e3o ao vivo (live coding), ou seja, a reinicializa\u00e7\u00e3o autom\u00e1tica de quaisquer mudan\u00e7as nas APIs MicroProfile, APIs Spring e outras APIs Java, que \u00e9 realizada com um \u00fanico comando: mvn quarkus:dev. Em segundo lugar, o servi\u00e7o Person (que \u00e9 compilado a partir das interfaces de API do Spring, MicroProfile e JPA em um arquivo bin\u00e1rio usando a imagem nativa do GraalVM) pode ser iniciado em apenas 0,055 segundos e ocupa cerca de 90 MB na mem\u00f3ria RAM (RSS) no endpoint da aplica\u00e7\u00e3o RESTful. E a pr\u00f3pria compila\u00e7\u00e3o \u00e9 feita com um \u00fanico comando: mvn package -Pnative. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">N\u00e3o vamos nos aprofundar nos detalhes do MicroProfile, mas tentaremos ajudar os desenvolvedores Spring a entender como usar as interfaces API do Spring junto com as interfaces API do MicroProfile no Quarkus.<\/a><\/noindex> Containers e Kubernetes<\/p>\n<p>Para n\u00e3o sobrecarregar este artigo, vamos abordar apenas os aspectos de alto n\u00edvel de suporte<\/p>\n<h3>, pois \u00e9 importante entender. O Quarkus \u00e9 posicionado como uma pilha Java para Kubernetes, projetado para minimizar o consumo de mem\u00f3ria e o tempo de inicializa\u00e7\u00e3o de aplica\u00e7\u00f5es e servi\u00e7os Java, e, como resultado, aumentar a densidade de implanta\u00e7\u00e3o no host e reduzir os custos globais.<\/h3>\n<p>\nO Quarkus tamb\u00e9m <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>oferece gera\u00e7\u00e3o autom\u00e1tica<\/p>\n<p>de recursos Kubernetes e fornece <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">guias<\/a><\/noindex> para implanta\u00e7\u00e3o em plataformas Kubernetes e Red Hat OpenShift. Al\u00e9m disso, o Quarkus gera automaticamente os arquivos Dockerfile.jvm (empacotamento JVM) e Dockerfile.native (empacotamento de bin\u00e1rio nativo), necess\u00e1rios para criar containers. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">guias<\/a><\/noindex> para implanta\u00e7\u00e3o em plataformas Kubernetes e Red Hat OpenShift. Al\u00e9m disso, Quarkus gera automaticamente arquivos Dockerfile.jvm (empacotamento JVM) e Dockerfile.native (empacotamento de bin\u00e1rio nativo), necess\u00e1rios para a cria\u00e7\u00e3o de containers.<\/p>\n<p>E finalmente, ao considerar o Kubernetes como um ambiente de implanta\u00e7\u00e3o, o Quarkus n\u00e3o utiliza frameworks Java quando uma funcionalidade semelhante \u00e9 implementada no pr\u00f3prio n\u00edvel da plataforma Kubernetes. A Tabela 1 apresenta um mapa de correspond\u00eancia funcional entre Kubernetes e os frameworks Java t\u00edpicos usados pelos desenvolvedores Spring.<\/p>\n<p><i>Tabela 1. Mapa de correspond\u00eancia entre frameworks Java e Kubernetes.<\/i><\/p>\n<p>Funcionalidade<br \/>\nSpring Boot Tradicional<br \/>\nKubernetes<\/p>\n<p>Descoberta de servi\u00e7o<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Configura\u00e7\u00e3o<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Balanceamento de carga<br \/>\nRibbon (do lado do cliente)<br \/>\nService, Replication Controller (do lado do servidor)<\/p>\n<p><\/p>\n<h3>Compila\u00e7\u00e3o e execu\u00e7\u00e3o do c\u00f3digo do exemplo<\/h3>\n<p>\nNeste artigo, referimo-nos a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">um exemplo de projeto<\/a><\/noindex>, onde APIs Spring e MicroProfile s\u00e3o utilizadas em conjunto, e at\u00e9 mesmo a mesma classe Java. O c\u00f3digo deste exemplo pode ser compilado e executado a partir da linha de comando; para mais detalhes, consulte o arquivo README.md.<\/p>\n<h3>APIs do Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nO Quarkus suporta uma s\u00e9rie de <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">APIs de Contextos e Inje\u00e7\u00e3o de Depend\u00eancia (CDI)<\/a><\/noindex> e APIs de Inje\u00e7\u00e3o de Depend\u00eancia do Spring (Spring DI). Se voc\u00ea trabalha com 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 e Jakarta EE<\/a><\/noindex>, voc\u00ea j\u00e1 est\u00e1 familiarizado com CDI. Por outro lado, os desenvolvedores Spring podem usar a Quarkus Extension para a API Spring DI para garantir compatibilidade com Spring DI. Exemplos de uso das APIs Spring DI suportadas est\u00e3o na Tabela 2.<\/p>\n<p>Em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">o projeto do nosso exemplo<\/a><\/noindex> utiliza tanto CDI quanto Inje\u00e7\u00e3o de Depend\u00eancia do Spring. Para mais informa\u00e7\u00f5es e exemplos sobre este assunto, voc\u00ea pode encontrar no guia do Quarkus, chamado <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Guia de Spring DI<\/a><\/noindex>.<\/p>\n<p><i>Tabela 2. Exemplos de uso das APIs Spring DI suportadas.<\/i><\/p>\n<p>Funcionalidades suportadas do Spring DI<br \/>\nExemplos<\/p>\n<p>Inje\u00e7\u00e3o de Constructor<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injetado      \n   PersonSpringMPService personService) {    \/\/ injetado\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Inje\u00e7\u00e3o de 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\">Valor<\/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\">Service<\/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>Framework Web<\/h4>\n<p>\nOs usu\u00e1rios do MicroProfile ir\u00e3o apreciar que o Quarkus suporta JAX-RS, MicroProfile Rest Client, JSON-P e JSON-B como a principal modelo de programa\u00e7\u00e3o web. Os desenvolvedores do Spring ficar\u00e3o agradavelmente surpresos com o suporte recentemente adicionado ao Spring Web API no Quarkus, especialmente pelas interfaces que gerenciam REST. Assim como no DI do Spring, o principal objetivo do suporte ao Spring Web API \u00e9 permitir que os desenvolvedores do Spring utilizem as interfaces do Spring Web juntamente com as interfaces do MicroProfile. Exemplos do uso das APIs do Spring Web suportadas s\u00e3o apresentados na tabela 3, e informa\u00e7\u00f5es adicionais e exemplos sobre o tema podem ser encontrados no guia Quarkus intitulado <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Guia do Spring Web<\/a><\/noindex>.<\/p>\n<p><i>Tabela 3. Exemplos de uso das interfaces API do Spring Web suportadas.<\/i><\/p>\n<p>Funcionalidades suportadas do Spring Web<br \/>\nExemplos<\/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>\nOs usu\u00e1rios do MicroProfile tamb\u00e9m ficar\u00e3o satisfeitos com o suporte do Quarkus para JPA usando Hibernate ORM. H\u00e1 boas not\u00edcias tamb\u00e9m para os desenvolvedores do Spring: o Quarkus suporta as anota\u00e7\u00f5es e tipos comuns do Spring Data JPA. Exemplos do uso das APIs do Spring Data JPA suportadas s\u00e3o apresentados na tabela 4.<br \/>\nEm <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">o projeto do nosso exemplo<\/a><\/noindex> s\u00e3o utilizadas as interfaces API do Spring Data JPA, e informa\u00e7\u00f5es adicionais est\u00e3o dispon\u00edveis no guia Quarkus intitulado <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Guia do Spring Data JPA<\/a><\/noindex>.<\/p>\n<p><i>Tabela 4. Exemplos de uso das interfaces API do Spring Data JPA suportadas.<\/i><\/p>\n<p>Funcionalidades suportadas do Spring Data JPA<br \/>\nExemplos<\/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>Repository<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 Reposit\u00f3rio<\/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 pelo usu\u00e1rio<\/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>Interfaces API do MicroProfile<\/h3>\n<p><\/p>\n<h4>Toler\u00e2ncia a Falhas<\/h4>\n<p>\nAs estruturas de Toler\u00e2ncia a Falhas s\u00e3o muito importantes para prevenir falhas em cascata e criar arquiteturas de microsservi\u00e7os confi\u00e1veis. Os desenvolvedores Spring j\u00e1 usam h\u00e1 anos circuit breakers para garantir a resili\u00eancia. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. No entanto, o Hystrix n\u00e3o \u00e9 atualizado h\u00e1 muito tempo, enquanto a Toler\u00e2ncia a Falhas do MicroProfile est\u00e1 sendo ativamente desenvolvida e j\u00e1 possui anos de uso em produ\u00e7\u00e3o. Portanto, para aumentar a confiabilidade dos servi\u00e7os no Quarkus, \u00e9 recomendado aplicar as interfaces API do MicroProfile Fault Tolerance, cujos exemplos de uso est\u00e3o na tabela 5. Informa\u00e7\u00f5es adicionais sobre isso podem ser encontradas no guia do Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Guia de Toler\u00e2ncia a Falhas<\/a><\/noindex>.<\/p>\n<p><i>Tabela 5. Exemplos de uso das interfaces de API suportadas pelo MicroProfile Fault Tolerance.<\/i><\/p>\n<p>Fun\u00e7\u00f5es do MicroProfile Fault Tolerance<br \/>\nDescri\u00e7\u00e3o<br \/>\nExemplos<\/p>\n<p>@Asynchronous<\/p>\n<p>Execu\u00e7\u00e3o de l\u00f3gica em uma thread separada<\/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>Limita\u00e7\u00e3o do n\u00famero de solicita\u00e7\u00f5es simult\u00e2neas<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Tratamento inteligente de falhas e recupera\u00e7\u00e3o de falhas<\/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>Chamada de l\u00f3gica alternativa em caso de falha<\/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>Repeti\u00e7\u00e3o em caso de falha na solicita\u00e7\u00e3o<\/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>Tempo limite de espera em caso de falha<\/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>Verifica\u00e7\u00e3o de Servi\u00e7os (Service Health)<\/h4>\n<p>\nAs plataformas Kubernetes monitoram a integridade dos cont\u00eaineres por meio de servi\u00e7os especiais. Para que a plataforma subjacente possa monitorar os servi\u00e7os, os desenvolvedores Spring geralmente usam HealthIndicator configur\u00e1veis e o Spring Boot Actuator. No Quarkus, isso pode ser feito com o MicroProfile Health, que por padr\u00e3o realiza verifica\u00e7\u00f5es de prontid\u00e3o (liveness check), mas pode ser configurado para verificar simultaneamente a prontid\u00e3o e a disponibilidade (readiness). Os exemplos de uso das APIs suportadas pelo MicroProfile Health est\u00e3o na tabela 6, e mais informa\u00e7\u00f5es est\u00e3o dispon\u00edveis no guia do Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Guia de Sa\u00fade<\/a><\/noindex>.<\/p>\n<p><i>Tabela 6. Exemplos de uso das interfaces de API suportadas pelo MicroProfile Health.<\/i><\/p>\n<p>Fun\u00e7\u00f5es do MicroProfile Health<br \/>\nDescri\u00e7\u00e3o<br \/>\nExemplos<\/p>\n<p>@Liveness<\/p>\n<p>A plataforma realiza a reinicializa\u00e7\u00e3o de aplicativos containerizados defeituosos.<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>A plataforma n\u00e3o enviar\u00e1 tr\u00e1fego para o aplicativo cont\u00eainerizado caso esteja indispon\u00edvel.<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>\nOs aplicativos fornecem m\u00e9tricas para fins operacionais (para monitoramento de SLA de desempenho) ou n\u00e3o operacionais (indicadores SLA de neg\u00f3cios). Desenvolvedores Spring fornecem m\u00e9tricas atrav\u00e9s do Spring Boot Actuator e Micrometer. Por sua vez, o Quarkus utiliza MicroProfile Metrics para fornecer m\u00e9tricas b\u00e1sicas (JVM e sistema operacional), m\u00e9tricas de fornecedor (Quarkus) e m\u00e9tricas de aplicativos. MicroProfile Metrics requer que a implementa\u00e7\u00e3o suporte formatos de sa\u00edda JSON e OpenMetrics (Prometheus). Exemplos de uso da API MicroProfile Metrics est\u00e3o na Tabela 7.<\/p>\n<p>Em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">o projeto do nosso exemplo<\/a><\/noindex> MicroProfile Metrics \u00e9 utilizado para fornecer m\u00e9tricas de aplicativo. Mais informa\u00e7\u00f5es podem ser encontradas no guia Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Guia de M\u00e9tricas<\/a><\/noindex>.<\/p>\n<p><i>Tabela 7. Exemplos de uso das APIs MicroProfile Metrics.<\/i><\/p>\n<p>Fun\u00e7\u00f5es do MicroProfile Metrics<br \/>\nDescri\u00e7\u00e3o<br \/>\nExemplos<\/p>\n<p>@Counted<\/p>\n<p>Indica um contador que contabiliza o n\u00famero de chamadas para o 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 um sensor que conta o n\u00famero de chamadas simult\u00e2neas para o 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 um sensor que mede o valor do 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 um medidor que monitora a frequ\u00eancia de chamadas para o 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>Anota\u00e7\u00e3o que cont\u00e9m informa\u00e7\u00f5es sobre os metadados ao receber uma solicita\u00e7\u00e3o para registrar ou gerar m\u00e9tricas.<\/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\">Cronometrado<\/a><\/noindex><\/p>\n<p>Indica um temporizador que monitora a dura\u00e7\u00e3o do 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>Pontos finais de m\u00e9tricas<\/b><\/p>\n<p>M\u00e9tricas de aplica\u00e7\u00f5es <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 do fornecedor <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nTodas as m\u00e9tricas <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Cliente REST MicroProfile<\/h4>\n<p>\nMicroservi\u00e7os frequentemente exp\u00f5em pontos finais RESTful, que requerem APIs de cliente apropriadas para intera\u00e7\u00e3o. Para utilizar os pontos finais RESTful, os desenvolvedores Spring geralmente usam RestTemplate. Entretanto, o Quarkus oferece interfaces de API do MicroProfile Rest Client para resolver essa tarefa, com exemplos de uso apresentados na tabela 8.<\/p>\n<p>Em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">o projeto do nosso exemplo<\/a><\/noindex> A utiliza\u00e7\u00e3o de pontos finais RESTful \u00e9 realizada atrav\u00e9s do MicroProfile Rest Client. Informa\u00e7\u00f5es adicionais e exemplos sobre isso podem ser encontrados no guia Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Guia do Cliente Rest<\/a><\/noindex>.<\/p>\n<p><i>Tabela 8. Exemplos de uso das interfaces de API MicroProfile Rest Client.<\/i><\/p>\n<p>Funcionalidades do MicroProfile Rest Client<br \/>\nDescri\u00e7\u00e3o<br \/>\nExemplos<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registra uma interface Java tipada 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 a inje\u00e7\u00e3o de uma inst\u00e2ncia da interface tipada do cliente REST<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ ou @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invoca\u00e7\u00e3o<\/p>\n<p>Invoca um ponto 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 um ponto 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>\nNeste blog, que ser\u00e1 especialmente \u00fatil para desenvolvedores Spring, discutimos brevemente como usar as APIs do Spring juntamente com as APIs do MicroProfile no Quarkus para desenvolver microservi\u00e7os Java e depois compil\u00e1-los em c\u00f3digo bin\u00e1rio nativo, economizando centenas de megabytes de mem\u00f3ria e iniciando em milissegundos.<\/p>\n<p>Como voc\u00ea j\u00e1 percebeu, mais informa\u00e7\u00f5es sobre o suporte \u00e0s APIs do Spring e MicroProfile, assim como muitos outros detalhes \u00fateis, podem ser encontradas nos <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">guias do Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Como o Quarkus une MicroProfile e Spring | ProHoster","description":"Ol\u00e1 a todos, e aqui est\u00e1 o terceiro post da s\u00e9rie sobre Quarkus!","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}