{"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\/it\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Come Quarkus unisce MicroProfile e Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao a tutti, ecco il terzo post della serie su Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Come Quarkus unisce MicroProfile e Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNello sviluppo di microservizi Java, spesso si considera che <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> sono API separate e indipendenti l'una dall'altra. Per impostazione predefinita, i programmatori tendono a utilizzare le API a cui sono gi\u00e0 abituati, poich\u00e9 l'apprendimento di nuovi framework e componenti di runtime richiede molto tempo. Oggi proveremo a semplificare l'apprendimento di alcune delle popolari <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">API MicroProfile per gli sviluppatori Spring<\/a><\/noindex> e mostreremo come utilizzare simultaneamente le API di Spring e le nuove funzionalit\u00e0 utili <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSe vogliamo essere pi\u00f9 dettagliati, prima esamineremo il campo di applicazione e i dettagli su come Quarkus supporta le interfacce API di Spring, per mostrare agli sviluppatori Spring come possono applicare le API MicroProfile nel loro lavoro quotidiano. Poi parleremo delle API MicroProfile che saranno utili agli sviluppatori Spring nella creazione di microservizi.<\/p>\n<p>Perch\u00e9 proprio Quarkus? Innanzitutto, \u00e8 il live coding, ovvero il riavvio automatico di qualsiasi modifica nelle API MicroProfile, nelle API di Spring e in altre API Java, che si esegue con un solo comando: mvn quarkus:dev. In secondo luogo, il servizio Person considerato nel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nostro esempio<\/a><\/noindex> compila dalle interfacce API di Spring, MicroProfile e JPA in un file binario utilizzando l'immagine nativa di GraalVM) si avvia in soli 0.055 secondi e occupa circa 90 MB di RAM (RSS) sulla punta finale dell'applicazione RESTful. La sua compilazione avviene con un solo comando: mvn package -Pnative.<\/p>\n<p>Non approfondiremo i dettagli di MicroProfile, ma cercheremo di aiutare gli sviluppatori Spring a capire come in Quarkus si possano utilizzare le interfacce API di Spring insieme alle API di MicroProfile.<\/p>\n<h3>Contenitori e Kubernetes<\/h3>\n<p>\nPer non appesantire questo articolo, qui considereremo solo gli aspetti ad alto livello del supporto <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, poich\u00e9 \u00e8 importante comprenderlo. Quarkus \u00e8 posizionato come uno stack Java per Kubernetes, destinato a minimizzare il consumo di memoria e il tempo di avvio delle applicazioni Java e dei servizi, aumentando di conseguenza la densit\u00e0 della loro distribuzione sull'host e riducendo i costi complessivi.<\/p>\n<p>Quarkus supporta anche <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">la generazione automatica<\/a><\/noindex> di risorse Kubernetes e offre <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">del manuale<\/a><\/noindex> per il deployment su piattaforme Kubernetes e Red Hat OpenShift. Inoltre, Quarkus genera automaticamente i file Dockerfile.jvm (packaging JVM) e Dockerfile.native (packaging binario nativo), necessari per la creazione dei contenitori.<\/p>\n<p>Infine, orientandosi su Kubernetes come ambiente di distribuzione, Quarkus non utilizza framework Java nei casi in cui funzionalit\u00e0 simili siano implementate a livello della piattaforma Kubernetes stessa. Nella tabella 1 viene presentata una mappa di corrispondenza funzionale tra Kubernetes e i tipici framework Java utilizzati dagli sviluppatori Spring.<\/p>\n<p><i>Tabella 1. Mappa di corrispondenza dei framework Java e Kubernetes.<\/i><\/p>\n<p>Funzionalit\u00e0<br \/>\nTradizionale Spring Boot<br \/>\nKubernetes<\/p>\n<p>Service discovery<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Configurazione<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Bilanciamento del carico<br \/>\nRibbon (lato client)<br \/>\nService, Replication Controller (lato server)<\/p>\n<p><\/p>\n<h3>Compilazione e avvio del codice dell'esempio<\/h3>\n<p>\nIn questo articolo ci riferiamo a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">esempio di progetto<\/a><\/noindex>, dove sono utilizzate insieme le API di Spring e MicroProfile e persino quel Java class. Il codice di questo esempio pu\u00f2 essere compilato e avviato dalla riga di comando, vedere il file README.md per ulteriori dettagli.<\/p>\n<h3>API di Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus supporta una serie di <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API di Contexts and Dependency Injection (CDI)<\/a><\/noindex> e API di Spring Dependency Injection (Spring DI). Se lavori 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 e Jakarta EE<\/a><\/noindex>, allora sei gi\u00e0 a conoscenza di CDI. D'altra parte, gli sviluppatori Spring possono utilizzare l'estensione Quarkus per l'API Spring DI per garantire la compatibilit\u00e0 con Spring DI. Esempi di utilizzo delle API Spring DI supportate sono riportati nella tabella 2.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nel progetto del nostro esempio<\/a><\/noindex> viene utilizzato sia CDI che Spring Dependency Injection. Maggiori dettagli e esempi su questo argomento possono essere trovati nella guida Quarkus intitolata <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabella 2. Esempi di utilizzo delle API Spring DI supportate.<\/i><\/p>\n<p>Funzionalit\u00e0 supportate da Spring DI<br \/>\nEsempi<\/p>\n<p>Constructor Injection<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ iniettato      \n   PersonSpringMPService personService) {    \/\/ iniettato\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Field Injection<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\">Component<\/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\">Servizio<\/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>Web framework<\/h4>\n<p>\nGli utenti di MicroProfile apprezzeranno il supporto di Quarkus per JAX-RS, MicroProfile Rest Client, JSON-P e JSON-B come il modello principale di programmazione web. Gli sviluppatori Spring saranno felici di scoprire che Quarkus ha recentemente introdotto il supporto per le Spring Web API, in particolare per le interfacce che gestiscono il REST. Analogamente a Spring DI, l'obiettivo principale del supporto per le Spring Web API \u00e8 consentire agli sviluppatori Spring di utilizzare le interfacce API di Spring Web insieme alle interfacce API di MicroProfile. Esempi di utilizzo delle Spring Web API supportate sono riportati nella tabella 3, mentre ulteriori informazioni e esempi su questo argomento possono essere trovati nella guida di Quarkus intitolata <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Guida a Spring Web<\/a><\/noindex>.<\/p>\n<p><i>Tabella 3. Esempi di utilizzo delle interfacce API di Spring Web supportate.<\/i><\/p>\n<p>Funzioni supportate da Spring Web<br \/>\nEsempi<\/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 (parziale)<\/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>\nAnche agli utenti di MicroProfile piacer\u00e0 che Quarkus supporta JPA utilizzando Hibernate ORM. Buone notizie anche per gli sviluppatori Spring: Quarkus supporta le annotazioni e i tipi standard di Spring Data JPA. Esempi di utilizzo delle API di Spring Data JPA supportate sono riportati nella tabella 4.<br \/>\nIn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nel progetto del nostro esempio<\/a><\/noindex> vengono utilizzate le interfacce API di Spring Data JPA, e ulteriori informazioni sono disponibili nella guida di Quarkus intitolata <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Guida a Spring Data JPA<\/a><\/noindex>.<\/p>\n<p><i>Tabella 4. Esempi di utilizzo delle interfacce API di Spring Data JPA supportate.<\/i><\/p>\n<p>Funzioni supportate da Spring Data JPA<br \/>\nEsempi<\/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>Repository Fragments<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Metodi di query derivati<\/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>Query definite dall'utente<\/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>Interfacce API di MicroProfile<\/h3>\n<p><\/p>\n<h4>Tolleranza ai guasti<\/h4>\n<p>\nLe strutture di Fault tolerance sono molto importanti per prevenire guasti a cascata e creare architetture microserviziali affidabili. Gli sviluppatori di Spring utilizzano da molti anni i circuit-breaker per garantire la tolleranza ai guasti. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Tuttavia, Hystrix non \u00e8 stato aggiornato da tempo, mentre la Fault Tolerance di MicroProfile si sta sviluppando attivamente ed ha gi\u00e0 diversi anni di utilizzo in produzione. Pertanto, per aumentare l'affidabilit\u00e0 dei servizi in Quarkus, \u00e8 consigliabile utilizzare le API di MicroProfile Fault Tolerance, i cui esempi di utilizzo sono riportati nella tabella 5. Maggiori informazioni si possono trovare nella guida di Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Guida alla Tolleranza ai Guasti<\/a><\/noindex>.<\/p>\n<p><i>Tabella 5. Esempi di utilizzo delle API supportate da MicroProfile Fault Tolerance.<\/i><\/p>\n<p>Funzioni di MicroProfile Fault Tolerance<br \/>\nDescrizione<br \/>\nEsempi<\/p>\n<p>@Asynchronous<\/p>\n<p>Esecuzione della logica in un thread separato<\/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>Limitazione del numero di richieste simultanee<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Gestione intelligente dei fallimenti e recupero dopo i guasti<\/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>Chiamata a logica alternativa in caso di errore<\/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>Ripetizione in caso di errore nella richiesta<\/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 di attesa controllato in caso di errore<\/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>Controllo dei servizi (Service Health)<\/h4>\n<p>\nLe piattaforme Kubernetes monitorano la salute dei container mediante servizi specializzati. Affinch\u00e9 la piattaforma sottostante possa monitorare i servizi, gli sviluppatori di Spring generalmente utilizzano HealthIndicator personalizzati e Spring Boot Actuator. In Quarkus, questo pu\u00f2 essere fatto tramite MicroProfile Health, che per impostazione predefinita esegue il controllo della disponibilit\u00e0 (liveness check), ma pu\u00f2 anche essere configurato per eseguire contemporaneamente il controllo della disponibilit\u00e0 e della prontezza (readiness). Gli esempi di utilizzo delle API MicroProfile Health supportate sono riportati nella tabella 6, mentre ulteriori informazioni sono disponibili nella guida di Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Guida alla Salute<\/a><\/noindex>.<\/p>\n<p><i>Tabella 6. Esempi di utilizzo delle API supportate da MicroProfile Health.<\/i><\/p>\n<p>Funzioni di MicroProfile Health<br \/>\nDescrizione<br \/>\nEsempi<\/p>\n<p>@Liveness<\/p>\n<p>La piattaforma esegue il riavvio di applicazioni containerizzate non funzionanti<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 piattaforma non invier\u00e0 traffico alle applicazioni containerizzate in caso di non prontezza<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>Metriche<\/h4>\n<p>\nLe applicazioni forniscono metriche sia in ottica operativa (per monitorare i KPI delle SLA), sia in ottica non operativa (KPI aziendali delle SLA). Gli sviluppatori Spring forniscono metriche tramite Spring Boot Actuator e Micrometer. D'altra parte, Quarkus utilizza MicroProfile Metrics per fornire metriche di base (JVM e sistema operativo), metriche del fornitore (Quarkus) e metriche delle applicazioni. MicroProfile Metrics richiede che l'implementazione supporti i formati di output JSON e OpenMetrics (Prometheus). Esempi di utilizzo dell'API MicroProfile Metrics sono riportati nella Tabella 7.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nel progetto del nostro esempio<\/a><\/noindex> Le MicroProfile Metrics vengono utilizzate per fornire metriche dell'applicazione. Maggiori dettagli possono essere trovati nella guida di Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Guida alle Metriche<\/a><\/noindex>.<\/p>\n<p><i>Tabella 7. Esempi di utilizzo delle API MicroProfile Metrics.<\/i><\/p>\n<p>Funzionalit\u00e0 delle MicroProfile Metrics<br \/>\nDescrizione<br \/>\nEsempi<\/p>\n<p>@Counted<\/p>\n<p>Indica un contatore che conta il numero di chiamate all'oggetto annotato<\/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 gauge che conta il numero di chiamate parallele all'oggetto annotato<\/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 gauge che misura il valore dell'oggetto annotato<\/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 meter che tiene traccia della frequenza di chiamata dell'oggetto annotato<\/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\">Metri<\/a><\/noindex><\/p>\n<p>Annotazione che contiene informazioni sui metadati alla ricezione di richieste per la creazione o l'emissione di metriche<\/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\">Temporizzato<\/a><\/noindex><\/p>\n<p>Indica un timer che tiene traccia della durata dell'oggetto annotato<\/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>Punti finali delle metriche (Metrics Endpoints)<\/b><\/p>\n<p>Metriche delle applicazioni <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nMetriche di base <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nMetriche del fornitore <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nTutte le metriche <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Client REST MicroProfile<\/h4>\n<p>\nI microservizi spesso forniscono punti finali RESTful, per i quali sono necessari API client corrispondenti. Per utilizzare i punti finali RESTful, gli sviluppatori Spring di solito utilizzano RestTemplate. Quarkus, invece, offre per affrontare questa esigenza le interfacce API del Client REST di MicroProfile, dei cui esempi di utilizzo \u00e8 fornita una tabella 8.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">nel progetto del nostro esempio<\/a><\/noindex> L'uso dei punti finali RESTful avviene tramite il Client REST di MicroProfile. Maggiori informazioni e esempi su questo argomento sono disponibili nella guida di Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Guida al Client REST<\/a><\/noindex>.<\/p>\n<p><i>Tabella 8. Esempi di utilizzo delle interfacce API del Client REST di MicroProfile.<\/i><\/p>\n<p>Funzioni del Client REST di MicroProfile<br \/>\nDescrizione<br \/>\nEsempi<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registra un'interfaccia Java tipizzata come 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>Segna l'iniezione di un'istanza di un'interfaccia tipizzata REST client<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ o @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invocazione<\/p>\n<p>Chiama il punto finale REST<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Imposta il punto finale 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>Conclusioni<\/h3>\n<p>\nIn questo blog, che sar\u00e0 utile prima di tutto agli sviluppatori Spring, abbiamo brevemente esaminato come in Quarkus utilizzare le interfacce API di Spring insieme alle interfacce API di MicroProfile per sviluppare microservizi Java e poi compilarli in codice binario nativo, che consente di risparmiare centinaia di megabyte di memoria RAM e si avvia in pochi millisecondi.<\/p>\n<p>Come gi\u00e0 capito, ulteriori informazioni sul supporto delle interfacce API di Spring e MicroProfile, cos\u00ec come molte altre informazioni utili, possono essere trovate in <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">guide di 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.1.1 - 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\/it\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Come Quarkus unisce MicroProfile e Spring | ProHoster","description":"Ciao a tutti, ecco il terzo post della serie su Quarkus!","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}