{"id":472,"date":"2024-06-28T21:59:40","date_gmt":"2024-06-28T20:59:40","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=472"},"modified":"2024-07-04T22:09:04","modified_gmt":"2024-07-04T21:09:04","slug":"circuit-breaker-mit-resilience4j-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=472","title":{"rendered":"Circuit Breaker mit Resilience4j in Java"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Einf\u00fchrung<\/h3>\n\n\n\n<p>In der modernen Softwareentwicklung ist die Zuverl\u00e4ssigkeit von Anwendungen von entscheidender Bedeutung. Mikroservices-Architekturen und verteilte Systeme sind sehr popul\u00e4r geworden, was jedoch auch Herausforderungen mit sich bringt, insbesondere bei der Handhabung von Fehlern und der Resilienz von Anwendungen. Eine der Techniken zur Verbesserung der Resilienz ist das Circuit Breaker Muster. Resilience4j ist eine leichtgewichtige, auf Funktionen basierende Java-Bibliothek, die verschiedene Resilienz-Muster unterst\u00fctzt, darunter auch Circuit Breaker. In diesem Artikel werden wir detailliert erl\u00e4utern, wie man mit Resilience4j einen Circuit Breaker in Java implementiert und die verschiedenen Konfigurationsoptionen erkl\u00e4rt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was ist ein Circuit Breaker?<\/h3>\n\n\n\n<p>Ein Circuit Breaker ist ein Designmuster, das dazu dient, den Ausfall eines Services zu verhindern, indem Anfragen an einen fehlerhaften Service unterbrochen werden. Es arbeitet \u00e4hnlich wie ein elektrischer Sicherungsautomat und hat drei Zust\u00e4nde:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Closed<\/strong>: Der Circuit Breaker leitet die Anfragen weiter.<\/li>\n\n\n\n<li><strong>Open<\/strong>: Der Circuit Breaker blockiert alle Anfragen und l\u00e4sst keine weiteren Versuche zu, bis eine festgelegte Wartezeit abgelaufen ist.<\/li>\n\n\n\n<li><strong>Half-Open<\/strong>: Der Circuit Breaker l\u00e4sst eine begrenzte Anzahl von Anfragen durch, um zu testen, ob der Service wieder funktionsf\u00e4hig ist.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Einrichtung von Resilience4j<\/h3>\n\n\n\n<p>Bevor wir mit der Implementierung beginnen, m\u00fcssen wir die notwendigen Abh\u00e4ngigkeiten zu unserem Projekt hinzuf\u00fcgen. F\u00fcr ein Maven-Projekt f\u00fcgen wir folgende Abh\u00e4ngigkeit in der <code>pom.xml<\/code> hinzu:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.github.resilience4j<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>resilience4j-circuitbreaker<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.7.1<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>F\u00fcr Gradle-Projekte f\u00fcgen wir folgende Zeile in der <code>build.gradle<\/code> Datei hinzu:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">implementation <span class=\"hljs-string\">'io.github.resilience4j:resilience4j-circuitbreaker:1.7.1'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Grundlegende Implementierung<\/h3>\n\n\n\n<p>Nun, da die Abh\u00e4ngigkeiten hinzugef\u00fcgt sind, k\u00f6nnen wir mit der Implementierung eines einfachen Circuit Breakers beginnen. Zuerst m\u00fcssen wir eine Instanz des Circuit Breakers erstellen und konfigurieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.github.resilience4j.circuitbreaker.CircuitBreaker;\n<span class=\"hljs-keyword\">import<\/span> io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;\n<span class=\"hljs-keyword\">import<\/span> io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;\n\n<span class=\"hljs-keyword\">import<\/span> java.time.Duration;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CircuitBreakerExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-comment\">\/\/ Konfiguration des Circuit Breakers<\/span>\n        CircuitBreakerConfig config = CircuitBreakerConfig.custom()\n                .failureRateThreshold(<span class=\"hljs-number\">50<\/span>) <span class=\"hljs-comment\">\/\/ 50% Fehlerrate<\/span>\n                .waitDurationInOpenState(Duration.ofSeconds(<span class=\"hljs-number\">10<\/span>)) <span class=\"hljs-comment\">\/\/ 10 Sekunden im Open-Zustand<\/span>\n                .slidingWindowSize(<span class=\"hljs-number\">20<\/span>) <span class=\"hljs-comment\">\/\/ Gr\u00f6\u00dfe des Sliding Window<\/span>\n                .build();\n\n        <span class=\"hljs-comment\">\/\/ Registrierung des Circuit Breakers<\/span>\n        CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);\n\n        <span class=\"hljs-comment\">\/\/ Erstellen des Circuit Breakers<\/span>\n        CircuitBreaker circuitBreaker = registry.circuitBreaker(<span class=\"hljs-string\">\"exampleCircuitBreaker\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Anwendung des Circuit Breakers<\/span>\n        Supplier&lt;<span class=\"hljs-built_in\">String<\/span>&gt; decoratedSupplier = CircuitBreaker\n                .decorateSupplier(circuitBreaker, <span class=\"hljs-attr\">CircuitBreakerExample<\/span>::remoteServiceCall);\n\n        <span class=\"hljs-comment\">\/\/ Ausf\u00fchren des dekorierten Suppliers<\/span>\n        <span class=\"hljs-built_in\">String<\/span> result = Try.ofSupplier(decoratedSupplier)\n                .recover(throwable -&gt; <span class=\"hljs-string\">\"Fallback\"<\/span>).get();\n\n        System.out.println(result);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Beispiel f\u00fcr einen Remote Service Call, der fehlschl\u00e4gt<\/span>\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-built_in\">String<\/span> remoteServiceCall() {\n        <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Service not available\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel konfigurieren wir einen Circuit Breaker mit einer Fehlerrate von 50%, einer Wartezeit von 10 Sekunden im offenen Zustand und einem Sliding Window von 20 Anfragen. Wir dekorieren dann einen Supplier, der einen Remote Service Call simuliert. Wenn der Remote Service Call fehlschl\u00e4gt, greift der Circuit Breaker ein und der Fallback-Mechanismus liefert einen Standardwert zur\u00fcck.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte Konfigurationsoptionen<\/h3>\n\n\n\n<p>Die grundlegende Implementierung kann durch verschiedene Konfigurationsoptionen erweitert werden, um spezifischeren Anforderungen gerecht zu werden. Hier sind einige erweiterte Konfigurationsoptionen:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Fehlerrate (failureRateThreshold)<\/h4>\n\n\n\n<p>Die Fehlerrate definiert den Prozentsatz der fehlgeschlagenen Anfragen, bei dem der Circuit Breaker in den Open-Zustand wechselt. In unserem Beispiel bedeutet eine Fehlerrate von 50%, dass der Circuit Breaker in den Open-Zustand wechselt, wenn mindestens die H\u00e4lfte der Anfragen innerhalb des Sliding Windows fehlschlagen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.failureRateThreshold(<span class=\"hljs-number\">50<\/span>) <span class=\"hljs-comment\">\/\/ 50% Fehlerrate<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Wartezeit im offenen Zustand (waitDurationInOpenState)<\/h4>\n\n\n\n<p>Die Wartezeit definiert, wie lange der Circuit Breaker im Open-Zustand bleibt, bevor er in den Half-Open-Zustand wechselt. In unserem Beispiel betr\u00e4gt diese Wartezeit 10 Sekunden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.waitDurationInOpenState(Duration.ofSeconds(<span class=\"hljs-number\">10<\/span>)) <span class=\"hljs-comment\">\/\/ 10 Sekunden im Open-Zustand<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Sliding Window (slidingWindowSize)<\/h4>\n\n\n\n<p>Das Sliding Window definiert die Anzahl der Anfragen, die zur Berechnung der Fehlerrate herangezogen werden. In unserem Beispiel umfasst das Sliding Window 20 Anfragen. Es gibt zwei Modi f\u00fcr das Sliding Window:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Count-based sliding window<\/strong>: Das Fenster basiert auf einer festen Anzahl von Anfragen.<\/li>\n\n\n\n<li><strong>Time-based sliding window<\/strong>: Das Fenster basiert auf einem festen Zeitintervall.<\/li>\n<\/ol>\n\n\n\n<p>In unserem Beispiel verwenden wir ein Count-based sliding window.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.slidingWindowSize(<span class=\"hljs-number\">20<\/span>) <span class=\"hljs-comment\">\/\/ Gr\u00f6\u00dfe des Sliding Window<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Ausnahmen (recordExceptions und ignoreExceptions)<\/h4>\n\n\n\n<p>Wir k\u00f6nnen spezifische Ausnahmen definieren, die vom Circuit Breaker als Fehler gez\u00e4hlt oder ignoriert werden sollen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">.recordExceptions(RuntimeException.class, TimeoutException.class) <span class=\"hljs-comment\">\/\/ Ausnahmen, die gez\u00e4hlt werden<\/span>\n.ignoreExceptions(IgnoredException.class) <span class=\"hljs-comment\">\/\/ Ausnahmen, die ignoriert werden<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Ereignis\u00fcberwachung<\/h3>\n\n\n\n<p>Resilience4j bietet auch die M\u00f6glichkeit, Ereignisse zu \u00fcberwachen und zu protokollieren, die vom Circuit Breaker ausgel\u00f6st werden. Dies ist n\u00fctzlich, um Einblicke in das Verhalten des Circuit Breakers zu erhalten.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">circuitBreaker<\/span><span class=\"hljs-selector-class\">.getEventPublisher<\/span>()\n        <span class=\"hljs-selector-class\">.onSuccess<\/span>(<span class=\"hljs-selector-tag\">event<\/span> <span class=\"hljs-selector-tag\">-<\/span>&gt; <span class=\"hljs-selector-tag\">System<\/span><span class=\"hljs-selector-class\">.out<\/span><span class=\"hljs-selector-class\">.println<\/span>(\"<span class=\"hljs-selector-tag\">Call<\/span> <span class=\"hljs-selector-tag\">succeeded<\/span>\"))\n        <span class=\"hljs-selector-class\">.onError<\/span>(<span class=\"hljs-selector-tag\">event<\/span> <span class=\"hljs-selector-tag\">-<\/span>&gt; <span class=\"hljs-selector-tag\">System<\/span><span class=\"hljs-selector-class\">.out<\/span><span class=\"hljs-selector-class\">.println<\/span>(\"<span class=\"hljs-selector-tag\">Call<\/span> <span class=\"hljs-selector-tag\">failed<\/span>\"))\n        <span class=\"hljs-selector-class\">.onStateTransition<\/span>(<span class=\"hljs-selector-tag\">event<\/span> <span class=\"hljs-selector-tag\">-<\/span>&gt; <span class=\"hljs-selector-tag\">System<\/span><span class=\"hljs-selector-class\">.out<\/span><span class=\"hljs-selector-class\">.println<\/span>(\"<span class=\"hljs-selector-tag\">State<\/span> <span class=\"hljs-selector-tag\">transitioned<\/span> <span class=\"hljs-selector-tag\">to<\/span> \" + <span class=\"hljs-selector-tag\">event<\/span><span class=\"hljs-selector-class\">.getStateTransition<\/span>()));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Integration mit Spring Boot<\/h3>\n\n\n\n<p>Resilience4j l\u00e4sst sich auch nahtlos in Spring Boot Anwendungen integrieren. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.stereotype.Service;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.client.RestTemplate;\n\n@Service\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyService<\/span> <\/span>{\n    private final RestTemplate restTemplate;\n\n    public MyService(RestTemplate restTemplate) {\n        <span class=\"hljs-keyword\">this<\/span>.restTemplate = restTemplate;\n    }\n\n    @CircuitBreaker(name = <span class=\"hljs-string\">\"myServiceCircuitBreaker\"<\/span>, fallbackMethod = <span class=\"hljs-string\">\"fallback\"<\/span>)\n    public <span class=\"hljs-built_in\">String<\/span> callExternalService() {\n        <span class=\"hljs-keyword\">return<\/span> restTemplate.getForObject(<span class=\"hljs-string\">\"http:\/\/example.com\/api\"<\/span>, <span class=\"hljs-built_in\">String<\/span>.class);\n    }\n\n    public <span class=\"hljs-built_in\">String<\/span> fallback(Throwable throwable) {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Fallback response\"<\/span>;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird ein REST-Aufruf mit einem Circuit Breaker gesch\u00fctzt. Wenn der Aufruf fehlschl\u00e4gt, wird die <code>fallback<\/code> Methode aufgerufen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Die Resilience4j-Bibliothek bietet eine leistungsf\u00e4hige und flexible M\u00f6glichkeit, das Circuit Breaker Muster in Java-Anwendungen zu implementieren. Durch die Verwendung von Resilience4j k\u00f6nnen Entwickler die Resilienz ihrer Anwendungen erheblich verbessern und die Auswirkungen von Fehlern und Ausf\u00e4llen minimieren. Mit einer Vielzahl von Konfigurationsm\u00f6glichkeiten und der einfachen Integration in Spring Boot ist Resilience4j eine ausgezeichnete Wahl f\u00fcr die Implementierung von Resilienzmustern in modernen Java-Anwendungen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung In der modernen Softwareentwicklung ist die Zuverl\u00e4ssigkeit von Anwendungen von entscheidender Bedeutung. Mikroservices-Architekturen und verteilte Systeme sind sehr popul\u00e4r geworden, was jedoch auch Herausforderungen mit sich bringt, insbesondere bei der Handhabung von Fehlern und der Resilienz von Anwendungen. Eine der Techniken zur Verbesserung der Resilienz ist das Circuit Breaker Muster. Resilience4j ist eine leichtgewichtige, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-plain_java","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=472"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions"}],"predecessor-version":[{"id":473,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/472\/revisions\/473"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}