{"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\/da\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Mikrotjenester med kommunikation via Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I denne enkle vejledning vil vi oprette et par mikrotjenester med Spring Boot og organisere interaktion mellem dem via Axon-rammen.<\/p>\n<p><img decoding=\"async\" alt=\"Mikrotjenester med kommunikation via 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>Lad os antage, at vi har denne opgave.<\/i><\/p>\n<p>Der er en kilde til handler p\u00e5 aktiemarkedet. Denne kilde sender os handler via et REST-interface. <\/p>\n<p>Vi skal modtage disse handler, gemme dem i en database og oprette et praktisk in-memory lager. <\/p>\n<p>Dette lager skal udf\u00f8re f\u00f8lgende funktioner:<\/p>\n<ul>\n<li> returnere en liste over handler;<\/li>\n<li> returnere den samlede position, dvs. tabellen \"instrument\" \u2014 \"aktuel antal papirer\";<\/li>\n<li> returnere positionen for et givet instrument.<\/li>\n<\/ul>\n<p>\n<i>Hvordan vil vi tage fat p\u00e5 denne opgave? <\/i><\/p>\n<p>I tr\u00e5d med mikrotjenesternes mode skal vi opdele opgaven i delkomponenter:<\/p>\n<ul>\n<li> modtagelse af handler via REST;<\/li>\n<li> gemme handlerne i databasen;<\/li>\n<li> in-memory lager til at pr\u00e6sentere data om positionen.<\/li>\n<\/ul>\n<p>\nLad os i denne vejledning lave den f\u00f8rste og tredje tjeneste, den anden gemmer vi til del to (skriv i kommentarerne, hvis det er interessant).<\/p>\n<p>S\u00e5 vi har to mikrotjenester. <\/p>\n<p>Den f\u00f8rste modtager data udefra. <\/p>\n<p>Den anden behandler disse data og svarer p\u00e5 indkommende foresp\u00f8rgsler. <\/p>\n<p>Vi \u00f8nsker naturligvis at opn\u00e5 horisontal skalering, uafbrudt opdatering og andre fordele ved mikrotjenester.<\/p>\n<p><i>Hvilken ret besv\u00e6rlig opgave st\u00e5r vi overfor?<\/i><\/p>\n<p>Der er mange, men lad os nu tale om, hvordan data vil blive sendt mellem disse mikrotjenester. Der kan ogs\u00e5 etableres REST mellem dem, man kan s\u00e6tte en k\u00f8 op, eller man kan finde mange andre l\u00f8sninger med deres fordele og ulemper.<\/p>\n<p>Lad os se p\u00e5 en mulig tilgang \u2013 asynkron interaktion via <b>Axon-rammen<\/b>.<\/p>\n<p><i>Hvad er fordelene ved denne l\u00f8sning?<\/i><\/p>\n<p>For det f\u00f8rste \u00f8ger asynkron interaktion fleksibiliteten (ja, der er ogs\u00e5 en ulempe, men lad os nu kun fokusere p\u00e5 fordelene). <\/p>\n<p>For det andet f\u00e5r vi direkte ud af boksen <b>Event Sourcing<\/b> og <b>CQRS<\/b>. <br \/>\nFor det tredje leverer Axon en klar infrastruktur, og vi skal kun fokusere p\u00e5 udviklingen af forretningslogik.<\/p>\n<p>Lad os komme i gang.<\/p>\n<p>Projektet vil v\u00e6re p\u00e5 Gradle. Det vil have tre moduler: <\/p>\n<ul>\n<li> common. modul med f\u00e6lles datastukturer (vi elsker ikke copy-paste);<\/li>\n<li> tradeCreator. modul med mikrotjeneste til modtagelse af handler via REST;<\/li>\n<li> tradeQueries. modul med mikrotjeneste til visning af position.<\/li>\n<\/ul>\n<p>\nLad os tage Spring Boot som grundlag og tilslutte Axon-starteren.<\/p>\n<p>Axon fungerer fremragende uden Spring, men vi vil bruge dem sammen.<\/p>\n<p>Her b\u00f8r vi stoppe op og sige et par ord om Axon. <\/p>\n<p>Det er et klient-server system. Der er en server \u2013 det er en separat applikation, som vi vil k\u00f8re i Docker. <\/p>\n<p>Og der er klienter, der integreres i mikrotjenester. <br \/>\nDet danner et billede. F\u00f8rst starter Axon-serveren (i Docker), og derefter vores mikrotjenester. <\/p>\n<p>Ved opstart s\u00f8ger mikrotjenesterne efter serveren og begynder at interagere med den. Interaktionen kan groft opdeles i to typer: teknisk og forretningsm\u00e6ssig. <\/p>\n<p>Den tekniske interaktion er udvekslingen af meddelelser som \"jeg er live\" (s\u00e5danne meddelelser kan ses i debug-logning). <\/p>\n<p>Den forretningsm\u00e6ssige interaktion er udvekslingen af meddelelser som \"ny handel\".<\/p>\n<p>En vigtig funktion er, at efter opstart kan mikrotjenesten sp\u00f8rge Axon-serveren \"hvad skete der\", og serveren sender de akkumulerede begivenheder til mikrotjenesten. P\u00e5 den m\u00e5de kan mikrotjenesten relativt sikkert genstartes uden datatab. <br \/>\nMed denne udvekslingsmetode kan vi meget nemt k\u00f8re mange instanser af mikrotjenester, <br \/>\nselv p\u00e5 forskellige v\u00e6rter.<\/p>\n<p>Ja, en enkelt instans af Axon-serveren er ikke p\u00e5lidelig, men indtil videre m\u00e5 vi klare os med det.<\/p>\n<p>Vi arbejder i paradigmerne Event Sourcing og CQRS. Det betyder, at vi skal have \"kommandoer\", \"begivenheder\" og \"foresp\u00f8rgsler\". <\/p>\n<p>Vi vil have en kommando: \"opret handel\", \u00e9n begivenhed \"handel oprettet\", og tre foresp\u00f8rgsler: \"vis alle handler\", \"vis position\", \"vis position efter instrument\".<\/p>\n<p>Arbejdsplanen ser s\u00e5ledes ud: <\/p>\n<ol>\n<li> Mikrotjenesten tradeCreator modtager handlen via Rest.<\/li>\n<li> Mikrotjenesten tradeCreator opretter kommandoen \"opret handel\" og sender den til Axon-serveren.<\/li>\n<li> Axon-serveren modtager kommandoen og videresender den til den interesserede modtager, i vores tilf\u00e6lde mikrotjenesten tradeCreator.<\/li>\n<li> Mikrotjenesten tradeCreator modtager kommandoen, danner begivenheden \"handel oprettet\" og sender den til Axon-serveren.<\/li>\n<li> Axon-serveren modtager begivenheden og videresender den til de interesserede abonnenter.<\/li>\n<li> I \u00f8jeblikket har vi kun \u00e9n interesseret modtager \u2013 mikrotjenesten tradeQueries.<\/li>\n<li> Mikrotjenesten tradeQueries modtager begivenheden og opdaterer sine interne data.<\/li>\n<\/ol>\n<p>\n(Det er vigtigt, at mikrotjenesten tradeQueries muligvis ikke er tilg\u00e6ngelig p\u00e5 tidspunktet for dannelsen af begivenheden, men s\u00e5 snart den starter, vil den straks modtage begivenheden).<\/p>\n<p>Ja, Axon-serveren st\u00e5r i centrum for kommunikationerne, alle meddelelser g\u00e5r gennem den.<\/p>\n<p><i>Lad os g\u00e5 i gang med kodningen.<\/i><\/p>\n<p>For ikke at overbelaste indl\u00e6gget med kode, vil jeg her kun inkludere fragmenter, linket til det fulde eksempel vil v\u00e6re nedenfor.<\/p>\n<p>Vi begynder med det f\u00e6lles modul common.<\/p>\n<p>I dette modul er de f\u00e6lles elementer en begivenhed (class CreatedTradeEvent). Bem\u00e6rk navngivningen; det er i princippet navnet p\u00e5 den kommando, der skabte denne begivenhed, men i datid. I datid, fordi f\u00f8rst kommer kommandoen, som f\u00f8rer til skabelsen af begivenheden.<\/p>\n<p>Andre f\u00e6lles strukturer omfatter klasser til at beskrive positionen (class Position), handlen (class Trade) og siden i handlen (enum Side), dvs. k\u00f8b eller salg.<\/p>\n<p>Lad os g\u00e5 videre til modulet tradeCreator. <\/p>\n<p>Dette modul har et Rest-interface (class TradeController) til modtagelse af handler. <br \/>\nFra den modtagne handel dannes kommandoen \"opret handel\" og sendes til axon-serveren.<\/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>\nTil behandling af kommandoen anvendes klassen class TradeAggregate. <br \/>\nFor at Axon kan finde den, s\u00e6tter vi annotationen @Aggregate.<br \/>\nMetoden til at behandlekommandoen ser s\u00e5ledes ud (med forkortelse):<\/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>\nFra kommandoen dannes en begivenhed og sendes til serveren.<br \/>\nKommandoen findes i klassen CreateTradeCommand.<\/p>\n<p>Lad os nu se p\u00e5 det sidste modul tradeQueries.<\/p>\n<p>Uddrag beskrives i pakken queries.<br \/>\nI dette modul er der ogs\u00e5 et Rest-interface.<br \/>\npublic class TradeController.<\/p>\n<p>For eksempel, lad os se p\u00e5 behandlingen af anmodningen: \"vis alle handler\".<\/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>\nDer laves en anmodning om uddrag, som sendes til serveren.<\/p>\n<p>Til behandling af anmodningen om uddrag anvendes klassen TradesEventHandler.<br \/>\nI den findes en metode, markeret med annotationen.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nDet er netop denne, der er ansvarlig for at tr\u00e6kke data fra in-memory lageret.<\/p>\n<p>Der opst\u00e5r sp\u00f8rgsm\u00e5let, hvordan informationen opdateres i dette lager. <\/p>\n<p>Vi begynder med, at det blot er et s\u00e6t ConcurrentHashMap, tilpasset specifikke uddrag. <br \/>\nTil deres opdatering anvendes metoden:<\/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>\nHan modtager begivenheden \"handel oprettet\" og opdaterer kortene.<\/p>\n<p>Dette er hovedpunkterne i udviklingen af mikrotjenester.<\/p>\n<p><i>Hvad kan siges om ulemperne ved Axon?<\/i><\/p>\n<p>For det f\u00f8rste er der en kompleksitet i infrastrukturen; vi har f\u00e5et et enkelt fejlfunktionspunkt - Axon-serveren, al kommunikation g\u00e5r gennem den. <\/p>\n<p>For det andet fremtr\u00e6der et typisk problem i s\u00e5danne distribuerede systemer - tidsm\u00e6ssig inkonsistens af data. I vores tilf\u00e6lde kan der g\u00e5 utilstedelig lang tid mellem modtagelse af en ny handel og opdatering af data til foresp\u00f8rgsler.<\/p>\n<p><i>Hvad blev efterladt uset?<\/i><\/p>\n<p>Der blev slet ikke n\u00e6vnt noget om Event Sourcing og CQRS; hvad det er, og hvad det bruges til.<br \/>\nUden at uddybe disse begreber kan nogle punkter have v\u00e6ret uklare.<\/p>\n<p>M\u00e5ske kr\u00e6ver enkelte kodefragmenter ogs\u00e5 forklaring.<\/p>\n<p>Det taler vi om p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">det \u00e5bne webinar<\/a><\/noindex> den 21. september.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Komplet eksempel<\/a><\/noindex>.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Mikrotjenester med kommunikation via Axon | ProHoster","description":"I denne enkle vejledning vil vi oprette et par mikrotjenester med Spring Boot og organisere interaktion mellem dem via Axon-rammen.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}