{"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\/de\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Wie Quarkus MicroProfile und Spring vereint","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo zusammen, und hier ist der dritte Beitrag aus der Reihe \u00fcber Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Wie Quarkus MicroProfile und Spring vereint\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBei der Entwicklung von Java-Mikroservices wird oft angenommen, dass <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 das sind eigenst\u00e4ndige und voneinander unabh\u00e4ngige APIs. Standardm\u00e4\u00dfig verwenden Programmierer in der Regel die APIs, an die sie bereits gew\u00f6hnt sind, da das Erlernen neuer Frameworks und Runtime-Komponenten viel Zeit in Anspruch nimmt. Heute werden wir versuchen, das Erlernen einiger beliebter <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile-APIs f\u00fcr Spring-Entwickler zu erleichtern<\/a><\/noindex> und zeigen, wie man gleichzeitig Spring APIs und neue n\u00fctzliche Funktionen nutzen kann. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">unterst\u00fctzt Quarkus die Verwendung des Advanced Message Queuing Protocol (<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nUm es etwas genauer zu erl\u00e4utern, werden wir zuerst den Anwendungsbereich und Details betrachten, wie Quarkus die Spring-API-Schnittstellen unterst\u00fctzt, um Spring-Entwicklern zu zeigen, wie sie die MicroProfile-APIs in ihrem Alltag einsetzen k\u00f6nnen. Danach werden wir \u00fcber die MicroProfile-APIs sprechen, die f\u00fcr Spring-Entwickler n\u00fctzlich sind, wenn sie Mikroservices erstellen.<\/p>\n<p>Warum gerade Quarkus? Erstens handelt es sich um Live-Coding, also um die automatische Neuladen aller \u00c4nderungen in MicroProfile-APIs, Spring-APIs und anderen Java-APIs, die mit einem einzigen Befehl ausgef\u00fchrt werden: mvn quarkus:dev. Zweitens, das im <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">unseren Beispiel<\/a><\/noindex> Person-Dienst (der aus den API-Schnittstellen von Spring, MicroProfile und JPA in eine Bin\u00e4rdatei mit einem nativen Image von GraalVM kompiliert wird) ben\u00f6tigt nur 0,055 Sekunden zum Starten und belegt etwa 90 MB im Arbeitsspeicher (RSS) am Endpunkt der RESTful-Anwendung. Die eigentliche Kompilierung erfolgt ebenfalls mit einem einzigen Befehl: mvn package -Pnative.<\/p>\n<p>Wir werden nicht in die Einzelheiten von MicroProfile eintauchen, sondern versuchen, Spring-Entwicklern zu helfen, zu verstehen, wie in Quarkus die Spring-API-Schnittstellen zusammen mit den MicroProfile-APIs verwendet werden k\u00f6nnen.<\/p>\n<h3>Container und Kubernetes<\/h3>\n<p>\nUm diesen Artikel nicht zu \u00fcberladen, werden wir hier nur die hochrangigen Aspekte der Unterst\u00fctzung betrachten, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>da dies wichtig zu verstehen ist. Quarkus wird als Java-Stack f\u00fcr Kubernetes positioniert, mit dem Ziel, den Speicherverbrauch und die Startzeit von Java-Anwendungen und -Diensten zu minimieren und somit die Dichte ihrer Platzierung auf einem Host zu erh\u00f6hen sowie die Gesamtkosten zu senken.<\/p>\n<p>Quarkus unterst\u00fctzt auch <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">die Autogenerierung<\/a><\/noindex> von Kubernetes-Ressourcen und bietet <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Handbuch<\/a><\/noindex> zu Deployment auf Kubernetes- und Red Hat OpenShift-Plattformen. Dar\u00fcber hinaus generiert Quarkus automatisch die Dockerfile.jvm (JVM-Packaging) und Dockerfile.native (native Binary-Packaging) Dateien, die zur Erstellung von Containern erforderlich sind.<\/p>\n<p>Und schlie\u00dflich, wenn wir Kubernetes als Ziel-Deployment-Umgebung betrachten, verwendet Quarkus keine Java-Frameworks, wenn eine \u00e4hnliche Funktionalit\u00e4t bereits auf der Ebene der Kubernetes-Plattform selbst implementiert ist. In Tabelle 1 finden Sie eine Karte zur funktionalen \u00dcbereinstimmung zwischen Kubernetes und den typischen Java-Frameworks, die von Spring-Entwicklern eingesetzt werden.<\/p>\n<p><i>Tabelle 1. Karte zur funktionalen \u00dcbereinstimmung von Java-Frameworks und Kubernetes.<\/i><\/p>\n<p>Funktionalit\u00e4t<br \/>\nTraditionelles Spring Boot<br \/>\nKubernetes<\/p>\n<p>Service-Entdeckung<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfiguration<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Lastverteilung<br \/>\nRibbon (auf der Client-Seite)<br \/>\nService, Replication Controller (auf der Server-Seite)<\/p>\n<p><\/p>\n<h3>Kompilierung und Ausf\u00fchrung des Beispielcodes<\/h3>\n<p>\nIn diesem Artikel verweisen wir auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">das Beispielprojekt<\/a><\/noindex>, in dem die APIs von Spring und MicroProfile gemeinsam verwendet werden, sowie die besagte Java-Klasse. Der Code aus diesem Beispiel kann aus der Kommandozeile kompiliert und ausgef\u00fchrt werden, n\u00e4here Informationen finden Sie in der Datei README.md.<\/p>\n<h3>APIs des Spring Frameworks<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus unterst\u00fctzt eine Vielzahl von <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">APIs f\u00fcr Contexts and Dependency Injection (CDI)<\/a><\/noindex> und APIs f\u00fcr Spring Dependency Injection (Spring DI). Wenn Sie mit MicroProfile arbeiten, <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 und Jakarta EE<\/a><\/noindex>, dann sind Ihnen CDI bereits gut bekannt. Andererseits k\u00f6nnen Spring-Entwickler die Quarkus-Erweiterung f\u00fcr das Spring DI API nutzen, um die Kompatibilit\u00e4t mit Spring DI zu gew\u00e4hrleisten. Anwendungsbeispiele der unterst\u00fctzten Spring DI APIs finden Sie in Tabelle 2.<\/p>\n<p>Im <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">In unserem Beispielprojekt<\/a><\/noindex> werden sowohl CDI als auch Spring Dependency Injection verwendet. Weiterf\u00fchrende Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Handbuch mit dem Titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 2. Beispiele f\u00fcr die Verwendung unterst\u00fctzter Spring DI APIs.<\/i><\/p>\n<p>Unterst\u00fctzte Funktionen von Spring DI<br \/>\nBeispiele<\/p>\n<p>Konstruktor-Injektion<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injiziert      \n   PersonSpringMPService personService) {    \/\/ injiziert\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Feldinjektion<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\">Wert<\/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\">Komponente<\/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-Benutzer werden erfreut sein zu erfahren, dass Quarkus JAX-RS, MicroProfile Rest Client, JSON-P und JSON-B als Hauptmodell f\u00fcr die Webprogrammierung unterst\u00fctzt. Spring-Entwickler werden besonders erfreut sein \u00fcber die k\u00fcrzlich in Quarkus hinzugekommene Unterst\u00fctzung f\u00fcr die Spring Web API, insbesondere f\u00fcr die Schnittstellen, die sich mit REST befassen. \u00c4hnlich wie bei Spring DI ist das Hauptziel der Unterst\u00fctzung der Spring Web API, dass Spring-Entwickler die Spring Web-Schnittstellen zusammen mit den MicroProfile-Schnittstellen nutzen k\u00f6nnen. Beispiele f\u00fcr die Verwendung der unterst\u00fctzten Spring Web API sind in Tabelle 3 aufgef\u00fchrt, und weitere Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Leitfaden mit dem Titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 3. Beispiele f\u00fcr die Nutzung unterst\u00fctzter Spring Web-Schnittstellen.<\/i><\/p>\n<p>Unterst\u00fctzte Funktionen von Spring Web<br \/>\nBeispiele<\/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 (teilweise)<\/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-Benutzer werden ebenfalls erfreut sein, dass Quarkus JPA mit Hibernate ORM unterst\u00fctzt. F\u00fcr Spring-Entwickler gibt es auch gute Nachrichten: Quarkus unterst\u00fctzt g\u00e4ngige Annotations und Typen von Spring Data JPA. Beispiele f\u00fcr die Nutzung der unterst\u00fctzten Spring Data JPA API sind in Tabelle 4 aufgef\u00fchrt.<br \/>\nIm <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">In unserem Beispielprojekt<\/a><\/noindex> verwendete Schnittstellen von Spring Data JPA, und zus\u00e4tzliche Informationen sind im Quarkus-Leitfaden unter dem Titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 4. Beispiele f\u00fcr die Nutzung unterst\u00fctzter Spring Data JPA-Schnittstellen.<\/i><\/p>\n<p>Unterst\u00fctzte Funktionen von Spring Data JPA<br \/>\nBeispiele<\/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 Fragmente<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Abgeleitete Abfragemethoden<\/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>Benutzerdefinierte Abfragen<\/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>Schnittstellen von MicroProfile<\/h3>\n<p><\/p>\n<h4>Fehlertoleranz (Fault tolerance)<\/h4>\n<p>\nFault-Tolerance-Konstruktionen sind \u00e4u\u00dferst wichtig, um kaskadierende Ausf\u00e4lle zu verhindern und zuverl\u00e4ssige Microservice-Architekturen zu schaffen. Spring-Entwickler nutzen seit vielen Jahren Circuit-Breaker zur Ausfallsicherheit. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Allerdings wird Hystrix schon lange nicht mehr aktualisiert, w\u00e4hrend das MicroProfile Fault Tolerance aktiv weiterentwickelt wird und bereits mehrere Jahre Produktnutzung hinter sich hat. Daher wird empfohlen, die MicroProfile Fault Tolerance-API-Schnittstellen f\u00fcr die Verbesserung der Zuverl\u00e4ssigkeit von Diensten in Quarkus zu verwenden, deren Anwendungsbeispiele in Tabelle 5 aufgef\u00fchrt sind. Weitere Informationen dazu finden Sie im Quarkus-Handbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Fault Tolerance Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 5. Beispiele f\u00fcr die Verwendung unterst\u00fctzter MicroProfile Fault Tolerance-API-Schnittstellen.<\/i><\/p>\n<p>Funktionen von MicroProfile Fault Tolerance<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@Asynchronous<\/p>\n<p>Logik in einem separaten Thread ausf\u00fchren<\/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>Begrenzung der Anzahl gleichzeitiger Anfragen<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Intelligente Fehlerbehandlung und Wiederherstellung nach Fehlern<\/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>Aufruf alternativer Logik im Falle eines Fehlers<\/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>Wiederholen bei Anfragefehler<\/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>Maximale Wartezeit bei einem Fehler<\/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 Health<\/h4>\n<p>\nKubernetes-Plattformen \u00fcberwachen die Integrit\u00e4t von Containern mithilfe spezieller Dienste. Damit die zugrunde liegende Plattform die Dienste \u00fcberwachen kann, verwenden Spring-Entwickler normalerweise anpassbare HealthIndicator und Spring Boot Actuator. In Quarkus kann dies mit MicroProfile Health erfolgen, die standardm\u00e4\u00dfig einen Liveness-Check durchf\u00fchren, aber auch so konfiguriert werden k\u00f6nnen, dass sie sowohl Liveness als auch Readiness (Bereitschaft) gleichzeitig \u00fcberpr\u00fcfen. Beispiele f\u00fcr die Verwendung der unterst\u00fctzten MicroProfile Health-API sind in Tabelle 6 aufgef\u00fchrt, und zus\u00e4tzliche Informationen sind im Quarkus-Handbuch enthalten. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Health Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 6. Beispiele f\u00fcr die Verwendung unterst\u00fctzter MicroProfile Health-API-Schnittstellen.<\/i><\/p>\n<p>Funktionen von MicroProfile Health<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@Liveness<\/p>\n<p>Die Plattform f\u00fchrt einen Neustart fehlerhafter containerisierter Anwendungen durch.<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>Die Plattform wird keinen Verkehr an containerisierte Anwendungen senden, wenn diese nicht bereit sind.<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>Metriken<\/h4>\n<p>\nAnwendungen liefern Metriken entweder zu betrieblichen Zwecken (zur \u00dcberwachung von SLA-Leistungskennzahlen) oder zu nicht-betrieblichen Zwecken (Gesch\u00e4ftskennzahlen SLA). Spring-Entwickler liefern Metriken \u00fcber Spring Boot Actuator und Micrometer. Quarkus hingegen verwendet MicroProfile Metrics zur Bereitstellung grundlegender Metriken (JVM und Betriebssystem), vendor-spezifischen Metriken (Quarkus) und Anwendungsmetriken. MicroProfile Metrics erfordert, dass die Implementierung Ausgabeformate in JSON und OpenMetrics (Prometheus) unterst\u00fctzt. Beispiele f\u00fcr die Nutzung der MicroProfile Metrics API sind in Tabelle 7 aufgef\u00fchrt.<\/p>\n<p>Im <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">In unserem Beispielprojekt<\/a><\/noindex> MicroProfile Metrics werden zur Bereitstellung von Anwendungsmetriken verwendet. Weitere Informationen finden Sie im Quarkus-Handbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Metrik-Leitfaden<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 7. Beispiele f\u00fcr die Nutzung von MicroProfile Metrics APIs.<\/i><\/p>\n<p>Funktionen von MicroProfile Metrics<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@Counted<\/p>\n<p>Kennzeichnet einen Counter-Z\u00e4hler, der die Anzahl der Aufrufe des annotierten Objekts z\u00e4hlt.<\/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>Kennzeichnet einen Gauge-Sensor, der die Anzahl der parallelen Aufrufe des annotierten Objekts z\u00e4hlt.<\/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>Kennzeichnet einen Gauge-Sensor, der den Wert des annotierten Objekts misst.<\/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>Kennzeichnet einen Meter-Sensor, der die H\u00e4ufigkeit der Aufrufe des annotierten Objekts verfolgt.<\/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\">Metrik<\/a><\/noindex><\/p>\n<p>Annotation, die Metadateninformationen enth\u00e4lt, wenn eine Anfrage zur Erstellung oder Produktion einer Metrik erfolgt.<\/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>Kennzeichnet einen Timer, der die Dauer des annotierten Objekts verfolgt.<\/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>Metrik-Endpunkte<\/b><\/p>\n<p>Anwendungsmetriken <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nBasismetriken <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nVendor-Metriken <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nAlle Metriken <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>REST-Client MicroProfile<\/h4>\n<p>\nMikroservices bieten h\u00e4ufig RESTful-Endpunkte, f\u00fcr die entsprechende Client-APIs erforderlich sind. Um mit RESTful-Endpunkten zu arbeiten, verwenden Spring-Entwickler in der Regel RestTemplate. Quarkus bietet f\u00fcr diese Aufgabe die MicroProfile REST-Client-APIs, deren Verwendung in Tabelle 8 veranschaulicht wird.<\/p>\n<p>Im <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">In unserem Beispielprojekt<\/a><\/noindex> Die Verwendung von RESTful-Endpunkten erfolgt \u00fcber MicroProfile REST Client. Weitere Informationen und Beispiele finden Sie im Quarkus-Handbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">REST-Client-Leitfaden<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 8. Beispiele f\u00fcr die Verwendung der MicroProfile REST-Client-APIs.<\/i><\/p>\n<p>Funktionen des MicroProfile REST Client<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registriert eine typisierte Java-Schnittstelle 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>Kennzeichnet die Injektion einer Instanz der typisierten REST-Client-Schnittstelle<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ oder @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Aufruf<\/p>\n<p>Ruft den REST-Endpunkt auf<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Legt den REST-Endpunkt fest<\/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>Ergebnisse<\/h3>\n<p>\nIn diesem Blog haben wir, der vor allem f\u00fcr Spring-Entwickler n\u00fctzlich ist, kurz betrachtet, wie Quarkus die Spring-APIs zusammen mit den MicroProfile-APIs verwendet, um Java-Mikroservices zu entwickeln und sie dann in nativen Bin\u00e4rcode zu kompilieren, der Hunderte von Megabyte RAM spart und in wenigen Millisekunden startet.<\/p>\n<p>Wie Sie bereits verstanden haben, finden Sie weitere Informationen zur Unterst\u00fctzung der Spring- und MicroProfile-APIs sowie viele andere n\u00fctzliche Informationen in den <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus-Leitf\u00e4den<\/a><\/noindex>.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Wie Quarkus MicroProfile und Spring vereint | ProHoster","description":"Hallo zusammen, und hier ist der dritte Beitrag aus der Reihe \u00fcber Quarkus!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}