{"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 tutoriale creiamo un paio di microservizi con Spring Boot e organizziamo l'interazione tra di essi attraverso 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 il seguente compito.<\/i><\/p>\n<p>Abbiamo una fonte di operazioni nel mercato azionario. Questa fonte ci trasmette le operazioni tramite un'interfaccia Rest. <\/p>\n<p>Dobbiamo ottenere queste operazioni, salvarle in un database e creare uno storage in memoria conveniente. <\/p>\n<p>Questo storage deve svolgere le seguenti funzioni:<\/p>\n<ul>\n<li> restituire un elenco di trade;<\/li>\n<li> restituire la posizione completa, ovvero la 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 per risolvere 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 l'operazione tramite Rest;<\/li>\n<li> salvare l'operazione nel database;<\/li>\n<li> storage in memoria per rappresentare i dati della posizione.<\/li>\n<\/ul>\n<p>\nFacciamo in questo tutorial il primo e il terzo servizio, mentre il secondo lo rimandiamo alla seconda parte (scrivi nei commenti se ti interessa).<\/p>\n<p>Quindi, 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 arrivo. <\/p>\n<p>Vogliamo certamente ottenere scalabilit\u00e0 orizzontale, aggiornamenti senza interruzioni e altri vantaggi dei microservizi.<\/p>\n<p><i>Qual \u00e8 la sfida, piuttosto complessa, che abbiamo davanti?<\/i><\/p>\n<p>In realt\u00e0 ce ne sono molte, ma adesso parliamo di come i dati circoleranno tra questi microservizi. Possiamo implementare Rest, utilizzare qualche coda, o inventare molte altre cose con i loro pro e contro.<\/p>\n<p>Consideriamo 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>In primo luogo, l'interazione asincrona aumenta la flessibilit\u00e0 (s\u00ec, c'\u00e8 anche uno svantaggio, ma per ora parliamo solo dei vantaggi). <\/p>\n<p>In secondo luogo, otteniamo subito <b>Event Sourcing<\/b> e <b>CQRS<\/b>. <br \/>\nIn terzo luogo, Axon fornisce un'infrastruttura pronta all'uso, permettendoci di concentrarci solo sulla 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 via Rest;<\/li>\n<li> tradeQueries. modulo con microservizio per visualizzare la posizione.<\/li>\n<\/ul>\n<p>\nPrenderemo Spring Boot come base e collegheremo il starter di Axon.<\/p>\n<p>Axon funziona ottimamente anche senza Spring, ma li utilizzeremo insieme.<\/p>\n<p>Qui \u00e8 necessario fermarsi e dire alcune parole su Axon. <\/p>\n<p>\u00c8 un sistema client-server. C'\u00e8 un server \u2013 \u00e8 un'applicazione separata, che avvieremo in Docker. <\/p>\n<p>E ci sono i client che si integrano nei microservizi. <br \/>\nEcco come si presenta il tutto. 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 divisa in due tipi: tecnica e commerciale. <\/p>\n<p>Tecnica \u2013 \u00e8 lo scambio di messaggi \"ci sono\" (questi messaggi possono essere visualizzati 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, dopo l'avvio, un 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 modo relativamente sicuro senza perdita di dati. <br \/>\nCon questo schema di scambio, possiamo avviare facilmente molte istanze di microservizi, <br \/>\nanche su diversi host.<\/p>\n<p>S\u00ec, un'istanza del server Axon non \u00e8 affidabile, ma al momento funziona cos\u00ec.<\/p>\n<p>Lavoriamo secondo le paradigmi di Event Sourcing e CQRS. Questo significa che dobbiamo avere \u00abcomandi\u00bb, \u00abeventi\u00bb e \u00abquery\u00bb. <\/p>\n<p>Avremo un comando: \u00abcreare una transazione\u00bb, un evento \u00abtransazione creata\u00bb e tre query: \u00abmostra tutte le transazioni\u00bb, \u00abmostra la posizione\u00bb, \u00abmostra la posizione per strumento\u00bb.<\/p>\n<p>La schema di lavoro \u00e8 la seguente: <\/p>\n<ol>\n<li> Il microservizio tradeCreator riceve una transazione tramite Rest.<\/li>\n<li> Il microservizio tradeCreator crea il comando \u00abcreare una transazione\u00bb e lo invia al server Axon.<\/li>\n<li> Il server Axon riceve il comando e lo inoltra al destinatario interessato, in questo caso al microservizio tradeCreator.<\/li>\n<li> Il microservizio tradeCreator riceve il comando, genera l'evento \u00abtransazione creata\u00bb 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 al momento della generazione dell'evento, il microservizio tradeQueries potrebbe non essere disponibile, ma non appena verr\u00e0 avviato, ricever\u00e0 immediatamente l'evento).<\/p>\n<p>S\u00ec, il server Axon si trova al centro delle comunicazioni, tutti i messaggi passano attraverso di esso.<\/p>\n<p><i>Passiamo al coding.<\/i><\/p>\n<p>Per evitare di appesantire il post con il codice, di seguito riporter\u00f2 solo i frammenti; il link all'esempio completo sar\u00e0 qui sotto.<\/p>\n<p>Iniziamo con il modulo comune.<\/p>\n<p>In esso le parti comuni sono l'evento (class CreatedTradeEvent). Nota il nome; in effetti, \u00e8 il nome del comando che ha generato questo evento, ma al passato. Al passato perch\u00e9 prima appare il comando che porta alla creazione dell'evento.<\/p>\n<p>Altre strutture comuni includono le classi per descrivere la posizione (class Position), la transazione (class Trade) e la parte della transazione (enum Side), ossia acquisto o vendita.<\/p>\n<p>Passiamo al modulo tradeCreator. <\/p>\n<p>Questo modulo ha un'interfaccia Rest (class TradeController) per ricevere le transazioni. <br \/>\nDalla transazione ricevuta si forma il comando \"crea transazione\" che viene 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 si usa la classe class TradeAggregate. <br \/>\nAffinch\u00e9 Axon lo trovi, aggiungiamo l'annotazione @Aggregate.<br \/>\nIl metodo per gestire il comando appare cos\u00ec (in forma ridotta):<\/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>\nDall comando viene generato 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, esaminiamo la gestione della richiesta: \"mostra tutte le operazioni\".<\/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 query di selezione e inviato al server.<\/p>\n<p>Per gestire la richiesta di selezione si usa la classe TradesEventHandler.<br \/>\nIn essa c'\u00e8 un metodo annotato con<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\n\u00c8 proprio lui che si occupa di estrarre i dati dallo storage in-memory.<\/p>\n<p>Sorge la domanda, come viene aggiornata l'informazione in questo storage. <\/p>\n<p>Iniziamo con il fatto che \u00e8 semplicemente un insieme di ConcurrentHashMap, progettato per selezioni specifiche. <br \/>\nPer il loro aggiornamento 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>\nGestisce l\u2019evento \"trattativa creata\" e aggiorna le Mappe.<\/p>\n<p>Ecco i punti principali nello sviluppo dei microservizi.<\/p>\n<p><i>Cosa si pu\u00f2 dire sugli svantaggi di Axon?<\/i><\/p>\n<p>In primo luogo, c'\u00e8 la complessit\u00e0 dell'infrastruttura, \u00e8 emersa un punto di guasto - Axon Server, tutte le comunicazioni passano attraverso di esso. <\/p>\n<p>In secondo luogo, si manifesta chiaramente un difetto di questi sistemi distribuiti - l'inconsistenza temporale dei dati. Nel nostro caso, tra il ricevimento della nuova transazione e l'aggiornamento dei dati per le query pu\u00f2 passare un tempo inaccettabilmente lungo.<\/p>\n<p><i>Cosa \u00e8 rimasto in ombra?<\/i><\/p>\n<p>Non \u00e8 stato detto nulla su Event Sourcing e CQRS, cosa siano e a cosa servano.<br \/>\nSenza la spiegazione di questi concetti, alcuni aspetti potrebbero non essere chiari.<\/p>\n<p>\u00c8 possibile che alcuni frammenti di codice richiedano chiarimenti.<\/p>\n<p>Su questo ne parleremo durante <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">il 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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 tramite Axon | ProHoster","description":"In questo semplice tutoriale creeremo un paio di microservizi con Spring Boot e organizzeremo la comunicazione tra di essi tramite il framework Axon. Supponiamo di avere questa esigenza: c'\u00e8 una fonte di transazioni nel mercato azionario. Questa fonte ci trasmette le transazioni tramite un'interfaccia Rest. Dobbiamo acquisire queste transazioni, salvarle nel database e creare uno storage in-memory conveniente. Questo storage deve svolgere","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. \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","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"},"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}]}}