{"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\/it\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Microservizi con comunicazione tramite Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>In questo semplice tutorial creeremo un paio di microservizi su Spring Boot e organizzeremo l'interazione tra di essi tramite il framework Axon.<\/p>\n<p><img decoding=\"async\" alt=\"Microservizi con comunicazione tramite 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>Supponiamo di avere un compito del genere.<\/i><\/p>\n<p>Esiste una fonte di transazioni sul mercato azionario. Questa fonte ci trasmette le transazioni tramite un'interfaccia Rest. <\/p>\n<p>Dobbiamo ottenere queste transazioni, conservarle nel database e creare un comodo archivio in memoria. <\/p>\n<p>Questo archivio deve svolgere le seguenti funzioni:<\/p>\n<ul>\n<li> restituire un elenco di operazioni;<\/li>\n<li> restituire la posizione completa, ovvero una tabella \"strumento\" \u2014 \"quantit\u00e0 attuale di titoli\";<\/li>\n<li> restituire la posizione per uno strumento specifico.<\/li>\n<\/ul>\n<p>\n<i>Come ci approcceremo alla soluzione di questo compito? <\/i><\/p>\n<p>Secondo i principi della moda microservizi, dobbiamo suddividere il compito in microservizi costitutivi:<\/p>\n<ul>\n<li> ottenere le transazioni tramite Rest;<\/li>\n<li> salvare le transazioni nel database;<\/li>\n<li> archivio in memoria per la rappresentazione dei dati sulla posizione.<\/li>\n<\/ul>\n<p>\nAllora, nell'ambito di questo tutorial, realizziamo il primo e il terzo servizio, mentre il secondo lo rimandiamo alla seconda parte (scrivete nei commenti se vi interessa).<\/p>\n<p>Dunque, abbiamo due microservizi. <\/p>\n<p>Il primo riceve dati dall'esterno. <\/p>\n<p>Il secondo elabora questi dati e risponde alle richieste in ingresso. <\/p>\n<p>Chiaramente, vogliamo ottenere scalabilit\u00e0 orizzontale, aggiornamenti senza interruzioni e altri vantaggi dei microservizi.<\/p>\n<p><i>Qual \u00e8, molto impegnativa, la sfida che ci aspetta?<\/i><\/p>\n<p>In realt\u00e0, ce ne sono molte, ma ora parliamo di come i dati fluiranno tra questi microservizi. Possono anche essere interconnessi tramite Rest, si pu\u00f2 utilizzare una coda, ci sono molte opzioni con i loro pro e contro.<\/p>\n<p>Esaminiamo uno dei possibili approcci: l'interazione asincrona tramite <b>il framework Axon<\/b>.<\/p>\n<p><i>Quali sono i vantaggi di questa soluzione?<\/i><\/p>\n<p>Innanzitutto, l'interazione asincrona aumenta la flessibilit\u00e0 (s\u00ec, ci sono anche svantaggi, ma per ora parliamo solo dei vantaggi). <\/p>\n<p>In secondo luogo, riceviamo direttamente funzionalit\u00e0 integrate <b>Event Sourcing<\/b> e <b>CQRS<\/b>. <br \/>\nIn terzo luogo, Axon fornisce un'infrastruttura pronta all'uso, e dobbiamo concentrarci solo sullo sviluppo della logica di business.<\/p>\n<p>Iniziamo.<\/p>\n<p>Il progetto sar\u00e0 basato su Gradle. Avr\u00e0 tre moduli: <\/p>\n<ul>\n<li> common. modulo con strutture dati comuni (non amiamo il copia e incolla);<\/li>\n<li> tradeCreator. modulo con microservizio per ricevere transazioni tramite Rest;<\/li>\n<li> tradeQueries. modulo con microservizio per visualizzare la posizione.<\/li>\n<\/ul>\n<p>\nPrendiamo Spring Boot come base e colliamo il starter di Axon.<\/p>\n<p>Axon funziona molto bene anche senza Spring, ma li useremo insieme.<\/p>\n<p>Qui ci si deve fermare e dire due parole su Axon. <\/p>\n<p>\u00c8 un sistema client-server. C'\u00e8 un server \u2013 \u00e8 un'applicazione separata, la avvieremo in Docker. <\/p>\n<p>E ci sono i client che si integrano nei microservizi. <br \/>\nLa situazione \u00e8 la seguente. Prima si avvia il server Axon (in Docker), poi i nostri microservizi. <\/p>\n<p>All'avvio, i microservizi cercano il server e iniziano a interagire con esso. L'interazione pu\u00f2 essere convenzionalmente suddivisa in due tipi: tecnica e commerciale. <\/p>\n<p>Tecnica \u2013 \u00e8 lo scambio di messaggi \"sono vivo\" (questi messaggi possono essere visti in modalit\u00e0 di registrazione debug). <\/p>\n<p>Commerciale \u2013 \u00e8 lo scambio di messaggi come \"nuova transazione\".<\/p>\n<p>Una caratteristica importante \u00e8 che, dopo l'avvio, il microservizio pu\u00f2 chiedere al server Axon \"cosa \u00e8 successo\" e il server trasmette al microservizio gli eventi accumulati. In questo modo, il microservizio pu\u00f2 essere riavviato in relativa sicurezza senza perdita di dati. <br \/>\nCon questo schema di scambio, possiamo avviare molto facilmente molte istanze di microservizi, <br \/>\nanche su host diversi.<\/p>\n<p>S\u00ec, un'istanza del server Axon non \u00e8 affidabile, ma al momento \u00e8 cos\u00ec.<\/p>\n<p>Lavoriamo secondo i paradigmi Event Sourcing e CQRS. Significa che dobbiamo avere \"comandi\", \"eventi\" e \"query\". <\/p>\n<p>Avremo un comando: \"creare una transazione\", un evento \"transazione creata\" e tre query: \"mostra tutte le transazioni\", \"mostra posizione\", \"mostra posizione per strumento\".<\/p>\n<p>Lo schema di lavoro \u00e8 il seguente: <\/p>\n<ol>\n<li> Il microservizio tradeCreator riceve la transazione tramite Rest.<\/li>\n<li> Il microservizio tradeCreator crea il comando \"creare una transazione\" e lo invia al server Axon.<\/li>\n<li> Il server Axon riceve il comando e lo inoltra al destinatario interessato, in questo caso il microservizio tradeCreator.<\/li>\n<li> Il microservizio tradeCreator riceve il comando, crea l'evento \"transazione creata\" e lo invia al server Axon.<\/li>\n<li> Il server Axon riceve l'evento e lo inoltra agli abbonati interessati.<\/li>\n<li> Attualmente, abbiamo solo un destinatario interessato: il microservizio tradeQueries.<\/li>\n<li> Il microservizio tradeQueries riceve l'evento e aggiorna i dati interni.<\/li>\n<\/ol>\n<p>\n(\u00c8 importante notare che nel momento in cui viene creato l'evento, il microservizio tradeQueries potrebbe non essere disponibile, ma appena si avvia, ricever\u00e0 immediatamente l'evento).<\/p>\n<p>S\u00ec, il server Axon \u00e8 al centro delle comunicazioni, tutti i messaggi passano attraverso di esso.<\/p>\n<p><i>Passiamo alla codifica.<\/i><\/p>\n<p>Per non sovraccaricare il post con il codice, qui fornir\u00f2 solo frammenti; il link all'esempio completo sar\u00e0 qui sotto.<\/p>\n<p>Iniziamo dal modulo generale common.<\/p>\n<p>Le parti comuni in esso sono l'evento (class CreatedTradeEvent). Notate il nome, in effetti \u00e8 il nome del comando che ha generato questo evento, ma al passato. Al passato, poich\u00e9 prima appare il comando che porta alla creazione dell'evento.<\/p>\n<p>Tra le altre strutture comuni ci sono le classi per descrivere la posizione (class Position), le transazioni (class Trade) e la parte della transazione (enum Side), ovvero acquisto o vendita.<\/p>\n<p>Passiamo al modulo tradeCreator. <\/p>\n<p>Questo modulo ha un'interfaccia Rest (class TradeController) per la ricezione delle transazioni. <br \/>\nDalla transazione ricevuta viene formata il comando \"crea transazione\" e inviato al server 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>\nPer elaborare il comando viene utilizzata la classe class TradeAggregate. <br \/>\nPer farlo trovare ad Axon, abbiniamo l'annotazione @Aggregate.<br \/>\nIl metodo per elaborare il comando appare cos\u00ec (con abbreviazione):<\/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>\nDal comando viene formata un evento e inviato al server.<br \/>\nIl comando si trova nella classe CreateTradeCommand.<\/p>\n<p>Ora diamo un'occhiata all'ultimo modulo tradeQueries.<\/p>\n<p>Le query sono descritte nel pacchetto queries.<br \/>\nIn questo modulo c'\u00e8 anche un'interfaccia Rest.<br \/>\npublic class TradeController.<\/p>\n<p>Per esempio, vediamo l'elaborazione della richiesta: \"mostra tutte le transazioni\".<\/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>\nViene creato un comando per la selezione e inviato al server.<\/p>\n<p>Per elaborare la richiesta di selezione viene utilizzata la classe TradesEventHandler.<br \/>\nIn essa c'\u00e8 un metodo contrassegnato con l'annotazione.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\n\u00c8 proprio lui a occuparsi della selezione dei dati dallo storage in memoria.<\/p>\n<p>Sorge la domanda su come venga aggiornata l'informazione in questo storage. <\/p>\n<p>Iniziamo col dire che si tratta semplicemente di un insieme di ConcurrentHashMap, mirati a selezioni specifiche. <br \/>\nPer aggiornarli si applica il metodo:<\/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>\nRiceve l'evento \"trade creato\" e aggiorna le Map.<\/p>\n<p>Questi sono i punti principali dello sviluppo di microservizi.<\/p>\n<p><i>Cosa si pu\u00f2 dire sugli svantaggi di Axon?<\/i><\/p>\n<p>In primo luogo, c'\u00e8 la complicazione dell'infrastruttura, \u00e8 emerso un punto di guasto \u2013 Axon-server, tutte le comunicazioni passano attraverso di esso. <\/p>\n<p>In secondo luogo, si manifesta chiaramente un difetto di tali sistemi distribuiti \u2013 la temporanea incoerenza dei dati. Nel nostro caso, tra la ricezione di una nuova transazione e l'aggiornamento dei dati per le selezioni pu\u00f2 passare un tempo inaccettabile.<\/p>\n<p><i>Cosa \u00e8 rimasto fuori?<\/i><\/p>\n<p>Non si \u00e8 affatto parlato di Event Sourcing e CQRS, cosa siano e a cosa servano.<br \/>\nSenza chiarire questi concetti, alcuni aspetti potrebbero non essere stati chiari.<\/p>\n<p>Potrebbe essere necessario chiarire anche alcune parti del codice.<\/p>\n<p>Ne parleremo durante il <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">webinar aperto<\/a><\/noindex> 21 settembre.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Esempio completo<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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.1.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\/it\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Microservizi con comunicazione attraverso Axon | ProHoster","description":"In questo semplice tutorial creeremo un paio di microservizi su Spring Boot e organizzeremo l'interazione tra di essi tramite il framework Axon.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}