{"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 willkommen zum dritten Beitrag unserer Quarkus-Serie!<\/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-Microservices 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> separate und unabh\u00e4ngige APIs sind. Standardm\u00e4\u00dfig verwenden Programmierer in der Regel die APIs, mit denen sie bereits vertraut sind, da das Erlernen neuer Frameworks und Runtime-Komponenten viel Zeit ben\u00f6tigt. Heute wollen wir die Einarbeitung in einige beliebte <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<\/a><\/noindex> vereinfachen und demonstrieren, wie man sowohl Spring APIs als auch die neuen, n\u00fctzlichen Funktionen von <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nnutzen kann. Zun\u00e4chst betrachten wir den Anwendungsbereich und die Details, wie Quarkus die APIs von Spring unterst\u00fctzt, um Spring-Entwicklern zu zeigen, wie sie MicroProfile-APIs in ihrem Alltag einsetzen k\u00f6nnen. Anschlie\u00dfend werden wir die MicroProfile-APIs vorstellen, die f\u00fcr Spring-Entwickler beim Erstellen von Microservices n\u00fctzlich sein werden.<\/p>\n<p>Warum gerade Quarkus? Erstens erm\u00f6glicht es Live-Coding, also die automatische Neuladefunktion f\u00fcr alle \u00c4nderungen an MicroProfile-APIs, Spring-APIs und anderen Java-APIs, die mit nur einem Befehl ausgef\u00fchrt werden: mvn quarkus:dev. Zweitens behandelt es <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">unserem Beispiel<\/a><\/noindex> der Service Person (er wird aus den APIs von Spring, MicroProfile und JPA in eine Bin\u00e4rdatei kompiliert, die mit einem nativen Bild von GraalVM erstellt wird) startet in nur 0,055 Sekunden und ben\u00f6tigt etwa 90 MB im Arbeitsspeicher (RSS) am Endpunkt der RESTful-Anwendung. Die gesamte Kompilierung erfolgt mit nur einem Befehl: mvn package -Pnative.<\/p>\n<p>Wir werden nicht in die Details von MicroProfile eintauchen, sondern versuchen, Spring-Entwicklern zu helfen, zu verstehen, wie im Quarkus die APIs von Spring zusammen mit den APIs von MicroProfile verwendet werden k\u00f6nnen.<\/p>\n<h3>Container und Kubernetes<\/h3>\n<p>\nUm diesen Artikel nicht zu \u00fcberladen, betrachten wir hier nur die hochgradigen Aspekte der Unterst\u00fctzung <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, da es wichtig ist, dies zu verstehen. Quarkus wird als Java-Stack f\u00fcr Kubernetes positioniert, um den Speicherverbrauch und die Startzeit von Java-Anwendungen und -Diensten zu minimieren, wodurch die Dichte ihrer Bereitstellung auf dem Host erh\u00f6ht und die Gesamtkosten gesenkt werden.<\/p>\n<p>Quarkus unterst\u00fctzt auch <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">die automatische Generierung<\/a><\/noindex> von Kubernetes-Ressourcen und bietet <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Leitf\u00e4den<\/a><\/noindex> f\u00fcr das Deployment auf Kubernetes- und Red Hat OpenShift-Plattformen. Dar\u00fcber hinaus generiert Quarkus automatisch die Dockerfile.jvm (JVM-Paketierung) und Dockerfile.native (native Bin\u00e4rverpackung) Dateien, die erforderlich sind, um Container zu erstellen.<\/p>\n<p>Und schlie\u00dflich, da Kubernetes als Zielumgebung f\u00fcr das Deployment verwendet wird, nutzt Quarkus keine Java-Frameworks, wenn eine \u00e4hnliche Funktionalit\u00e4t bereits auf der Ebene der Kubernetes-Plattform implementiert ist. In Tabelle 1 wird eine Map der funktionalen \u00dcbereinstimmung zwischen Kubernetes und den typischen Java-Frameworks vorgestellt, die von Spring-Entwicklern verwendet werden.<\/p>\n<p><i>Tabelle 1. Map der funktionalen \u00dcbereinstimmung zwischen 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>Lastenverteilung<br \/>\nRibbon (clientseitig)<br \/>\nService, Replication Controller (serverseitig)<\/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\">ein Beispielprojekt<\/a><\/noindex>, in dem die APIs von Spring und MicroProfile gemeinsam genutzt werden, sowie die besagte Java-Klasse. Der Code aus diesem Beispiel kann aus der Kommandozeile kompiliert und ausgef\u00fchrt werden, detaillierte Informationen finden Sie in der Datei README.md.<\/p>\n<h3>APIs des Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus unterst\u00fctzt eine ganze Reihe von <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">APIs f\u00fcr Contexts and Dependency Injection (CDI)<\/a><\/noindex> und die API-Schnittstellen von 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 Sie bereits gut mit CDI vertraut. Auf der anderen Seite k\u00f6nnen Spring-Entwickler die Quarkus-Erweiterung f\u00fcr die Spring DI API nutzen, um die Kompatibilit\u00e4t mit Spring DI sicherzustellen. Beispiele f\u00fcr die Verwendung der unterst\u00fctzten Spring DI APIs finden Sie in Tabelle 2.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">des Projekts aus unserem Beispiel<\/a><\/noindex> werden sowohl CDI als auch Spring Dependency Injection verwendet. Weitere 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 Anleitung<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 2. Beispiele zur Verwendung unterst\u00fctzter API-Schnittstellen von Spring DI.<\/i><\/p>\n<p>Unterst\u00fctzte Funktionen von Spring DI<br \/>\nBeispiele<\/p>\n<p>Konstruktorinjektion<\/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\">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\">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-Nutzer werden erfreut sein, dass Quarkus JAX-RS, den MicroProfile Rest Client, JSON-P und JSON-B als Hauptmodell f\u00fcr Webprogrammierung unterst\u00fctzt. Auch Spring-Entwickler werden von der neu hinzugef\u00fcgten Unterst\u00fctzung f\u00fcr das Spring Web API in Quarkus begeistert sein, insbesondere von den Schnittstellen, die f\u00fcr REST verantwortlich sind. Analog zur Spring DI zielt die Unterst\u00fctzung des Spring Web API darauf ab, Spring-Entwicklern die Nutzung der Spring Web-APIs zusammen mit den MicroProfile-APIs zu erm\u00f6glichen. Beispiele f\u00fcr die Verwendung der unterst\u00fctzten Spring Web APIs sind in Tabelle 3 aufgef\u00fchrt, und weitere Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Handbuch 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 Verwendung 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-Nutzer werden ebenfalls erfreut sein zu h\u00f6ren, dass Quarkus JPA mit Hibernate ORM unterst\u00fctzt. Auch f\u00fcr Spring-Entwickler gibt es 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-APIs sind in Tabelle 4 aufgef\u00fchrt.<br \/>\nIn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">des Projekts aus unserem Beispiel<\/a><\/noindex> verwendet die APIs von Spring Data JPA, und zus\u00e4tzliche Informationen sind im Quarkus-Handbuch mit dem Titel <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Leitfaden<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 4. Beispiele f\u00fcr die Nutzung der unterst\u00fctzten APIs von Spring Data JPA.<\/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>MicroProfile-APIs<\/h3>\n<p><\/p>\n<h4>Fehlertoleranz (Fault tolerance)<\/h4>\n<p>\nFehlerverzeihtheit ist entscheidend, um kaskadierende Ausf\u00e4lle zu verhindern und zuverl\u00e4ssige Mikroservice-Architekturen zu schaffen. Spring-Entwickler nutzen seit Jahren Circuit Breaker f\u00fcr die Fehlerverzeihung. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Hystrix wird jedoch seit langem nicht mehr aktualisiert, w\u00e4hrend die MicroProfile Fault Tolerance aktiv weiterentwickelt wird und bereits mehrere Jahre in Produktion genutzt wird. Daher wird empfohlen, f\u00fcr die Erh\u00f6hung der Zuverl\u00e4ssigkeit von Diensten in Quarkus die MicroProfile Fault Tolerance APIs zu verwenden, deren Anwendungsbeispiele in Tabelle 5 dargestellt sind. Weitere Informationen 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 der unterst\u00fctzten MicroProfile Fault Tolerance APIs.<\/i><\/p>\n<p>Funktionen der MicroProfile Fault Tolerance<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@Asynchronous<\/p>\n<p>Ausf\u00fchrung der Logik in einem separaten 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>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 Ausf\u00e4llen<\/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>Alternative Logik im Fehlerfall aufrufen<\/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\">Wiederholen<\/a><\/noindex><\/p>\n<p>Wiederholversuch 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\">Zeit\u00fcberschreitung<\/a><\/noindex><\/p>\n<p>Maximale Wartezeit im Fehlerfall<\/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>Dienst\u00fcberpr\u00fcfung (Service Health)<\/h4>\n<p>\nKubernetes-Plattformen \u00fcberwachen die Gesundheit von Containern \u00fcber spezielle Dienste. Normalerweise verwenden Spring-Entwickler anpassbare HealthIndicator und den Spring Boot Actuator, damit die zugrundeliegende Plattform die Dienste \u00fcberwachen kann. In Quarkus kann dies mithilfe von MicroProfile Health erfolgen, das standardm\u00e4\u00dfig eine Lebenspr\u00fcfungs (liveness check) durchf\u00fchrt, aber auch so konfiguriert werden kann, dass sowohl die Lebenspr\u00fcfung als auch die Bereitschaftspr\u00fcfung gleichzeitig durchgef\u00fchrt werden. Beispiele f\u00fcr die Nutzung der unterst\u00fctzten MicroProfile Health API sind in Tabelle 6 aufgef\u00fchrt, weitere Informationen finden Sie in der Quarkus-Dokumentation. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Gesundheitsleitfaden<\/a><\/noindex>.<\/p>\n<p><i>Tabelle 6. Beispiele zur Verwendung von unterst\u00fctzten MicroProfile Health APIs.<\/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 \/>\nEndpunkt:<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 \/>\nEndpunkt:<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 stellen Metriken entweder f\u00fcr operationale Zwecke (zur \u00dcberwachung von SLA-Leistungsindikatoren) oder f\u00fcr nicht-operationale Zwecke (Gesch\u00e4fts-SLA-Indikatoren) bereit. Spring-Entwickler stellen Metriken mit Hilfe von Spring Boot Actuator und Micrometer bereit. Quarkus hingegen verwendet MicroProfile Metrics, um grundlegende Metriken (JVM und Betriebssystem), vendor-spezifische Metriken (Quarkus) und Anwendungsmetriken bereitzustellen. MicroProfile Metrics verlangt, dass die Implementierung die Ausgabeformate JSON und OpenMetrics (Prometheus) unterst\u00fctzt. Beispiele f\u00fcr die Verwendung der MicroProfile Metrics API finden Sie in Tabelle 7.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">des Projekts aus unserem Beispiel<\/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 der MicroProfile Metrics APIs.<\/i><\/p>\n<p>Funktionen der MicroProfile Metrics<br \/>\nBeschreibung<br \/>\nBeispiele<\/p>\n<p>@Counted<\/p>\n<p>Kennzeichnet einen 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 Gaugesensor, 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 Gaugesensor, 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, der die Aufrufh\u00e4ufigkeit 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\">Metric<\/a><\/noindex><\/p>\n<p>Annotation, die Informationen \u00fcber Metadaten enth\u00e4lt, wenn eine Anfrage zur Einf\u00fchrung oder Herstellung einer Metrik eingeht.<\/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>Bezeichnet 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 (Metrics Endpoints)<\/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 oft RESTful-Endpunkte an, f\u00fcr die entsprechende Client-APIs ben\u00f6tigt werden. Um mit RESTful-Endpunkten zu arbeiten, verwenden Spring-Entwickler normalerweise RestTemplate. Quarkus bietet jedoch f\u00fcr diese Aufgabe die MicroProfile Rest Client-API, deren Anwendungsbeispiele in Tabelle 8 angef\u00fchrt sind.<\/p>\n<p>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">des Projekts aus unserem Beispiel<\/a><\/noindex> Die Nutzung der RESTful-Endpunkte erfolgt mit dem MicroProfile Rest Client. Weitere Informationen und Beispiele dazu finden Sie im Quarkus-Handbuch. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Rest Client Anleitung<\/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 einen typisierten 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>Kennzeichnet die Implementierung einer 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, der vor allem f\u00fcr Spring-Entwickler n\u00fctzlich ist, haben wir kurz vorgestellt, wie man in Quarkus Spring-APIs zusammen mit MicroProfile-APIs verwendet, um Java-Mikroservices zu entwickeln und diese 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 von Spring- und MicroProfile-APIs sowie viele andere n\u00fctzliche Informationen in <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus-Handb\u00fcchern<\/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 4.9.10 - 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! \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\" \/>\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) 4.9.10\" \/>\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! \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\" \/>\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! Hier ist der dritte Beitrag unserer Serie \u00fcber Quarkus! Bei der Entwicklung von Java-Mikroservices wird oft angenommen, dass Eclipse MicroProfile und Spring Boot unabh\u00e4ngige APIs sind. Standardm\u00e4\u00dfig nutzen Programmierer in der Regel die APIs, mit denen sie bereits vertraut sind, da das Erlernen neuer Frameworks und Runtime-Komponenten viel Zeit in Anspruch nimmt. Heute m\u00f6chten wir","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! \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","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"},"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}]}}