{"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\/sv\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Mikrotj\u00e4nster med kommunikation via Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I denna enkla tutorial kommer vi att skapa ett par mikrotj\u00e4nster med Spring Boot och organisera kommunikationen mellan dem via Axon-ramverket.<\/p>\n<p><img decoding=\"async\" alt=\"Mikrotj\u00e4nster 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>Anta att vi har f\u00f6ljande uppgift.<\/i><\/p>\n<p>Det finns en k\u00e4lla f\u00f6r aff\u00e4rer p\u00e5 aktiemarknaden. Denna k\u00e4lla \u00f6verf\u00f6r aff\u00e4rer till oss via ett REST-gr\u00e4nssnitt. <\/p>\n<p>Vi m\u00e5ste h\u00e4mta dessa aff\u00e4rer, spara dem i en databas och skapa en praktisk in-memory lagring. <\/p>\n<p>Detta lagringssystem skall uppfylla f\u00f6ljande funktioner:<\/p>\n<ul>\n<li> \u00e5terge en lista \u00f6ver aff\u00e4rer;<\/li>\n<li> \u00e5terge den fullst\u00e4ndiga positionen, det vill s\u00e4ga en tabell med \"instrument\" \u2013 \"aktuellt antal papper\";<\/li>\n<li> \u00e5terge positionen f\u00f6r ett givet instrument.<\/li>\n<\/ul>\n<p>\n<i>Hur kommer vi att n\u00e4rma oss l\u00f6sningen p\u00e5 denna uppgift? <\/i><\/p>\n<p>Enligt mikrotj\u00e4nsternas principer m\u00e5ste vi dela upp uppgiften i olika mikrotj\u00e4nster:<\/p>\n<ul>\n<li> h\u00e4mtning av aff\u00e4rer via REST;<\/li>\n<li> spara aff\u00e4rer i en databas;<\/li>\n<li> in-memory lagring f\u00f6r att representera data f\u00f6r positionen.<\/li>\n<\/ul>\n<p>\nL\u00e5t oss i den h\u00e4r tutorialen skapa den f\u00f6rsta och den tredje tj\u00e4nsten, medan vi l\u00e4mnar den andra till del tv\u00e5 (skriv i kommentarerna om det \u00e4r av intresse).<\/p>\n<p>S\u00e5, vi har tv\u00e5 mikrotj\u00e4nster. <\/p>\n<p>Den f\u00f6rsta h\u00e4mtar data utifr\u00e5n. <\/p>\n<p>Den andra behandlar dessa data och svarar p\u00e5 inkommande f\u00f6rfr\u00e5gningar. <\/p>\n<p>Vi vill sj\u00e4lvklart uppn\u00e5 horisontell skalbarhet, felfri uppdatering och andra f\u00f6rdelar med mikrotj\u00e4nster.<\/p>\n<p><i>Vilken, ganska sv\u00e5r, uppgift st\u00e5r vi inf\u00f6r?<\/i><\/p>\n<p>Det finns faktiskt m\u00e5nga, men l\u00e5t oss just nu diskutera hur data ska fl\u00f6da mellan dessa mikrotj\u00e4nster. Vi kan ocks\u00e5 skapa REST mellan dem, s\u00e4tta upp n\u00e5gon typ av k\u00f6, eller hitta p\u00e5 mycket annat med sina egna f\u00f6rdelar och nackdelar.<\/p>\n<p>L\u00e5t oss titta p\u00e5 en m\u00f6jlig metod \u2013 asynkron interaktion via <b>Axon-ramverket<\/b>.<\/p>\n<p><i>Vilka f\u00f6rdelar har en s\u00e5dan l\u00f6sning?<\/i><\/p>\n<p>F\u00f6r det f\u00f6rsta, asynkron interaktion \u00f6kar flexibiliteten (ja, det finns en nackdel h\u00e4r, men vi pratar bara om f\u00f6rdelarna just nu). <\/p>\n<p>F\u00f6r det andra f\u00e5r vi direkt ur l\u00e5dan <b>Event Sourcing<\/b> och <b>CQRS<\/b>. <br \/>\nF\u00f6r det tredje tillhandah\u00e5ller Axon en f\u00e4rdig infrastruktur, och vi beh\u00f6ver bara fokusera p\u00e5 att utveckla aff\u00e4rslogiken.<\/p>\n<p>L\u00e5t oss b\u00f6rja.<\/p>\n<p>Projektet kommer att vara p\u00e5 Gradle. Det kommer att ha tre moduler: <\/p>\n<ul>\n<li> common. modul med gemensamma datatyper (vi gillar inte att kopiera och klistra);<\/li>\n<li> tradeCreator. modul med mikrotj\u00e4nsten f\u00f6r att ta emot aff\u00e4rer via REST;<\/li>\n<li> tradeQueries. modul med mikrotj\u00e4nsten f\u00f6r att visa positionen.<\/li>\n<\/ul>\n<p>\nVi tar Spring Boot som grund och kopplar in Axon-starter.<\/p>\n<p>Axon fungerar utm\u00e4rkt \u00e4ven utan Spring, men vi kommer att anv\u00e4nda dem tillsammans.<\/p>\n<p>H\u00e4r beh\u00f6ver vi stanna upp och s\u00e4ga n\u00e5gra ord om Axon. <\/p>\n<p>Detta \u00e4r ett klient-server-system. Det finns en server \u2013 en separat applikation som vi kommer att k\u00f6ra i Docker. <\/p>\n<p>Och det finns klienter som integreras i mikrotj\u00e4nster. <br \/>\nDet blir en s\u00e5dan bild. F\u00f6rst startas Axon-servern (i Docker), och sedan v\u00e5ra mikrotj\u00e4nster. <\/p>\n<p>Vid start letar mikrotj\u00e4nsterna efter servern och b\u00f6rjar interagera med den. Interaktionen kan grovt delas in i tv\u00e5 typer: teknisk och aff\u00e4rsm\u00e4ssig. <\/p>\n<p>Den tekniska \u2013 det \u00e4r meddelandeutbyte som \"jag \u00e4r levande\" (s\u00e5dana meddelanden kan ses i debugloggningen). <\/p>\n<p>Den aff\u00e4rsm\u00e4ssiga \u2013 det handlar om meddelanden som \"ny aff\u00e4r\".<\/p>\n<p>En viktig egenskap, efter att mikrotj\u00e4nsten har startats kan den fr\u00e5ga Axon-servern \"vad har h\u00e4nt\" och servern vidarebefordrar de insamlade h\u00e4ndelserna till mikrotj\u00e4nsten. P\u00e5 s\u00e5 s\u00e4tt kan mikrotj\u00e4nsten relativt s\u00e4kert startas om utan att data g\u00e5r f\u00f6rlorad. <br \/>\nMed denna utbytesstruktur kan vi enkelt starta m\u00e5nga instanser av mikrotj\u00e4nster, <br \/>\n\u00e4ven p\u00e5 olika v\u00e4rdar.<\/p>\n<p>Ja, en instans av Axon-servern \u00e4r inte p\u00e5litlig, men s\u00e5 l\u00e4nge \u00e4r det s\u00e5 h\u00e4r.<\/p>\n<p>Vi arbetar inom paradigmerna Event Sourcing och CQRS. Det inneb\u00e4r att vi m\u00e5ste ha \"kommandon\", \"h\u00e4ndelser\" och \"fr\u00e5gor\". <\/p>\n<p>Vi kommer att ha ett kommando: \"skapa aff\u00e4r\", en h\u00e4ndelse \"aff\u00e4r skapad\" och tre fr\u00e5gor: \"visa alla aff\u00e4rer\", \"visa position\", \"visa position per instrument\".<\/p>\n<p>Arbetsfl\u00f6det ser ut s\u00e5 h\u00e4r: <\/p>\n<ol>\n<li> Mikrotj\u00e4nsten tradeCreator tar emot aff\u00e4ren via Rest.<\/li>\n<li> Mikrotj\u00e4nsten tradeCreator skapar kommandot \"skapa aff\u00e4r\" och skickar det till Axon-servern.<\/li>\n<li> Axon-servern tar emot kommandot och vidarebefordrar det till den intresserade mottagaren, i v\u00e5rt fall mikrotj\u00e4nsten tradeCreator.<\/li>\n<li> Mikrotj\u00e4nsten tradeCreator f\u00e5r kommandot, formar h\u00e4ndelsen \"aff\u00e4r skapad\" och skickar den till Axon-servern.<\/li>\n<li> Axon-servern tar emot h\u00e4ndelsen och vidarebefordrar den till de intresserade prenumeranterna.<\/li>\n<li> F\u00f6r tillf\u00e4llet har vi bara en intresserad mottagare \u2013 mikrotj\u00e4nsten tradeQueries.<\/li>\n<li> Mikrotj\u00e4nsten tradeQueries f\u00e5r h\u00e4ndelsen och uppdaterar sina interna data.<\/li>\n<\/ol>\n<p>\n(Det \u00e4r viktigt att notera att mikrotj\u00e4nsten tradeQueries kan vara otillg\u00e4nglig n\u00e4r h\u00e4ndelsen skapas, men s\u00e5 snart den startas kommer den omedelbart att f\u00e5 h\u00e4ndelsen).<\/p>\n<p>Ja, axon-servern st\u00e5r i centrum f\u00f6r kommunikationen, alla meddelanden g\u00e5r genom den.<\/p>\n<p><i>L\u00e5t oss g\u00e5 vidare till kodning.<\/i><\/p>\n<p>F\u00f6r att inte \u00f6verbelasta inl\u00e4gget med kod kommer jag nedan endast att ge fragment, l\u00e4nken till hela exemplet kommer att finnas nedan.<\/p>\n<p>Vi b\u00f6rjar med den allm\u00e4nna modulen common.<\/p>\n<p>I den finns de allm\u00e4nna delarna \u2013 detta event (klass CreatedTradeEvent). Observera namnet, detta \u00e4r i princip namnet p\u00e5 kommandot som skapade detta event, men i f\u00f6rfluten tid. I f\u00f6rfluten tid eftersom kommandot f\u00f6rst upptr\u00e4der och leder till skapandet av eventet.<\/p>\n<p>Andra gemensamma strukturer inkluderar klasser f\u00f6r att beskriva position (klass Position), aff\u00e4r (klass Trade) och aff\u00e4rens sida (enum Side), dvs. k\u00f6p eller f\u00f6rs\u00e4ljning.<\/p>\n<p>Vi g\u00e5r vidare till modulen tradeCreator. <\/p>\n<p>Denna modul har ett Rest-gr\u00e4nssnitt (klass TradeController) f\u00f6r att ta emot aff\u00e4rer. <br \/>\nFr\u00e5n den mottagna aff\u00e4ren formuleras kommandot \"skapa aff\u00e4r\" och skickas till axon-servern.<\/p>\n<pre><code class=\"java\">    @PostMapping(&quot;\/trade&quot;)\n    public ResponseEntity&lt;String&gt; 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>\nF\u00f6r att behandla kommandot anv\u00e4nds klassen class TradeAggregate. <br \/>\nF\u00f6r att Axon ska hitta den, l\u00e4gger vi till annotationen @Aggregate.<br \/>\nMetoden f\u00f6r att behandla kommandot ser ut s\u00e5 h\u00e4r (med f\u00f6rkortning):<\/p>\n<pre><code class=\"java\">    @CommandHandler\n    public TradeAggregate(CreateTradeCommand command) {\n        log.info(&quot;command: {}&quot;, 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>\nFr\u00e5n kommandot skapas ett event och skickas till servern.<br \/>\nKommandot finns i klassen CreateTradeCommand.<\/p>\n<p>Nu tittar vi p\u00e5 den sista modulen tradeQueries.<\/p>\n<p>Fr\u00e5gor beskrivs i paketet queries.<br \/>\nDenna modul har ocks\u00e5 ett Rest-gr\u00e4nssnitt<br \/>\npublic class TradeController.<\/p>\n<p>Som exempel ser vi p\u00e5 behandlingen av fr\u00e5gan: \"visa alla aff\u00e4rer\".<\/p>\n<pre><code class=\"java\">    @GetMapping(&quot;\/trade\/all&quot;)\n    public List&lt;Trade&gt; findAllTrades() {\n        return queryGateway.query(new FindAllTradesQuery(),\n                ResponseTypes.multipleInstancesOf(Trade.class)).join();\n    }\n<\/code><\/pre>\n<p>\nEn f\u00f6rfr\u00e5gan om datauttag skapas och skickas till servern.<\/p>\n<p>F\u00f6r att bearbeta f\u00f6rfr\u00e5gan anv\u00e4nds klassen TradesEventHandler.<br \/>\nI den finns en metod som markerats med annotationen<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nDet \u00e4r just denna som \u00e4r ansvarig f\u00f6r att h\u00e4mta data fr\u00e5n in-memory lagret.<\/p>\n<p>Fr\u00e5gan uppst\u00e5r, hur uppdateras informationen i detta lagret. <\/p>\n<p>Vi b\u00f6rjar med att s\u00e4ga att det helt enkelt \u00e4r en upps\u00e4ttning ConcurrentHashMap, anpassade f\u00f6r specifika uttag. <br \/>\nF\u00f6r att uppdatera dem anv\u00e4nds metoden:<\/p>\n<pre><code class=\"java\">    @EventHandler\n    public void on(CreatedTradeEvent event) {\n        log.info(&quot;event:{}&quot;, 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>\nDet tar emot h\u00e4ndelsen 'handel skapad' och uppdaterar Map-objekten.<\/p>\n<p>Detta \u00e4r huvudpunkterna i utvecklingen av mikrotj\u00e4nster.<\/p>\n<p><i>Vad kan s\u00e4gas om nackdelarna med Axon?<\/i><\/p>\n<p>F\u00f6r det f\u00f6rsta, det komplicerar infrastrukturen; en felpunkt dyker upp \u2013 Axon-servern, alla kommunikationer g\u00e5r genom den. <\/p>\n<p>F\u00f6r det andra, en tydlig nackdel med s\u00e5dana distribuerade system \u00e4r den tempor\u00e4ra inkonsekvensen i data. I v\u00e5rt fall kan det ta oacceptabelt l\u00e5ng tid mellan att en ny handel tas emot och att datan f\u00f6r urvalen uppdateras.<\/p>\n<p><i>Vad kvarst\u00e5r i bakgrunden?<\/i><\/p>\n<p>Ingenting har sagts om Event Sourcing och CQRS, vad det \u00e4r och varf\u00f6r det beh\u00f6vs.<br \/>\nUtan att f\u00f6rklara dessa begrepp kan vissa punkter vara oklara.<\/p>\n<p>Kanske beh\u00f6ver vissa kodfragment ocks\u00e5 f\u00f6rtydligas.<\/p>\n<p>Detta kommer vi att diskutera p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">\u00f6ppet webbinarium<\/a><\/noindex> 21 september.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Fullst\u00e4ndigt exempel<\/a><\/noindex>.<br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Mikrotj\u00e4nster med kommunikation genom Axon | ProHoster","description":"I denna enkla tutorial kommer vi att skapa ett par mikrotj\u00e4nster med Spring Boot och organisera kommunikationen mellan dem via Axon-ramverket.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}