{"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\/ro\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Microservicii cu comunicare prin Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00cen acest tutorial simplu, vom crea c\u00e2teva microservicii pe Spring Boot \u0219i vom organiza interac\u021biunea dintre ele prin cadrul Axon.<\/p>\n<p><img decoding=\"async\" alt=\"Microservicii cu comunicare prin 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>S\u0103 presupunem c\u0103 avem aceast\u0103 sarcin\u0103.<\/i><\/p>\n<p>Exist\u0103 o surs\u0103 de tranzac\u021bii pe pia\u021ba de capital. Aceast\u0103 surs\u0103 ne transmite tranzac\u021biile printr-un API Rest. <\/p>\n<p>Trebuie s\u0103 ob\u021binem aceste tranzac\u021bii, s\u0103 le salv\u0103m \u00een baza de date \u0219i s\u0103 facem un depozit in-memory convenabil. <\/p>\n<p>Aceast\u0103 depozitare trebuie s\u0103 \u00eendeplineasc\u0103 urm\u0103toarele func\u021bii:<\/p>\n<ul>\n<li> s\u0103 returneze o list\u0103 de tranzac\u021bii;<\/li>\n<li> s\u0103 returneze pozi\u021bia complet\u0103, adic\u0103 tabela \u201einstrument\u201d \u2013 \u201ecantitate curent\u0103 de ac\u021biuni\u201d;<\/li>\n<li> s\u0103 returneze pozi\u021bia pentru un instrument dat.<\/li>\n<\/ul>\n<p>\n<i>Cum ne vom apropia de rezolvarea acestei sarcini? <\/i><\/p>\n<p>Conform principiilor modei microserviciilor, trebuie s\u0103 \u00eemp\u0103r\u021bim sarcina \u00een microservicii componente:<\/p>\n<ul>\n<li> ob\u021binerea tranzac\u021biei prin Rest;<\/li>\n<li> salvarea tranzac\u021biei \u00een baza de date;<\/li>\n<li> depozit in-memory pentru prezentarea datelor pe pozi\u021bie.<\/li>\n<\/ul>\n<p>\nS\u0103 facem \u00een cadrul acestui tutorial primul \u0219i al treilea serviciu, l\u0103s\u00e2nd al doilea pentru a doua parte (scrie\u021bi \u00een comentarii dac\u0103 asta v\u0103 intereseaz\u0103).<\/p>\n<p>A\u0219adar, avem dou\u0103 microservicii. <\/p>\n<p>Primul ob\u021bine date din exterior. <\/p>\n<p>Al doilea proceseaz\u0103 aceste date \u0219i r\u0103spunde la cererile primite. <\/p>\n<p>Desigur, dorim s\u0103 ob\u021binem scalabilitate orizontal\u0103, actualiz\u0103ri f\u0103r\u0103 \u00eentreruperi \u0219i alte beneficii ale microserviciilor.<\/p>\n<p><i>Ce sarcin\u0103, destul de complex\u0103, se afl\u0103 \u00een fa\u021ba noastr\u0103?<\/i><\/p>\n<p>De fapt, sunt multe, dar acum s\u0103 discut\u0103m despre cum vor circula datele \u00eentre aceste microservicii. Se poate face REST \u00eentre ele, se poate folosi o coad\u0103, se poate g\u00e2ndi la multe solu\u021bii cu avantajele \u0219i dezavantajele lor.<\/p>\n<p>S\u0103 analiz\u0103m una dintre abord\u0103rile posibile \u2013 interac\u021biunea asincron\u0103 prin <b>cadru Axon<\/b>.<\/p>\n<p><i>Care sunt avantajele acestei solu\u021bii?<\/i><\/p>\n<p>\u00cen primul r\u00e2nd, interac\u021biunea asincron\u0103 cre\u0219te flexibilitatea (da, exist\u0103 \u0219i un dezavantaj, dar deocamdat\u0103 vorbim doar despre avantaje). <\/p>\n<p>\u00cen al doilea r\u00e2nd, ob\u021binem direct din cutie <b>Event Sourcing<\/b> \u0219i <b>CQRS<\/b>. <br \/>\n\u00cen al treilea r\u00e2nd, Axon ofer\u0103 o infrastructur\u0103 gata f\u0103cut\u0103, iar noi trebuie s\u0103 ne concentr\u0103m doar pe dezvoltarea logicii de afaceri.<\/p>\n<p>S\u0103 \u00eencepem.<\/p>\n<p>Proiectul nostru va fi pe gradle. Vor fi trei module: <\/p>\n<ul>\n<li> common. modul cu structuri de date comune (nu ne place copiarea);<\/li>\n<li> tradeCreator. modul cu microserviciul pentru primirea tranzac\u021biilor prin Rest;<\/li>\n<li> tradeQueries. modul cu microserviciul pentru afi\u0219area pozi\u021biei.<\/li>\n<\/ul>\n<p>\nVom lua Spring Boot ca baz\u0103 \u0219i vom conecta starterul Axon.<\/p>\n<p>Axon func\u021bioneaz\u0103 excelent \u0219i f\u0103r\u0103 Spring, dar le vom folosi \u00eempreun\u0103.<\/p>\n<p>Aici trebuie s\u0103 ne oprim \u0219i s\u0103 spunem c\u00e2teva cuvinte despre Axon. <\/p>\n<p>Este un sistem client-server. Exist\u0103 un server - este o aplica\u021bie separat\u0103 pe care o vom rula \u00een Docker. <\/p>\n<p>\u0218i exist\u0103 clien\u021bi, care sunt integra\u021bi \u00een microservicii. <br \/>\nDeci, se contureaz\u0103 o imagine. Mai \u00eent\u00e2i, se porne\u0219te serverul Axon (\u00een Docker), apoi microserviciile noastre. <\/p>\n<p>La pornire, microserviciile caut\u0103 serverul \u0219i \u00eencep s\u0103 interac\u021bioneze cu acesta. Interac\u021biunea poate fi \u00eemp\u0103r\u021bit\u0103, \u00een linii mari, \u00een dou\u0103 tipuri: tehnic \u0219i de afaceri. <\/p>\n<p>Tehnic - este un schimb de mesaje \"sunt viu\" (aceste mesaje pot fi v\u0103zute \u00een modul de logare debug). <\/p>\n<p>De afaceri - este un schimb de mesaje, de genul \u201enou\u0103 tranzac\u021bie\u201d.<\/p>\n<p>O caracteristic\u0103 important\u0103, dup\u0103 pornire, microserviciul poate \u00eentreba serverul Axon \u201ece s-a \u00eent\u00e2mplat\u201d \u0219i serverul transmite microserviciului evenimentele acumulate. Astfel, microserviciul poate fi repornit relativ sigur f\u0103r\u0103 pierdere de date. <br \/>\n\u00centr-o astfel de schem\u0103 de schimb, putem lansa foarte u\u0219or multe instan\u021be de microservicii, <br \/>\nchiar \u0219i pe gazde diferite.<\/p>\n<p>Da, o instan\u021b\u0103 a serverului Axon nu este de \u00eencredere, dar deocamdat\u0103 a\u0219a este.<\/p>\n<p>Lucr\u0103m \u00een paradigmele Event Sourcing \u0219i CQRS. Asta \u00eenseamn\u0103 c\u0103 trebuie s\u0103 avem \u201ecomenzi\u201d, \u201eevenimente\u201d \u0219i \u201einterog\u0103ri\u201d. <\/p>\n<p>Vom avea o singur\u0103 comand\u0103: \u201ecrea\u021bi tranzac\u021bia\u201d, un singur eveniment \u201etranzac\u021bia a fost creat\u0103\u201d \u0219i trei interog\u0103ri: \u201eafi\u0219eaz\u0103 toate tranzac\u021biile\u201d, \u201eafi\u0219eaz\u0103 pozi\u021bia\u201d, \u201eafi\u0219eaz\u0103 pozi\u021bia pe instrument\u201d.<\/p>\n<p>Schema de func\u021bionare este urm\u0103toarea: <\/p>\n<ol>\n<li> Microserviciul tradeCreator prime\u0219te tranzac\u021bia prin REST.<\/li>\n<li> Microserviciul tradeCreator creeaz\u0103 comanda \u201ecreeaz\u0103 tranzac\u021bia\u201d \u0219i o trimite c\u0103tre serverul Axon.<\/li>\n<li> Serverul Axon prime\u0219te comanda \u0219i o redirec\u021bioneaz\u0103 c\u0103tre destinatarul interesat, \u00een cazul nostru microserviciul tradeCreator.<\/li>\n<li> Microserviciul tradeCreator prime\u0219te comanda, formeaz\u0103 evenimentul \u201etranzac\u021bia a fost creat\u0103\u201d \u0219i \u00eel trimite serverului Axon.<\/li>\n<li> Serverul Axon prime\u0219te evenimentul \u0219i \u00eel redirec\u021bioneaz\u0103 abona\u021bilor interesa\u021bi.<\/li>\n<li> \u00cen prezent, avem doar un singur destinatar interesat - este microserviciul tradeQueries.<\/li>\n<li> Microserviciul tradeQueries prime\u0219te evenimentul \u0219i \u00ee\u0219i actualizeaz\u0103 datele interne.<\/li>\n<\/ol>\n<p>\n(Este important c\u0103, \u00een momentul form\u0103rii evenimentului, microserviciul tradeQueries poate s\u0103 nu fie disponibil, dar de \u00eendat\u0103 ce va porni, va primi imediat evenimentul).<\/p>\n<p>Da, serverul axon se afl\u0103 \u00een centrul comunica\u021biilor, toate mesajele trec prin el.<\/p>\n<p><i>S\u0103 trecem la codare.<\/i><\/p>\n<p>Pentru a nu aglomera postarea cu cod, mai jos voi prezenta doar fragmente, linkul c\u0103tre exemplul complet va fi mai jos.<\/p>\n<p>S\u0103 \u00eencepem cu modulul general common.<\/p>\n<p>\u00cen el, p\u0103r\u021bile comune sunt evenimentul (class CreatedTradeEvent). Observa\u021bi denumirea, prin esen\u021b\u0103, aceasta este denumirea comenzii care a generat acest eveniment, dar la timpul trecut. \u00cen trecut, deoarece \u00eent\u00e2i apare comanda care duce la crearea evenimentului.<\/p>\n<p>Alte structuri comune includ clasele pentru descrierea pozi\u021biei (class Position), tranzac\u021biei (class Trade) \u0219i partea tranzac\u021biei (enum Side), adic\u0103 cump\u0103rare sau v\u00e2nzare.<\/p>\n<p>S\u0103 trecem la modulul tradeCreator. <\/p>\n<p>Acest modul are un interfa\u021b\u0103 Rest (class TradeController) pentru a primi tranzac\u021bii. <br \/>\nDin tranzac\u021bia primit\u0103 se formeaz\u0103 comanda \u201ecrea\u021bi tranzac\u021bia\u201d \u0219i este trimis\u0103 c\u0103tre serverul axon.<\/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>\nPentru a procesa comanda se folose\u0219te clasa class TradeAggregate. <br \/>\nPentru ca Axon s\u0103 o g\u0103seasc\u0103, ad\u0103ug\u0103m annotation @Aggregate.<br \/>\nMetoda pentru procesarea comenzii arat\u0103 astfel (cu scurtare):<\/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>\nDin comand\u0103 se formeaz\u0103 un eveniment \u0219i este trimis la server.<br \/>\nComanda se afl\u0103 \u00een clasa CreateTradeCommand.<\/p>\n<p>Acum s\u0103 ne uit\u0103m la ultimul modul tradeQueries.<\/p>\n<p>Select\u0103rile sunt descrise \u00een pachetul queries.<br \/>\n\u00cen acest modul exist\u0103, de asemenea, o interfa\u021b\u0103 Rest<br \/>\npublic class TradeController.<\/p>\n<p>Pentru exemplu, s\u0103 vedem procesarea cererii: \u201eafi\u0219eaz\u0103 toate tranzac\u021biile\u201d.<\/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>\nSe creeaz\u0103 o cerere pentru selec\u021bie \u0219i este trimis\u0103 la server.<\/p>\n<p>Pentru a procesa cererea de selec\u021bie se folose\u0219te clasa TradesEventHandler.<br \/>\n\u00cen ea exist\u0103 o metod\u0103, marcat\u0103 cu annotation<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nAceasta este responsabil\u0103 pentru selectarea datelor din stocarea in-memory.<\/p>\n<p>Se na\u0219te \u00eentrebarea, cum se actualizeaz\u0103 informa\u021bia \u00een aceast\u0103 stocare. <\/p>\n<p>S\u0103 \u00eencepem cu faptul c\u0103 aceasta este pur \u0219i simplu un set de ConcurrentHashMap, conceput pentru selec\u021bii specifice. <br \/>\nPentru actualizarea acestora se aplic\u0103 metoda:<\/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>\nEl prime\u0219te evenimentul \u201ecomer\u021b creat\u201d \u0219i actualizeaz\u0103 h\u0103r\u021bile.<\/p>\n<p>Acestea sunt principalele puncte ale dezvolt\u0103rii microserviciilor.<\/p>\n<p><i>Ce se poate spune despre dezavantajele Axon?<\/i><\/p>\n<p>\u00cen primul r\u00e2nd, complic\u0103 infrastructura, a ap\u0103rut un punct de e\u0219ec \u2013 serverul Axon, toate comunica\u021biile trec prin el. <\/p>\n<p>\u00cen al doilea r\u00e2nd, dezavantajul acestor sisteme distribuite devine foarte evident \u2013 incoeren\u021ba temporal\u0103 a datelor. \u00cen cazul nostru, \u00eentre primirea unei noi tranzac\u021bii \u0219i actualizarea datelor pentru interog\u0103ri poate trece un timp inacceptabil de mult.<\/p>\n<p><i>Ce a r\u0103mas \u00een umbr\u0103?<\/i><\/p>\n<p>Nu s-a spus nimic despre Event Sourcing \u0219i CQRS, ce sunt acestea \u0219i de ce sunt necesare.<br \/>\nF\u0103r\u0103 explicarea acestor concepte, unele aspecte pot fi neclare.<\/p>\n<p>Este posibil ca unele fragmente de cod s\u0103 necesite, de asemenea, explica\u021bii.<\/p>\n<p>Despre aceasta vom vorbi la <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">webinarul deschis<\/a><\/noindex> 21 septembrie.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Exemplu complet<\/a><\/noindex>.<br \/>\n<br \/>Sursa: <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.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Spring Boot \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Axon.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Microservicii cu comunicare prin Axon | ProHoster","description":"\u00cen acest tutorial simplu, vom crea c\u00e2teva microservicii pe Spring Boot \u0219i vom organiza interac\u021biunea dintre ele prin cadrul Axon.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}