{"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\/nl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Hoe Quarkus MicroProfile en Spring combineert","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo allemaal, en welkom bij de derde post in de serie over Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Hoe Quarkus MicroProfile en Spring combineert\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBij de ontwikkeling van Java-microservices wordt vaak gedacht dat <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 dit zijn aparte en onafhankelijke API's. In de praktijk gebruiken programmeurs meestal de API's die ze al gewend zijn, omdat het leren van nieuwe frameworks en runtime-componenten veel tijd kost. Vandaag zullen we proberen het leren van enkele populaire <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API's voor Spring-ontwikkelaars<\/a><\/noindex> te vereenvoudigen en laten zien hoe je zowel Spring API's als nieuwe nuttige functionaliteiten tegelijk kunt gebruiken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAls we iets dieper ingaan op de details, bekijken we eerst het toepassingsgebied en details van hoe Quarkus de Spring API's ondersteunt, om Spring-ontwikkelaars te laten zien hoe ze MicroProfile API's in hun dagelijkse werk kunnen toepassen. Daarna zullen we de MicroProfile API's bespreken die nuttig zijn voor Spring-ontwikkelaars bij het maken van microservices.<\/p>\n<p>Waarom juist Quarkus? Ten eerste, het is live coding, wat betekent dat wijzigingen in de MicroProfile API, Spring API en andere Java API's automatisch worden herladen met slechts \u00e9\u00e9n opdracht: mvn quarkus:dev. Ten tweede, de toepassing die we bekijken in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">ons voorbeeld<\/a><\/noindex> de Person-service (die wordt samengesteld uit de Spring, MicroProfile en JPA API's in een binaire uitvoerbare bestand met behulp van de GraalVM native image) start in slechts 0,055 seconden en verbruikt ongeveer 90 MB aan RAM (RSS) op het eindpunt van de RESTful applicatie. De compilatie zelf gebeurt met slechts \u00e9\u00e9n opdracht: mvn package -Pnative.<\/p>\n<p>We zullen niet dieper ingaan op de details van MicroProfile, maar we willen Spring-ontwikkelaars helpen begrijpen hoe ze in Quarkus de Spring API's samen met de MicroProfile API's kunnen gebruiken.<\/p>\n<h3>Containers en Kubernetes<\/h3>\n<p>\nOm deze post niet te overladen, zullen we hier alleen de hoog-niveau aspecten van de ondersteuning bekijken <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, omdat het belangrijk is om te begrijpen. Quarkus positioneert zich als de Java-stack voor Kubernetes, gericht op het minimaliseren van geheugengebruik en opstarttijd van Java-applicaties en -services, wat resulteert in een hogere dichtheid van implementatie op de host en lagere totale kosten.<\/p>\n<p>Quarkus ondersteunt ook <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">automatische generatie<\/a><\/noindex> van Kubernetes-resources en biedt <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">handleiding<\/a><\/noindex> begeleiding voor implementatie op Kubernetes- en Red Hat OpenShift-platforms. Bovendien genereert Quarkus automatisch de Dockerfile.jvm (JVM packaging) en Dockerfile.native (native binary packaging) bestanden die nodig zijn voor het cre\u00ebren van containers.<\/p>\n<p>En tot slot, met Kubernetes als de doelomgeving voor implementatie, gebruikt Quarkus geen Java-frameworks wanneer een vergelijkbare functionaliteit op het niveau van het Kubernetes-platform zelf is ge\u00efmplementeerd. Tabel 1 toont een kaart van functionele overeenkomsten tussen Kubernetes en de standaard Java-frameworks die door Spring-ontwikkelaars worden gebruikt.<\/p>\n<p><i>Tabel 1. Kaart van de functionele overeenkomsten tussen Java-frameworks en Kubernetes.<\/i><\/p>\n<p>Functionaliteit<br \/>\nTraditionele Spring Boot<br \/>\nKubernetes<\/p>\n<p>Service discovery<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Configuratie<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Load balancing<br \/>\nRibbon (aan de clientzijde)<br \/>\nService, Replication Controller (aan de serverzijde)<\/p>\n<p><\/p>\n<h3>Compilatie en uitvoering van de code uit het voorbeeld<\/h3>\n<p>\nIn dit artikel verwijzen we naar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">een voorbeeldproject<\/a><\/noindex>, waarin zowel de API's van Spring als MicroProfile worden gebruikt, en zelfs die specifieke Java-klasse. De code uit dit voorbeeld kan vanaf de commandoregel worden gecompileerd en uitgevoerd; zie README.md voor meer informatie.<\/p>\n<h3>API's van Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus ondersteunt een breed scala aan <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API's van Contexts and Dependency Injection (CDI)<\/a><\/noindex> en API's van Spring Dependency Injection (Spring DI). Als je met MicroProfile werkt, <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 en Jakarta EE<\/a><\/noindex>, ben je al goed bekend met CDI. Aan de andere kant kunnen Spring-ontwikkelaars de Quarkus Extension for Spring DI API gebruiken om compatibiliteit met Spring DI te waarborgen. Voorbeelden van het gebruik van de ondersteunde Spring DI API's worden gegeven in tabel 2.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">het project uit ons voorbeeld<\/a><\/noindex> maakt gebruik van zowel CDI als Spring Dependency Injection. Verdere informatie en voorbeelden hierover vind je in de handleiding van Quarkus, genaamd <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 2. Voorbeelden van het gebruik van ondersteunde Spring DI API's.<\/i><\/p>\n<p>Ondersteunde functies van Spring DI<br \/>\nVoorbeelden<\/p>\n<p>Constructor Injection<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ ge\u00efnjecteerd      \n   PersonSpringMPService personService) {    \/\/ ge\u00efnjecteerd\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\">Waarde<\/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\">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>Web Framework<\/h4>\n<p>\nMicroProfile-gebruikers zullen blij zijn dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteunt als de belangrijkste webprogrammeer-modellen. Spring-ontwikkelaars zullen verheugd zijn over de onlangs toegevoegde ondersteuning voor de Spring Web API in Quarkus, met name de interfaces die verantwoordelijk zijn voor REST. Net als bij Spring DI is het belangrijkste doel van de ondersteuning voor Spring Web API dat Spring-ontwikkelaars de Spring Web API-interfaces samen met de MicroProfile API-interfaces kunnen gebruiken. Voorbeelden van het gebruik van de ondersteunde Spring Web API worden gegeven in tabel 3, en extra informatie en voorbeelden hierover zijn te vinden in de Quarkus-handleiding met de titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 3. Voorbeelden van het gebruik van de ondersteunde Spring Web API-interfaces.<\/i><\/p>\n<p>Ondersteunde functies van Spring Web<br \/>\nVoorbeelden<\/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 (gedeeltelijk)<\/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>\nMicroProfile-gebruikers zullen ook blij zijn dat Quarkus JPA ondersteunt met Hibernate ORM. Voor Spring-ontwikkelaars is er ook goed nieuws: Quarkus ondersteunt de veelgebruikte annotaties en types van Spring Data JPA. Voorbeelden van het gebruik van de ondersteunde Spring Data JPA API worden gegeven in tabel 4.<br \/>\nIn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">het project uit ons voorbeeld<\/a><\/noindex> gebruikte Spring Data JPA API-interfaces, en extra informatie is beschikbaar in de Quarkus-handleiding met de titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 4. Voorbeelden van het gebruik van de ondersteunde Spring Data JPA API-interfaces.<\/i><\/p>\n<p>Ondersteunde functies van Spring Data JPA<br \/>\nVoorbeelden<\/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 Fragmenten<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Afgeleide querymethoden<\/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>Door de gebruiker gedefinieerde queries<\/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>MicroProfile API-interfaces<\/h3>\n<p><\/p>\n<h4>Fouttolerantie<\/h4>\n<p>\nFouttolerantieconstructies zijn cruciaal om cascadering van storingen te voorkomen en robuuste microservices-architecturen te cre\u00ebren. Spring-ontwikkelaars maken al jarenlang gebruik van circuit-breakers voor fouttolerantie. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Hystrix is echter al een tijd niet meer bijgewerkt, terwijl de MicroProfile Fault Tolerance momenteel actief wordt ontwikkeld en al enkele jaren in productie gebruikt wordt. Daarom wordt aanbevolen om de API's van MicroProfile Fault Tolerance toe te passen in Quarkus om de betrouwbaarheid van diensten te verhogen. Voorbeelden van gebruik worden gegeven in tabel 5. Verdere informatie hierover is te vinden in de Quarkus-handleiding. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Fault Tolerance Handleiding<\/a><\/noindex>.<\/p>\n<p><i>Tabel 5. Voorbeelden van het gebruik van ondersteunde MicroProfile Fault Tolerance API's.<\/i><\/p>\n<p>Functies van MicroProfile Fault Tolerance<br \/>\nOmschrijving<br \/>\nVoorbeelden<\/p>\n<p>@Asynchronous<\/p>\n<p>Logica uitvoeren in een aparte thread<\/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>Beperking van het aantal gelijktijdige aanvragen<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Slimme foutafhandeling en herstel na een storing<\/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>Alternatieve logica aanroepen in geval van een storing<\/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>Herhalen bij een mislukte aanvraag<\/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>Tijdslimiet bij een mislukking<\/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>Service Gezondheid (Service Health)<\/h4>\n<p>\nKubernetes-platforms volgen de gezondheidsstatus van containers met speciale diensten. Om ervoor te zorgen dat het onderliggende platform de diensten kan monitoren, gebruiken Spring-ontwikkelaars doorgaans configureerbare HealthIndicator en Spring Boot Actuator. In Quarkus kan dit gedaan worden met behulp van MicroProfile Health, die standaard een werkbaarheidscontrole (liveness check) uitvoeren, maar ook kunnen worden ingesteld voor zowel liveness als readiness (gereedheid) controle. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's worden gegeven in tabel 6, en aanvullende informatie is te vinden in de Quarkus-handleiding. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Gezondheidshandleiding<\/a><\/noindex>.<\/p>\n<p><i>Tabel 6. Voorbeelden van het gebruik van ondersteunde MicroProfile Health API's.<\/i><\/p>\n<p>Functies van MicroProfile Health<br \/>\nOmschrijving<br \/>\nVoorbeelden<\/p>\n<p>@Liveness<\/p>\n<p>Het platform herstart defecte container-applicaties.<br \/>\nEindpunt:<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>Het platform zal geen verkeer naar de containerapplicaties sturen als deze niet gereed zijn.<br \/>\nEindpunt:<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>Statistieken<\/h4>\n<p>\nApplicaties bieden statistieken aan of voor operationele doeleinden (ter controle van SLA-prestatienormen) of voor niet-operationele doeleinden (SLA-bedrijfsstatistieken). Spring-ontwikkelaars bieden statistieken aan met behulp van Spring Boot Actuator en Micrometer. Quarkus gebruikt MicroProfile Metrics voor het bieden van basisstatistieken (JVM en besturingssysteem), vendor-statistieken (Quarkus) en applicatiestatistieken. MicroProfile Metrics vereist dat de implementatie uitvoerformaten JSON en OpenMetrics (Prometheus) ondersteunt. Voorbeelden van het gebruik van de MicroProfile Metrics API zijn te vinden in tabel 7.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">het project uit ons voorbeeld<\/a><\/noindex> MicroProfile Metrics worden gebruikt voor het bieden van applicatiestatistieken. Meer informatie is te vinden in de Quarkus-handleiding. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Metrics Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 7. Voorbeelden van het gebruik van MicroProfile Metrics-API's.<\/i><\/p>\n<p>Functies van MicroProfile Metrics<br \/>\nOmschrijving<br \/>\nVoorbeelden<\/p>\n<p>@Counted<\/p>\n<p>Geeft een counter aan die het aantal aanroepingen van het geannoteerde object telt.<\/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>Geeft een gauge aan die het aantal gelijktijdige aanroepingen van het geannoteerde object telt.<\/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>Geeft een gauge aan die de waarde van het geannoteerde object meet.<\/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>Geeft een meter aan die de frequentie van het aanroepen van het geannoteerde object bijhoudt.<\/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\">Metric<\/a><\/noindex><\/p>\n<p>Annotatie die informatie over metadata bevat, wanneer het verzoek om invoer of productie van een metriek komt.<\/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\">Timed<\/a><\/noindex><\/p>\n<p>Geeft een timer aan die de duur van het geannoteerde object bijhoudt.<\/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>Metrics Endpoints<\/b><\/p>\n<p>Toepassingen Metrics <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nBasis Metrics <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nLeverancier Metrics <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nAlle Metrics <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>MicroProfile Rest Client<\/h4>\n<p>\nMicroservices bieden vaak RESTful eindpunten waarvoor overeenkomstige client-API's nodig zijn. Voor het werken met RESTful eindpunten gebruiken Spring-ontwikkelaars doorgaans RestTemplate. Quarkus biedt hiervoor de MicroProfile Rest Client API-interfaces, waarvan voorbeelden in tabel 8 worden gegeven.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">het project uit ons voorbeeld<\/a><\/noindex> Het gebruik van RESTful eindpunten gebeurt met behulp van de MicroProfile Rest Client. Verdere informatie en voorbeelden hierover zijn te vinden in de Quarkus handleiding. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Rest Client Gids<\/a><\/noindex>.<\/p>\n<p><i>Tabel 8. Voorbeelden van het gebruik van de MicroProfile Rest Client API-interfaces.<\/i><\/p>\n<p>Functies van MicroProfile Rest Client<br \/>\nOmschrijving<br \/>\nVoorbeelden<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registratie van een getypeerde Java-interface als REST client<\/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>Markeert de injectie van een exemplaar van de getypeerde REST client interface<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ of @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Aanroep<\/p>\n<p>Roept het REST eindpunt aan<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Stelt het REST eindpunt in<\/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>Conclusies<\/h3>\n<p>\nIn deze blog, die vooral nuttig is voor Spring-ontwikkelaars, hebben we kort bekeken hoe Quarkus API-interfaces van Spring kan gebruiken samen met de API-interfaces van MicroProfile om Java-microservices te ontwikkelen en deze vervolgens te compileren naar native binaire code, wat honderden megabytes RAM bespaart en in een paar milliseconden opstart.<\/p>\n<p>Zoals je al hebt begrepen, zijn verdere informatie over de ondersteuning van Spring en MicroProfile API-interfaces, evenals veel andere nuttige informatie te vinden in <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">de Quarkus handleidingen<\/a><\/noindex>.<br \/>\n<br \/>Bron: <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.4 - 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\/nl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Hoe Quarkus MicroProfile en Spring combineert | ProHoster","description":"Hallo allemaal, en welkom bij de derde post in de serie over Quarkus!","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}