{"id":94393,"date":"2020-09-16T07:43:43","date_gmt":"2020-09-16T05:43:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon"},"modified":"2020-09-16T07:43:43","modified_gmt":"2020-09-16T05:43:43","slug":"mikroservisy-s-kommunikacziej-cherez-axon","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Mikroservices mit Kommunikation \u00fcber Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In diesem einfachen Tutorial erstellen wir ein paar Mikrodienste mit Spring Boot und organisieren die Interaktion zwischen ihnen \u00fcber das Axon-Framework.<\/p>\n<p><img decoding=\"async\" alt=\"Mikroservices mit Kommunikation \u00fcber Axon\" src=\"\/wp-content\/uploads\/2020\/09\/d570cdb88653309c2f5b382509e5c2a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<i>Angenommen, wir haben folgende Aufgabe.<\/i><\/p>\n<p>Es gibt eine Quelle f\u00fcr Transaktionen an der B\u00f6rse. Diese Quelle \u00fcbertr\u00e4gt uns Transaktionen \u00fcber eine REST-Schnittstelle. <\/p>\n<p>Wir m\u00fcssen diese Transaktionen abrufen, in einer Datenbank speichern und einen bequemen In-Memory-Speicher erstellen. <\/p>\n<p>Dieser Speicher sollte folgende Funktionen erf\u00fcllen:<\/p>\n<ul>\n<li> eine Liste von Trades zur\u00fcckgeben;<\/li>\n<li> die vollst\u00e4ndige Position zur\u00fcckgeben, d.h. eine Tabelle \u201eInstrument\u201c \u2014 \u201eaktueller Bestand\u201c;<\/li>\n<li> die Position f\u00fcr ein bestimmtes Instrument zur\u00fcckgeben.<\/li>\n<\/ul>\n<p>\n<i>Wie gehen wir an diese Aufgabe heran? <\/i><\/p>\n<p>Entsprechend den Prinzipien der Mikrodienstarchitektur m\u00fcssen wir die Aufgabe in separate Mikrodienste unterteilen:<\/p>\n<ul>\n<li> Abrufen der Transaktion \u00fcber REST;<\/li>\n<li> Speichern der Transaktion in der Datenbank;<\/li>\n<li> In-Memory-Speicher zur Darstellung der Daten zur Position.<\/li>\n<\/ul>\n<p>\nLass uns im Rahmen dieses Tutorials den ersten und dritten Dienst erstellen, den zweiten lassen wir f\u00fcr den zweiten Teil (schreib in die Kommentare, wenn das interessant ist).<\/p>\n<p>Also, wir haben zwei Mikrodienste. <\/p>\n<p>Der erste erh\u00e4lt Daten von au\u00dfen. <\/p>\n<p>Der zweite verarbeitet diese Daten und antwortet auf eingehende Anfragen. <\/p>\n<p>Wir m\u00f6chten nat\u00fcrlich horizontale Skalierung, unterbrechungsfreies Update und andere Vorteile von Mikrodiensten erhalten.<\/p>\n<p><i>Welche, durchaus anspruchsvolle, Aufgabe steht uns bevor?<\/i><\/p>\n<p>Es gibt viele, aber lass uns jetzt dar\u00fcber sprechen, wie die Daten zwischen diesen Mikrodiensten flie\u00dfen werden. Zwischen ihnen kann man auch REST machen, man kann eine Warteschlange einrichten, es gibt viele M\u00f6glichkeiten mit ihren Vor- und Nachteilen.<\/p>\n<p>Lass uns einen der m\u00f6glichen Ans\u00e4tze betrachten \u2013 asynchrone Interaktion \u00fcber <b>das Axon-Framework<\/b>.<\/p>\n<p><i>Welche Vorteile bietet diese L\u00f6sung?<\/i><\/p>\n<p>Erstens, asynchrone Interaktion erh\u00f6ht die Flexibilit\u00e4t (ja, es gibt hier auch einen Nachteil, aber wir sprechen hier vorerst nur \u00fcber die Vorteile). <\/p>\n<p>Zweitens, wir erhalten direkt out of the box <b>Event Sourcing<\/b> und <b>CQRS<\/b>. <br \/>\nDrittens, Axon bietet eine fertige Infrastruktur, sodass wir uns nur auf die Entwicklung der Gesch\u00e4ftslogik konzentrieren m\u00fcssen.<\/p>\n<p>Legen wir los.<\/p>\n<p>Unser Projekt wird mit Gradle sein. Es wird drei Module geben: <\/p>\n<ul>\n<li> common. Modul mit gemeinsamen Datenstrukturen (wir m\u00f6gen kein Kopieren);<\/li>\n<li> tradeCreator. Modul mit diesem Mikrodienst zur Annahme von Transaktionen \u00fcber REST;<\/li>\n<li> tradeQueries. Modul mit dem Mikrodienst zur Anzeige der Position.<\/li>\n<\/ul>\n<p>\nWir nehmen Spring Boot als Grundlage und verbinden den Axon-Starter.<\/p>\n<p>Axon funktioniert hervorragend auch ohne Spring, aber wir werden sie gemeinsam nutzen.<\/p>\n<p>Hier m\u00fcssen wir innehalten und ein paar Worte \u00fcber Axon sagen. <\/p>\n<p>Es handelt sich um ein Client-Server-System. Es gibt einen Server \u2013 das ist eine separate Anwendung, die wir in Docker ausf\u00fchren werden. <\/p>\n<p>Und es gibt Clients, die in Mikrodienste integriert sind. <br \/>\nSo ergibt sich folgendes Bild: Zuerst wird der Axon-Server (in Docker) gestartet, dann unsere Mikrodienste. <\/p>\n<p>Beim Start suchen die Mikrodienste den Server und beginnen, mit ihm zu interagieren. Diese Interaktion l\u00e4sst sich grob in zwei Arten unterteilen: technische und gesch\u00e4ftliche. <\/p>\n<p>Technisch ist das der Austausch von Nachrichten wie \u201eIch bin am Leben\u201c (solche Nachrichten sind im Debug-Logging sichtbar). <\/p>\n<p>Gesch\u00e4ftlich sind das Nachrichten wie \u201eneuer Deal\u201c.<\/p>\n<p>Eine wichtige Besonderheit ist, dass nach dem Start der Mikrodienst den Axon-Server fragen kann: \u201eWas ist passiert?\u201c, und der Server \u00fcbertr\u00e4gt die gesammelten Ereignisse an den Mikrodienst. So kann der Mikrodienst relativ sicher neu gestartet werden, ohne dass Daten verloren gehen. <br \/>\nBei diesem Austauschschema k\u00f6nnen wir sehr einfach viele Instanzen von Mikrodiensten starten, <br \/>\nund zwar auf unterschiedlichen Hosts.<\/p>\n<p>Ja, eine Instanz des Axon-Servers ist nicht zuverl\u00e4ssig, aber vorerst ist es so.<\/p>\n<p>Wir arbeiten in den Paradigmen Event Sourcing und CQRS. Das bedeutet, dass wir \u201eBefehle\u201c, \u201eEreignisse\u201c und \u201eAbfragen\u201c haben m\u00fcssen. <\/p>\n<p>Wir werden einen Befehl haben: \u201eDeal erstellen\u201c, ein Ereignis \u201eDeal erstellt\u201c und drei Abfragen: \u201ealle Deals anzeigen\u201c, \u201ePosition anzeigen\u201c, \u201ePosition nach Instrument anzeigen\u201c.<\/p>\n<p>Das Arbeitschema sieht folgenderma\u00dfen aus: <\/p>\n<ol>\n<li> Der Mikrodienst tradeCreator empf\u00e4ngt einen Deal \u00fcber Rest.<\/li>\n<li> Der Mikrodienst tradeCreator erstellt den Befehl \u201eDeal erstellen\u201c und sendet ihn an den Axon-Server.<\/li>\n<li> Der Axon-Server empf\u00e4ngt den Befehl und leitet ihn an den interessierten Empf\u00e4nger weiter, in unserem Fall ist das der Mikrodienst tradeCreator.<\/li>\n<li> Der Mikrodienst tradeCreator erh\u00e4lt den Befehl, formt das Ereignis \u201eDeal erstellt\u201c und sendet es an den Axon-Server.<\/li>\n<li> Der Axon-Server nimmt das Ereignis an und leitet es an die interessierten Abonnenten weiter.<\/li>\n<li> Derzeit haben wir nur einen interessierten Empf\u00e4nger \u2013 das ist der Mikrodienst tradeQueries.<\/li>\n<li> Der Mikrodienst tradeQueries empf\u00e4ngt das Ereignis und aktualisiert die internen Daten.<\/li>\n<\/ol>\n<p>\n(Es ist wichtig, dass der Mikrodienst tradeQueries zum Zeitpunkt der Erstellung des Ereignisses m\u00f6glicherweise nicht verf\u00fcgbar ist, aber sobald er gestartet wird, erh\u00e4lt er sofort das Ereignis).<\/p>\n<p>Ja, der Axon-Server steht im Zentrum der Kommunikation, alle Nachrichten gehen durch ihn.<\/p>\n<p><i>Lass uns mit dem Codieren beginnen.<\/i><\/p>\n<p>Um den Beitrag nicht mit Code zu \u00fcberladen, werde ich unten nur Fragmente anf\u00fchren, ein Link zum vollst\u00e4ndigen Beispiel wird weiter unten sein.<\/p>\n<p>Beginnen wir mit dem allgemeinen Modul common.<\/p>\n<p>In ihm sind die allgemeinen Teile \u2013 es handelt sich um ein Ereignis (class CreatedTradeEvent). Beachte den Namen, es ist eigentlich der Name des Befehls, der dieses Ereignis ausgel\u00f6st hat, aber im vergangenen Zustand. Im vergangenen, da zuerst der Befehl auftritt, der zur Erstellung des Ereignisses f\u00fchrt.<\/p>\n<p>Zu den anderen allgemeinen Strukturen geh\u00f6ren Klassen zur Beschreibung der Position (class Position), des Handels (class Trade) und der Handelsseite (enum Side), d.h. Kauf oder Verkauf.<\/p>\n<p>Kommen wir zum Modul tradeCreator. <\/p>\n<p>Dieses Modul hat eine Rest-Schnittstelle (class TradeController) zur Annahme von Handelsauftr\u00e4gen. <br \/>\nAus dem erhaltenen Handel wird der Befehl \u201eHandel erstellen\u201c gebildet und an den Axon-Server gesendet.<\/p>\n<pre><code class=\"java\">    @PostMapping(\"\/trade\")\n    public ResponseEntity create(@RequestBody Trade trade) {\n        var createTradeCommand = CreateTradeCommand.builder()\n                .tradeId(trade.getTradeId())\n\t...\n                .build();\n        var result = commandGateway.sendAndWait(createTradeCommand, 3, TimeUnit.SECONDS);\n        return ResponseEntity.ok(result.get().toString());\n    }\n<\/code><\/pre>\n<p>\nZur Verarbeitung des Befehls wird die Klasse class TradeAggregate verwendet. <br \/>\nDamit Axon ihn findet, f\u00fcgen wir die Annotation @Aggregate hinzu.<br \/>\nDie Methode zur Verarbeitung des Befehls sieht so aus (verk\u00fcrzt):<\/p>\n<pre><code class=\"java\">    @CommandHandler\n    public TradeAggregate(CreateTradeCommand command) {\n        log.info(\"command: {}\", command);\n        var event = CreatedTradeEvent.builder()\n                .tradeId(command.tradeId())\n\t\t....\n                .build();\n        AggregateLifecycle.apply(event);\n    }\n<\/code><\/pre>\n<p>\nAus dem Befehl wird ein Ereignis gebildet und an den Server gesendet.<br \/>\nDer Befehl befindet sich in der Klasse CreateTradeCommand.<\/p>\n<p>Jetzt schauen wir uns das letzte Modul tradeQueries an.<\/p>\n<p>Die Abfragen werden im Paket queries beschrieben.<br \/>\nIn diesem Modul gibt es ebenfalls eine Rest-Schnittstelle.<br \/>\npublic class TradeController.<\/p>\n<p>Als Beispiel betrachten wir die Verarbeitung der Anfrage: \u201eAlle Handelsauftr\u00e4ge anzeigen\u201c.<\/p>\n<pre><code class=\"java\">    @GetMapping(\"\/trade\/all\")\n    public List findAllTrades() {\n        return queryGateway.query(new FindAllTradesQuery(),\n                ResponseTypes.multipleInstancesOf(Trade.class)).join();\n    }\n<\/code><\/pre>\n<p>\nEs wird eine Anfrage zur Abfrage erstellt und an den Server gesendet.<\/p>\n<p>Zur Verarbeitung der Abfrage verwendet man die Klasse TradesEventHandler.<br \/>\nDiese enth\u00e4lt eine Methode, die mit der Annotation gekennzeichnet ist.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nDiese ist verantwortlich f\u00fcr die Abfrage von Daten aus dem In-Memory-Speicher.<\/p>\n<p>Die Frage stellt sich, wie in diesem Speicher die Informationen aktualisiert werden. <\/p>\n<p>Beginnen wir damit, dass es sich einfach um eine Sammlung von ConcurrentHashMap handelt, die auf bestimmte Abfragen ausgelegt ist. <br \/>\nZur Aktualisierung werden folgende Methoden verwendet:<\/p>\n<pre><code class=\"java\">    @EventHandler\n    public void on(CreatedTradeEvent event) {\n        log.info(\"event:{}\", event);\n\n        var trade = Trade.builder()\n\t...\n                .build();\n        trades.put(event.tradeId(), trade);\n        position.merge(event.shortName(), event.size(),\n                (oldValue, value) -&gt; event.side() == Side.BUY ? oldValue + value : oldValue - value);\n    }<\/code><\/pre>\n<p>\nEr empf\u00e4ngt das Ereignis \u201eHandel erstellt\u201c und aktualisiert die Maps.<\/p>\n<p>Das sind die wichtigsten Aspekte der Entwicklung von Mikrodiensten.<\/p>\n<p><i>Was kann man \u00fcber die Nachteile von Axon sagen?<\/i><\/p>\n<p>Erstens, es wird eine komplexere Infrastruktur notwendig, und es gibt einen Single Point of Failure \u2013 den Axon-Server, alle Kommunikationen laufen \u00fcber ihn. <\/p>\n<p>Zweitens wird der Nachteil solcher verteilten Systeme deutlich \u2013 die vor\u00fcbergehende Inkonsistenz der Daten. In unserem Fall kann zwischen dem Empfang eines neuen Handels und der Aktualisierung der Daten f\u00fcr die Abfragen unangemessen viel Zeit vergehen.<\/p>\n<p><i>Was blieb im Hintergrund?<\/i><\/p>\n<p>Es wurde nichts \u00fcber Event Sourcing und CQRS gesagt, was es ist und wof\u00fcr es ben\u00f6tigt wird.<br \/>\nOhne die Kl\u00e4rung dieser Begriffe k\u00f6nnten einige Punkte unverst\u00e4ndlich geblieben sein.<\/p>\n<p>Es ist m\u00f6glich, dass auch einzelne Codefragmente Erkl\u00e4rungen erfordern.<\/p>\n<p>Dar\u00fcber werden wir bei dem <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">offenen Webinar<\/a><\/noindex> am 21. September sprechen.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Ein vollst\u00e4ndiges Beispiel<\/a><\/noindex>.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/519144\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Spring Boot \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Axon. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0415\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0434\u0435\u043b\u043e\u043a \u043d\u0430 \u0444\u043e\u043d\u0434\u043e\u0432\u043e\u043c \u0440\u044b\u043d\u043a\u0435. \u042d\u0442\u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u043a\u0438 \u043f\u043e Rest-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u044d\u0442\u0438 \u0441\u0434\u0435\u043b\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0435 in-memory \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u042d\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":94394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-94393","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 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Spring Boot \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Axon.\" \/>\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\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\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\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 Axon | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Spring Boot \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Axon.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\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-09-16T05:43:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-16T05:43:43+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\udd47Mikrodienste mit Kommunikation \u00fcber Axon | ProHoster","description":"In diesem einfachen Tutorial erstellen wir ein paar Mikrodienste mit Spring Boot und organisieren die Interaktion zwischen ihnen \u00fcber das Axon-Framework.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","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\u041c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 Axon | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Spring Boot \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Axon.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","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-09-16T05:43:43+00:00","article:modified_time":"2020-09-16T05:43:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"94393","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 11:27:34","updated":"2022-10-02 06:08:26","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\/94393","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=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}