{"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\/fr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Comment Quarkus int\u00e8gre MicroProfile et Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour \u00e0 tous, et voici le troisi\u00e8me post de notre s\u00e9rie sur Quarkus !<\/p>\n<p><img decoding=\"async\" alt=\"Comment Quarkus int\u00e8gre MicroProfile et Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLors du d\u00e9veloppement de microservices Java, il est souvent consid\u00e9r\u00e9 que <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 ce sont des API distinctes et ind\u00e9pendantes les unes des autres. Par d\u00e9faut, les programmeurs utilisent g\u00e9n\u00e9ralement les API auxquelles ils sont d\u00e9j\u00e0 habitu\u00e9s, car apprendre de nouveaux frameworks et composants runtime demande beaucoup de temps. Aujourd'hui, nous allons essayer de simplifier l'apprentissage de certains des API populaires <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile pour les d\u00e9veloppeurs Spring<\/a><\/noindex> et montrer comment utiliser \u00e0 la fois les API Spring et de nouvelles fonctionnalit\u00e9s utiles <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPour entrer dans les d\u00e9tails, nous allons d'abord examiner le domaine d'application et les d\u00e9tails de la fa\u00e7on dont Quarkus prend en charge les interfaces API Spring, afin de montrer aux d\u00e9veloppeurs Spring comment ils peuvent appliquer les API MicroProfile dans leur travail quotidien. Ensuite, nous parlerons des API MicroProfile qui seront utiles aux d\u00e9veloppeurs Spring lors de la cr\u00e9ation de microservices.<\/p>\n<p>Pourquoi Quarkus ? Tout d'abord, il s'agit de la programmation en direct (live coding), c'est-\u00e0-dire le rechargement automatique de tout changement dans les API MicroProfile, les API Spring et d'autres API Java, qui s'effectue par une simple commande : mvn quarkus:dev. Deuxi\u00e8mement, l'exemple trait\u00e9 dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">notre exemple<\/a><\/noindex> le service Person (il est compil\u00e9 \u00e0 partir des interfaces API Spring, MicroProfile et JPA en un fichier binaire \u00e0 l'aide de l'image native GraalVM) se lance en seulement 0,055 seconde et occupe environ 90 Mo de m\u00e9moire vive (RSS) sur le point d'application RESTful. De plus, sa compilation s'effectue par une simple commande : mvn package -Pnative.<\/p>\n<p>Nous n'allons pas entrer dans les d\u00e9tails de MicroProfile, mais nous allons essayer d'aider les d\u00e9veloppeurs Spring \u00e0 comprendre comment utiliser les interfaces API Spring avec les interfaces API MicroProfile dans Quarkus.<\/p>\n<h3>Conteneurs et Kubernetes<\/h3>\n<p>\nPour ne pas alourdir cet article, nous allons examiner ici seulement les aspects de haut niveau du support <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, car il est important de comprendre cela. Quarkus se positionne comme une stack Java pour Kubernetes, visant \u00e0 minimiser la consommation de m\u00e9moire et le temps de d\u00e9marrage des applications et services Java, augmentant ainsi leur densit\u00e9 d'h\u00e9bergement et r\u00e9duisant les co\u00fbts globaux.<\/p>\n<p>Quarkus prend \u00e9galement en charge <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">la g\u00e9n\u00e9ration automatique<\/a><\/noindex> des ressources Kubernetes et propose <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">du manuel<\/a><\/noindex> des solutions de d\u00e9ploiement sur les plateformes Kubernetes et Red Hat OpenShift. De plus, Quarkus g\u00e9n\u00e8re automatiquement des fichiers Dockerfile.jvm (emballage JVM) et Dockerfile.native (emballage binaire natif), n\u00e9cessaires \u00e0 la cr\u00e9ation de conteneurs.<\/p>\n<p>Enfin, en utilisant Kubernetes comme environnement de d\u00e9ploiement cible, Quarkus n\u2019utilise pas de frameworks Java lorsque des fonctionnalit\u00e9s similaires sont mises en \u0153uvre au niveau de la plateforme Kubernetes elle-m\u00eame. La table 1 pr\u00e9sente une carte de correspondance fonctionnelle entre Kubernetes et les frameworks Java typiques utilis\u00e9s par les d\u00e9veloppeurs Spring.<\/p>\n<p><i>Tableau 1. Carte de correspondance entre les frameworks Java et Kubernetes.<\/i><\/p>\n<p>Fonctionnalit\u00e9s<br \/>\nSpring Boot traditionnel<br \/>\nKubernetes<\/p>\n<p>D\u00e9couverte de services<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Configuration<br \/>\nSpring Cloud Config<br \/>\nCartes de configuration \/ Secrets<\/p>\n<p>\u00c9quilibrage de charge<br \/>\nRibbon (c\u00f4t\u00e9 client)<br \/>\nService, Contr\u00f4leur de r\u00e9plique (c\u00f4t\u00e9 serveur)<\/p>\n<p><\/p>\n<h3>Compilation et ex\u00e9cution du code de l\u2019exemple<\/h3>\n<p>\nDans cet article, nous faisons r\u00e9f\u00e9rence \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">un exemple de projet<\/a><\/noindex>, o\u00f9 les API Spring et MicroProfile sont utilis\u00e9es ensemble, ainsi que cette classe Java. Le code de cet exemple peut \u00eatre compil\u00e9 et ex\u00e9cut\u00e9 \u00e0 partir de la ligne de commande ; pour plus de d\u00e9tails, voir le fichier README.md.<\/p>\n<h3>APIs du Framework Spring<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus prend en charge toute une gamme de <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API de Contextes et d'Injection de D\u00e9pendances (CDI)<\/a><\/noindex> et d\u2019APIs d\u2019Injection de D\u00e9pendances Spring (Spring DI). Si vous travaillez avec 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 et Jakarta EE<\/a><\/noindex>, vous \u00eates d\u00e9j\u00e0 bien familiaris\u00e9 avec CDI. D'autre part, les d\u00e9veloppeurs Spring peuvent utiliser l\u2019extension Quarkus pour l\u2019API Spring DI afin d\u2019assurer la compatibilit\u00e9 avec Spring DI. Des exemples d'utilisation des APIs Spring DI prises en charge sont pr\u00e9sent\u00e9s dans le tableau 2.<\/p>\n<p>Dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">dans notre exemple de projet<\/a><\/noindex> tant CDI que l\u2019Injection de D\u00e9pendances Spring. Pour des informations suppl\u00e9mentaires et des exemples sur ce sujet, vous pouvez consulter le guide Quarkus intitul\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Guide Spring DI<\/a><\/noindex>.<\/p>\n<p><i>Tableau 2. Exemples d\u2019utilisation des APIs Spring DI prises en charge.<\/i><\/p>\n<p>Fonctionnalit\u00e9s prises en charge de Spring DI<br \/>\nExemples<\/p>\n<p>Injection par constructeur<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ inject\u00e9\n   PersonSpringMPService personService) {    \/\/ inject\u00e9\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Injection par champ<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\">Valeur<\/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\">Composant<\/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>\nLes utilisateurs de MicroProfile appr\u00e9cieront que Quarkus prenne en charge JAX-RS, MicroProfile Rest Client, JSON-P et JSON-B comme mod\u00e8le principal de programmation web. Les d\u00e9veloppeurs Spring seront ravis de la prise en charge r\u00e9cemment ajout\u00e9e de Spring Web API dans Quarkus, notamment des interfaces responsables du REST. \u00c0 l'instar de Spring DI, l'objectif principal du support de Spring Web API est de permettre aux d\u00e9veloppeurs Spring d'utiliser les API Spring Web en conjonction avec les API MicroProfile. Des exemples d'utilisation des API Spring Web prises en charge sont pr\u00e9sent\u00e9s dans le tableau 3, et des informations suppl\u00e9mentaires et des exemples sur ce sujet peuvent \u00eatre trouv\u00e9s dans le guide Quarkus intitul\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Guide de Spring Web<\/a><\/noindex>.<\/p>\n<p><i>Tableau 3. Exemples d'utilisation des interfaces API Spring Web prises en charge.<\/i><\/p>\n<p>Fonctionnalit\u00e9s prises en charge de Spring Web<br \/>\nExemples<\/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 (partiel)<\/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>\nLes utilisateurs de MicroProfile appr\u00e9cieront \u00e9galement que Quarkus prenne en charge JPA avec Hibernate ORM. Il y a \u00e9galement de bonnes nouvelles pour les d\u00e9veloppeurs Spring : Quarkus prend en charge les annotations et types standards de Spring Data JPA. Des exemples d'utilisation des API Spring Data JPA prises en charge sont pr\u00e9sent\u00e9s dans le tableau 4.<br \/>\nDans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">dans notre exemple de projet<\/a><\/noindex> des interfaces API Spring Data JPA sont utilis\u00e9s, et des informations suppl\u00e9mentaires sont disponibles dans le guide Quarkus intitul\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Guide de Spring Data JPA<\/a><\/noindex>.<\/p>\n<p><i>Tableau 4. Exemples d'utilisation des interfaces API Spring Data JPA prises en charge.<\/i><\/p>\n<p>Fonctionnalit\u00e9s prises en charge de Spring Data JPA<br \/>\nExemples<\/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>Fragments de Repository<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>M\u00e9thodes de requ\u00eate d\u00e9riv\u00e9es<\/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>Requ\u00eates d\u00e9finies par l'utilisateur<\/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 MicroProfile<\/h3>\n<p><\/p>\n<h4>Tol\u00e9rance aux pannes<\/h4>\n<p>\nLes constructions de tol\u00e9rance aux pannes sont tr\u00e8s importantes pour pr\u00e9venir les d\u00e9faillances en cascade et cr\u00e9er des architectures de microservices robustes. Les d\u00e9veloppeurs de Spring utilisent depuis de nombreuses ann\u00e9es des disjoncteurs pour la tol\u00e9rance aux pannes. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Cependant, Hystrix n'a pas \u00e9t\u00e9 mis \u00e0 jour depuis longtemps, tandis que la tol\u00e9rance aux pannes de MicroProfile est actuellement en d\u00e9veloppement actif et a d\u00e9j\u00e0 plusieurs ann\u00e9es d'utilisation en production. Par cons\u00e9quent, pour am\u00e9liorer la fiabilit\u00e9 des services dans Quarkus, il est recommand\u00e9 d'utiliser les interfaces API de MicroProfile Fault Tolerance, dont des exemples d'utilisation sont fournis dans le tableau 5. Des informations suppl\u00e9mentaires peuvent \u00eatre trouv\u00e9es dans le guide Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Guide de tol\u00e9rance aux pannes<\/a><\/noindex>.<\/p>\n<p><i>Tableau 5. Exemples d'utilisation des interfaces API MicroProfile Fault Tolerance prises en charge.<\/i><\/p>\n<p>Fonctions de MicroProfile Fault Tolerance<br \/>\nDescription<br \/>\nExemples<\/p>\n<p>@Asynchronous<\/p>\n<p>Ex\u00e9cution de la logique dans un thread s\u00e9par\u00e9<\/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>Limitation du nombre de requ\u00eates simultan\u00e9es<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Gestion intelligente des \u00e9checs et r\u00e9cup\u00e9ration apr\u00e8s une panne<\/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>Appel de la logique alternative en cas d'\u00e9chec<\/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>R\u00e9essayer en cas d'\u00e9chec de la requ\u00eate<\/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>Temps d'attente contr\u00f4l\u00e9 en cas d'\u00e9chec<\/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>V\u00e9rification des services (Service Health)<\/h4>\n<p>\nLes plateformes Kubernetes surveillent l'int\u00e9grit\u00e9 des conteneurs \u00e0 l'aide de services sp\u00e9ciaux. Pour que la plateforme sous-jacente puisse surveiller les services, les d\u00e9veloppeurs de Spring utilisent g\u00e9n\u00e9ralement des HealthIndicators configurables et Spring Boot Actuator. Dans Quarkus, cela peut \u00eatre r\u00e9alis\u00e9 avec MicroProfile Health, qui effectue par d\u00e9faut un contr\u00f4le de l'\u00e9tat de vie (liveness check), mais peut \u00e9galement \u00eatre configur\u00e9 pour effectuer simultan\u00e9ment une v\u00e9rification de l'\u00e9tat de vie et de la pr\u00e9paration (readiness). Des exemples d'utilisation des API MicroProfile Health prises en charge sont fournis dans le tableau 6, et des informations suppl\u00e9mentaires sont disponibles dans le guide Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Guide de sant\u00e9<\/a><\/noindex>.<\/p>\n<p><i>Tableau 6. Exemples d'utilisation des interfaces API MicroProfile Health prises en charge.<\/i><\/p>\n<p>Fonctions de MicroProfile Health<br \/>\nDescription<br \/>\nExemples<\/p>\n<p>@Liveness<\/p>\n<p>La plateforme red\u00e9marre les applications conteneuris\u00e9es d\u00e9faillantes<br \/>\nPoint de terminaison :<br \/>\nh\u00f4te: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 plateforme ne dirigera pas le trafic vers les applications conteneuris\u00e9es si celles-ci ne sont pas pr\u00eates<br \/>\nPoint de terminaison :<br \/>\nh\u00f4te: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\u00e9triques<\/h4>\n<p>\nLes applications fournissent des m\u00e9triques soit \u00e0 des fins op\u00e9rationnelles (pour le contr\u00f4le des indicateurs de performance SLA), soit \u00e0 des fins non op\u00e9rationnelles (indicateurs de performance SLA business). Les d\u00e9veloppeurs Spring fournissent des m\u00e9triques via Spring Boot Actuator et Micrometer. D'autre part, Quarkus utilise MicroProfile Metrics pour fournir des m\u00e9triques de base (JVM et syst\u00e8me d'exploitation), des m\u00e9triques fournisseur (Quarkus) et des m\u00e9triques d'application. MicroProfile Metrics exige que l'impl\u00e9mentation prenne en charge les formats de sortie JSON et OpenMetrics (Prometheus). Des exemples d'utilisation de l'API MicroProfile Metrics sont donn\u00e9s dans le tableau 7.<\/p>\n<p>Dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">dans notre exemple de projet<\/a><\/noindex> MicroProfile Metrics sont utilis\u00e9s pour fournir des m\u00e9triques d'application. Des informations suppl\u00e9mentaires peuvent \u00eatre trouv\u00e9es dans le guide Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Guide des m\u00e9triques<\/a><\/noindex>.<\/p>\n<p><i>Tableau 7. Exemples d'utilisation des interfaces API MicroProfile Metrics.<\/i><\/p>\n<p>Fonctions des MicroProfile Metrics<br \/>\nDescription<br \/>\nExemples<\/p>\n<p>@Counted<\/p>\n<p>D\u00e9signe un compteur qui compte le nombre d'appels \u00e0 l'objet annot\u00e9<\/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>D\u00e9signe un capteur qui compte le nombre d'appels parall\u00e8les \u00e0 l'objet annot\u00e9<\/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>D\u00e9signe un capteur mesurant la valeur de l'objet annot\u00e9<\/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>D\u00e9signe un compteur qui suit la fr\u00e9quence d'appel de l'objet annot\u00e9<\/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\u00e9trique<\/a><\/noindex><\/p>\n<p>Annotation contenant des informations sur les m\u00e9tadonn\u00e9es lors de la r\u00e9ception d'une demande pour introduire ou produire une m\u00e9trique<\/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\">Minutage<\/a><\/noindex><\/p>\n<p>D\u00e9signe un chronom\u00e8tre qui suit la dur\u00e9e de l'objet annot\u00e9<\/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>Points de terminaison des m\u00e9triques (Metrics Endpoints)<\/b><\/p>\n<p>M\u00e9triques des applications <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nM\u00e9triques de base <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nM\u00e9triques du vendeur <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nToutes les m\u00e9triques <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Client REST MicroProfile<\/h4>\n<p>\nLes microservices offrent souvent des points de terminaison RESTful, pour lesquels des API clients appropri\u00e9es sont n\u00e9cessaires. Pour utiliser ces points de terminaison RESTful, les d\u00e9veloppeurs Spring utilisent g\u00e9n\u00e9ralement RestTemplate. Quarkus, quant \u00e0 lui, propose des interfaces API MicroProfile Rest Client pour cela, dont des exemples d'utilisation sont fournis dans le tableau 8.<\/p>\n<p>Dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">dans notre exemple de projet<\/a><\/noindex> L'utilisation des points de terminaison RESTful se fait \u00e0 l'aide de MicroProfile Rest Client. Plus d'informations et des exemples \u00e0 ce sujet peuvent \u00eatre trouv\u00e9s dans le guide Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Guide du Client REST<\/a><\/noindex>.<\/p>\n<p><i>Tableau 8. Exemples d'utilisation des interfaces API MicroProfile Rest Client.<\/i><\/p>\n<p>Fonctionnalit\u00e9s du Client REST MicroProfile<br \/>\nDescription<br \/>\nExemples<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Enregistre une interface Java typ\u00e9e en tant que client 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>Indique l'injection d'une instance d'interface typ\u00e9e de client REST<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invocation<\/p>\n<p>Appelle le point de terminaison REST<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>D\u00e9finit le point de terminaison 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>R\u00e9sultats<\/h3>\n<p>\nDans ce blog, principalement utile pour les d\u00e9veloppeurs Spring, nous avons bri\u00e8vement examin\u00e9 comment utiliser les interfaces API Spring avec les API MicroProfile pour d\u00e9velopper des microservices Java, et ensuite les compiler en code binaire natif, \u00e9conomisant des centaines de m\u00e9gaoctets de m\u00e9moire vive et d\u00e9marrant en quelques millisecondes.<\/p>\n<p>Comme vous l'avez d\u00e9j\u00e0 compris, des informations suppl\u00e9mentaires sur la prise en charge des interfaces API Spring et MicroProfile, ainsi qu'une multitude d'autres informations utiles peuvent \u00eatre trouv\u00e9es dans les <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">guides Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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\udd47Comment Quarkus combine MicroProfile et Spring | ProHoster","description":"Bonjour \u00e0 tous, et voici le troisi\u00e8me post de notre s\u00e9rie sur Quarkus !","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}