{"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 Gesch\u00e4fte am Aktienmarkt. Diese Quelle \u00fcbertr\u00e4gt uns Transaktionen \u00fcber eine REST-Schnittstelle. <\/p>\n<p>Wir m\u00fcssen diese Transaktionen abrufen, in einer Datenbank speichern und ein benutzerfreundliches In-Memory-Speicher bereitstellen. <\/p>\n<p>Dieses Speichersystem sollte folgende Funktionen erf\u00fcllen:<\/p>\n<ul>\n<li> eine Liste der Trades zur\u00fcckgeben;<\/li>\n<li> die vollst\u00e4ndige Position zur\u00fcckgeben, d.h. eine Tabelle \u00abInstrument\u00bb \u2014 \u00abaktuelle Anzahl an Aktien\u00bb;<\/li>\n<li> die Position f\u00fcr ein bestimmtes Instrument zur\u00fcckgeben.<\/li>\n<\/ul>\n<p>\n<i>Wie n\u00e4hern wir uns der L\u00f6sung dieses Problems? <\/i><\/p>\n<p>Nach den Geboten der Mikrodienstemode m\u00fcssen wir die Aufgabe in die entsprechenden Mikrodienste aufteilen:<\/p>\n<ul>\n<li> das Abrufen eines Trades \u00fcber REST;<\/li>\n<li> das Speichern des Trades 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 den dritten Dienst erstellen, den zweiten lassen wir f\u00fcr den zweiten Teil (schreibt 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 beantwortet die eingehenden Anfragen. <\/p>\n<p>Wir m\u00f6chten nat\u00fcrlich horizontale Skalierung, unterbrechungsfreies Update und die anderen Vorteile von Mikrodiensten erreichen.<\/p>\n<p><i>Welche, durchaus komplexe, Aufgabe steht uns bevor?<\/i><\/p>\n<p>Tats\u00e4chlich gibt es viele, aber lassen Sie uns jetzt dar\u00fcber sprechen, wie die Daten zwischen diesen Mikrodiensten ausgetauscht werden. Es ist m\u00f6glich, REST zu implementieren, eine Warteschlange einzurichten, oder viele andere L\u00f6sungen mit ihren eigenen Vor- und Nachteilen zu finden.<\/p>\n<p>Betrachten wir einen m\u00f6glichen Ansatz \u2013 asynchronen Austausch \u00fcber <b>das Axon-Framework.<\/b>.<\/p>\n<p><i>Welche Vorteile hat diese L\u00f6sung?<\/i><\/p>\n<p>Erstens erh\u00f6ht der asynchrone Austausch die Flexibilit\u00e4t (ja, hier gibt es auch einen Nachteil, aber wir sprechen bisher nur \u00fcber die Vorteile). <\/p>\n<p>Zweitens erhalten wir sofort einsatzbereite Funktionen. <b>Event Sourcing<\/b> und <b>CQRS<\/b>. <br \/>\nDrittens bietet Axon eine fertige Infrastruktur, sodass wir uns ausschlie\u00dflich auf die Entwicklung der Gesch\u00e4ftslogik konzentrieren k\u00f6nnen.<\/p>\n<p>Legen wir los.<\/p>\n<p>Unser Projekt wird auf Gradle basieren. Es wird drei Module geben: <\/p>\n<ul>\n<li> common. ein Modul mit gemeinsamen Datenstrukturen (wir m\u00f6gen kein Copy-Paste);<\/li>\n<li> tradeCreator. ein Modul mit einem Mikrodienst zur Annahme von Transaktionen \u00fcber REST;<\/li>\n<li> tradeQueries. ein Modul mit einem Mikrodienst zur Anzeige der Position.<\/li>\n<\/ul>\n<p>\nWir nehmen Spring Boot als Grundlage und f\u00fcgen den Axon-Starter hinzu.<\/p>\n<p>Axon funktioniert hervorragend auch ohne Spring, aber wir werden sie gemeinsam verwenden.<\/p>\n<p>Hier sollten wir innehalten und ein paar Worte \u00fcber Axon verlieren. <\/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 sich in die Mikrodienste integrieren. <br \/>\nSo sieht das Bild aus: Zuerst wird der Axon-Server (in Docker) gestartet, danach unsere Mikrodienste. <\/p>\n<p>Beim Start suchen die Mikrodienste den Server und beginnen mit ihm zu interagieren. Die Interaktion l\u00e4sst sich grob in zwei Arten unterteilen: technisch und gesch\u00e4ftlich. <\/p>\n<p>Technisch \u2013 das ist der Austausch von Nachrichten wie \u201eIch bin da\u201c (solche Nachrichten k\u00f6nnen im Debug-Logging-Modus gesehen werden). <\/p>\n<p>Gesch\u00e4ftlich \u2013 das sind Nachrichten wie \u201eneuer Deal\u201c.<\/p>\n<p>Ein wichtiger Aspekt 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 Daten zu verlieren. <br \/>\nBei diesem Schema k\u00f6nnen wir sehr einfach viele Instanzen von Mikrodiensten starten, <br \/>\nund das auf verschiedenen Hosts.<\/p>\n<p>Ja, eine Instanz des Axon-Servers \u2013 das ist nicht zuverl\u00e4ssig, aber momentan ist es so.<\/p>\n<p>Wir arbeiten mit 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> Mikroservice tradeCreator nimmt den Deal \u00fcber Rest entgegen.<\/li>\n<li> Mikroservice 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 den Mikroservice tradeCreator.<\/li>\n<li> Mikroservice tradeCreator erh\u00e4lt den Befehl, formuliert das Ereignis \u201eDeal erstellt\u201c und sendet es an den Axon-Server.<\/li>\n<li> Der Axon-Server empf\u00e4ngt das Ereignis und leitet es an die interessierten Abonnenten weiter.<\/li>\n<li> Derzeit haben wir nur einen interessierten Empf\u00e4nger \u2013 das ist der Mikroservice tradeQueries.<\/li>\n<li> Mikroservice tradeQueries erh\u00e4lt das Ereignis und aktualisiert die internen Daten.<\/li>\n<\/ol>\n<p>\n(Es ist wichtig, dass zum Zeitpunkt der Ereigniserstellung der Mikroservice tradeQueries 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 laufen \u00fcber ihn.<\/p>\n<p><i>Lass uns mit dem Codieren beginnen.<\/i><\/p>\n<p>Um den Beitrag nicht mit Code zu \u00fcberlasten, werde ich unten nur Ausschnitte anf\u00fchren; der Link zum vollst\u00e4ndigen Beispiel wird weiter unten sein.<\/p>\n<p>Beginnen wir mit dem gemeinsamen Modul common.<\/p>\n<p>In ihm sind die gemeinsamen Teile \u2013 dieses Ereignis (class CreatedTradeEvent). Beachte die Benennung: Es handelt sich im Grunde um den Namen des Befehls, der dieses Ereignis ausgel\u00f6st hat, allerdings in der Vergangenheit. In der Vergangenheit, weil zuerst der Befehl erscheint, der zur Erstellung des Ereignisses f\u00fchrt.<\/p>\n<p>Zu den anderen gemeinsamen Strukturen geh\u00f6ren die 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) zum Empfang von Auftr\u00e4gen. <br \/>\nAus dem erhaltenen Auftrag wird der Befehl \u201eHandel erstellen\u201c formuliert 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>\nZum Verarbeiten des Befehls wird die Klasse class TradeAggregate verwendet. <br \/>\nUm Axon zu erm\u00f6glichen, sie zu finden, f\u00fcgen wir die Annotation @Aggregate hinzu.<br \/>\nDie Methode zur Verarbeitung des Kommandos sieht folgenderma\u00dfen 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 Kommando wird ein Ereignis erstellt und an den Server gesendet.<br \/>\nDas Kommando 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 auch ein REST-Interface.<br \/>\npublic class TradeController.<\/p>\n<p>Zum Beispiel betrachten wir die Verarbeitung der Anfrage: \u201ezeige alle Gesch\u00e4fte\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 Abfrage f\u00fcr die Auswahl erstellt und an den Server gesendet.<\/p>\n<p>Zur Verarbeitung der Abfrage wird die Klasse TradesEventHandler verwendet.<br \/>\nDarin gibt es eine Methode, die mit einer Annotation versehen ist.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nDiese ist f\u00fcr die Auswahl der Daten aus dem In-Memory-Speicher verantwortlich.<\/p>\n<p>Es stellt sich die Frage, wie die Informationen in diesem Speicher aktualisiert werden. <\/p>\n<p>Zun\u00e4chst einmal handelt es sich um eine Sammlung von ConcurrentHashMap, die auf bestimmte Abfragen optimiert sind. <br \/>\nZur Aktualisierung wird folgende Methode 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 Hauptpunkte in der Entwicklung von Mikrodiensten.<\/p>\n<p><i>Was kann man \u00fcber die Nachteile von Axon sagen?<\/i><\/p>\n<p>Erstens f\u00fchrt es zu einer Komplexit\u00e4t der Infrastruktur und schafft einen Single Point of Failure \u2013 den Axon-Server. Alle Kommunikation l\u00e4uft dar\u00fcber. <\/p>\n<p>Zweitens zeigen sich deutliche Nachteile solcher verteilten Systeme \u2013 zeitliche Inkonsistenzen der Daten. In unserem Fall kann zwischen dem Erhalt eines neuen Handels und der Aktualisierung der Daten f\u00fcr Abfragen eine unzul\u00e4ssig lange Zeit vergehen.<\/p>\n<p><i>Was blieb im Hintergrund?<\/i><\/p>\n<p>Es wurde nichts \u00fcber Event Sourcing und CQRS gesagt, was das ist und wozu es dient.<br \/>\nOhne die Erl\u00e4uterung dieser Konzepte k\u00f6nnten einige Punkte unklar geblieben sein.<\/p>\n<p>M\u00f6glicherweise erfordern auch bestimmte Codefragmente eine Erkl\u00e4rung.<\/p>\n<p>Dar\u00fcber werden wir sprechen bei <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">einem offenen Webinar<\/a><\/noindex> am 21. September.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Ein komplettes 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 4.9.10 - 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. \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\" \/>\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) 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\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. \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\" \/>\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\udd47Microservices mit Kommunikation \u00fcber Axon | ProHoster","description":"In diesem einfachen Tutorial erstellen wir ein paar Microservices mit Spring Boot und organisieren die Interaktion zwischen ihnen \u00fcber das Axon-Framework. Angenommen, wir haben folgende Aufgabe: Es gibt eine Quelle f\u00fcr Handelsdaten am Aktienmarkt. Diese Quelle \u00fcbertr\u00e4gt uns die Trades \u00fcber eine REST-Schnittstelle. Wir m\u00fcssen diese Trades abrufen, in einer Datenbank speichern und ein komfortables In-Memory-Speicher erstellen. Dieses Speicher muss erf\u00fcllen","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. \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","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"},"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}]}}