{"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\/nl\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Microservices with communication through Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In deze eenvoudige tutorial maken we een paar microservices met Spring Boot en organiseren we de interactie tussen hen via het Axon-framework.<\/p>\n<p><img decoding=\"async\" alt=\"Microservices with communication through 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>Laten we aannemen dat we de volgende taak hebben.<\/i><\/p>\n<p>Er is een bron van transacties op de aandelenmarkt. Deze bron geeft ons transacties door via een Rest-interface. <\/p>\n<p>We moeten deze transacties ophalen, opslaan in een database en een handig in-memory opslag maken. <\/p>\n<p>Deze opslag moet de volgende functies vervullen:<\/p>\n<ul>\n<li> een lijst van trades teruggeven;<\/li>\n<li> de volledige positie teruggeven, d.w.z. een tabel met 'instrument' \u2014 'huidige hoeveelheid papieren';<\/li>\n<li> de positie teruggeven voor een gegeven instrument.<\/li>\n<\/ul>\n<p>\n<i>Hoe benaderen we deze taak? <\/i><\/p>\n<p>Volgens de principes van microservice-architectuur moeten we de taak opsplitsen in de samenstellende microservices:<\/p>\n<ul>\n<li> ontvangst van transacties via Rest;<\/li>\n<li> opslag van transacties in de database;<\/li>\n<li> in-memory opslag voor het presenteren van gegevens over de positie.<\/li>\n<\/ul>\n<p>\nLaten we in het kader van deze tutorial de eerste en de derde service maken, de tweede bewaren voor het tweede deel (laat het in de opmerkingen weten als dit interessant is).<\/p>\n<p>Dus, we hebben twee microservices. <\/p>\n<p>De eerste ontvangt gegevens van buitenaf. <\/p>\n<p>De tweede verwerkt deze gegevens en reageert op binnenkomende verzoeken. <\/p>\n<p>We willen natuurlijk horizontale schaalbaarheid, ononderbroken updates en andere voordelen van microservices.<\/p>\n<p><i>Welke, niet al te gemakkelijke, taak staat er voor ons?<\/i><\/p>\n<p>Eigenlijk zijn er veel, maar laten we nu praten over hoe de gegevens tussen deze microservices zullen stromen. Tussen hen kan ook een Rest worden gemaakt, er kan een wachtrij worden ingesteld, er zijn veel mogelijkheden met hun voor- en nadelen.<\/p>\n<p>Laten we een van de mogelijke benaderingen overwegen - asynchrone interactie via <b>het Axon-framework<\/b>.<\/p>\n<p><i>Wat zijn de voordelen van deze oplossing?<\/i><\/p>\n<p>Ten eerste vergroot asynchrone interactie de flexibiliteit (ja, er is ook een nadeel, maar we hebben het voorlopig alleen over de voordelen). <\/p>\n<p>Ten tweede krijgen we direct uit de doos <b>Event Sourcing<\/b> en <b>CQRS<\/b>. <br \/>\nTen derde biedt Axon kant-en-klare infrastructuur, zodat we ons alleen op de ontwikkeling van de businesslogica hoeven te concentreren.<\/p>\n<p>Laten we beginnen.<\/p>\n<p>Ons project zal op Gradle zijn. Het zal drie modules bevatten: <\/p>\n<ul>\n<li> common. een module met gemeenschappelijke datastructuren (we houden niet van kopi\u00ebren en plakken);<\/li>\n<li> tradeCreator. een module met een microservice voor het ontvangen van transacties via Rest;<\/li>\n<li> tradeQueries. een module met een microservice voor het weergeven van de positie.<\/li>\n<\/ul>\n<p>\nLaten we Spring Boot als basis nemen en de Axon-starter aansluiten.<\/p>\n<p>Axon werkt uitstekend zonder Spring, maar we gaan ze samen gebruiken.<\/p>\n<p>Hier moeten we even stoppen en een paar woorden over Axon zeggen. <\/p>\n<p>Het is een client-server systeem. Er is een server \u2013 dat is een aparte applicatie, die we in Docker gaan draaien. <\/p>\n<p>En er zijn clients die in microservices worden ge\u00efntegreerd. <br \/>\nZo ziet het eruit. Eerst wordt de Axon-server (in Docker) gestart, daarna onze microservices. <\/p>\n<p>Bij het opstarten zoeken de microservices de server en beginnen ze met interactie. De interactie kan grofweg in twee soorten worden verdeeld: technisch en zakelijk. <\/p>\n<p>Technisch is het uitwisselen van berichten zoals 'ik ben alive' (zo'n bericht kan in debug-logmodus worden gezien). <\/p>\n<p>Zakelijk is de uitwisseling van berichten zoals 'nieuwe deal'.<\/p>\n<p>Een belangrijk kenmerk is dat, na de start, microservices de Axon-server kunnen vragen 'wat is er gebeurd', en de server geeft de microservice de verzamelde gebeurtenissen door. Daardoor kan een microservice relatief veilig opnieuw worden opgestart zonder gegevensverlies. <br \/>\nMet deze uitwisselingsstructuur kunnen we heel eenvoudig veel exemplaren van microservices opstarten, <br \/>\nzelfs op verschillende hosts.<\/p>\n<p>Ja, \u00e9\u00e9n exemplaar van de Axon-server is niet betrouwbaar, maar voorlopig is het zo.<\/p>\n<p>We werken binnen de paradigma's Event Sourcing en CQRS. Dit betekent dat we 'commando's', 'gebeurtenissen' en 'lezers' moeten hebben. <\/p>\n<p>We zullen \u00e9\u00e9n commando hebben: 'maak deal aan', \u00e9\u00e9n gebeurtenis 'deal is aangemaakt', en drie lezers: 'toon alle deals', 'toon positie', 'toon positie per instrument'.<\/p>\n<p>De werkwijze ziet er als volgt uit: <\/p>\n<ol>\n<li> De microservice tradeCreator accepteert een deal via Rest.<\/li>\n<li> De microservice tradeCreator maakt een commando 'maak deal aan' en stuurt dit naar de Axon-server.<\/li>\n<li> De Axon-server ontvangt het commando en stuurt het door naar de belanghebbende ontvanger, in ons geval is dat de microservice tradeCreator.<\/li>\n<li> De microservice tradeCreator ontvangt het commando, vormt de gebeurtenis 'deal is aangemaakt' en stuurt deze naar de Axon-server.<\/li>\n<li> De Axon-server ontvangt de gebeurtenis en stuurt deze door naar de belanghebbende abonnees.<\/li>\n<li> Momenteel hebben we slechts \u00e9\u00e9n belanghebbende ontvanger \u2013 dat is de microservice tradeQueries.<\/li>\n<li> De microservice tradeQueries ontvangt de gebeurtenis en werkt de interne gegevens bij.<\/li>\n<\/ol>\n<p>\n(Belangrijk is dat op het moment van de vorming van de gebeurtenis de microservice tradeQueries mogelijk niet beschikbaar is, maar zodra deze opstart, ontvangt het direct de gebeurtenis).<\/p>\n<p>Ja, de axon-server staat in het centrum van de communicatie, alle berichten gaan via hem.<\/p>\n<p><i>Laten we beginnen met coderen.<\/i><\/p>\n<p>Om de post niet met code te overbelasten, geef ik hieronder alleen fragmenten, de link naar het volledige voorbeeld volgt hieronder.<\/p>\n<p>Laten we beginnen met de algemene module common.<\/p>\n<p>De gemeenschappelijke delen hierin zijn een gebeurtenis (class CreatedTradeEvent). Let op de naamgeving, dit is in wezen de naam van het commando dat deze gebeurtenis heeft veroorzaakt, maar in de verleden tijd. In de verleden tijd, omdat eerst het commando verschijnt dat leidt tot de creatie van de gebeurtenis.<\/p>\n<p>Andere gemeenschappelijke structuren zijn klassen voor het beschrijven van een positie (class Position), een transactie (class Trade) en de kant van de transactie (enum Side), dat wil zeggen, kopen of verkopen.<\/p>\n<p>Laten we overgaan naar de module tradeCreator. <\/p>\n<p>Deze module heeft een Rest-interface (class TradeController) voor het ontvangen van transacties. <br \/>\nVan de ontvangen transactie wordt een \u2018cre\u00eber transactie\u2019-commando gevormd en naar de axon-server gestuurd.<\/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>\nVoor het verwerken van het commando wordt de class TradeAggregate gebruikt. <br \/>\nOm ervoor te zorgen dat Axon het vindt, plaatsen we de annotatie @Aggregate.<br \/>\nDe methode voor het verwerken van het commando ziet er als volgt uit (afgekort):<\/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>\nVan het commando wordt een gebeurtenis gevormd en naar de server gestuurd.<br \/>\nHet commando bevindt zich in de class CreateTradeCommand.<\/p>\n<p>Laten we nu kijken naar de laatste module tradeQueries.<\/p>\n<p>De queries worden beschreven in het pakket queries.<br \/>\nIn deze module is er ook een Rest-interface.<br \/>\npublic class TradeController.<\/p>\n<p>Voor het voorbeeld bekijken we de verwerking van het verzoek: \u2018toon alle transacties\u2019.<\/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>\nEr wordt een verzoek voor een selectie aangemaakt en naar de server gestuurd.<\/p>\n<p>Voor het verwerken van het selectieverzoek wordt de class TradesEventHandler gebruikt.<br \/>\nHierin is er een methode, gemarkeerd met de annotatie.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nHij is verantwoordelijk voor het ophalen van gegevens uit de in-memory opslag.<\/p>\n<p>De vraag rijst hoe in deze opslag de informatie wordt bijgewerkt. <\/p>\n<p>Laten we beginnen met het feit dat dit gewoon een verzameling ConcurrentHashMap's is, afgestemd op specifieke selecties. <br \/>\nVoor hun bijwerking wordt de methode toegepast:<\/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>\nHet verwerkt het 'handelscreatie'-evenement en werkt de Maps bij.<\/p>\n<p>Dit zijn de belangrijkste punten van de ontwikkeling van microservices.<\/p>\n<p><i>Wat kunnen we zeggen over de nadelen van Axon?<\/i><\/p>\n<p>Ten eerste, het compliceert de infrastructuur en introduceert een faalpunt - de Axon-server, alle communicatie verloopt via hem. <\/p>\n<p>Ten tweede, het nadeel van dergelijke gedistribueerde systemen wordt sterk zichtbaar - tijdelijke inconsistentie van gegevens. In ons geval kan er onacceptabel veel tijd verstrijken tussen het ontvangen van een nieuwe handel en het bijwerken van de gegevens voor de selecties.<\/p>\n<p><i>Wat is er achter de schermen gebleven?<\/i><\/p>\n<p>Er is helemaal niets gezegd over Event Sourcing en CQRS, wat het is en waarvoor het nodig is.<br \/>\nZonder uitleg van deze concepten zouden sommige punten mogelijk onduidelijk zijn.<\/p>\n<p>Wellicht hebben ook bepaalde fragmenten van de code uitleg nodig.<\/p>\n<p>Hierover gaan we het hebben tijdens <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">een open webinar<\/a><\/noindex> op 21 september.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Volledige voorbeeld<\/a><\/noindex>.<br \/>\n<br \/>Bron: <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.4 - 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\/nl\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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 met communicatie via Axon | ProHoster","description":"In deze eenvoudige tutorial maken we een paar microservices met Spring Boot en organiseren we de interactie tussen hen via het Axon-framework.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}