{"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\/fr\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Microservices avec communication via Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dans ce tutoriel simple, nous allons cr\u00e9er quelques microservices avec Spring Boot et organiser leur interaction via le cadre Axon.<\/p>\n<p><img decoding=\"async\" alt=\"Microservices avec communication 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>Supposons que nous avons la t\u00e2che suivante.<\/i><\/p>\n<p>Il existe une source d'op\u00e9rations sur le march\u00e9 boursier. Cette source nous transmet des op\u00e9rations via une interface Rest. <\/p>\n<p>Nous devons r\u00e9cup\u00e9rer ces op\u00e9rations, les enregistrer dans une base de donn\u00e9es et cr\u00e9er un stockage in-memory pratique. <\/p>\n<p>Ce stockage doit remplir les fonctions suivantes :<\/p>\n<ul>\n<li> retourner une liste de trades;<\/li>\n<li> retourner la position compl\u00e8te, c'est-\u00e0-dire le tableau \u00ab instrument \u00bb \u2014 \u00ab quantit\u00e9 actuelle de titres \u00bb;<\/li>\n<li> retourner la position pour un instrument donn\u00e9.<\/li>\n<\/ul>\n<p>\n<i>Comment allons-nous aborder la solution de cette t\u00e2che ? <\/i><\/p>\n<p>Selon les pr\u00e9ceptes de la mode des microservices, nous devons diviser la t\u00e2che en microservices constituants :<\/p>\n<ul>\n<li> r\u00e9cup\u00e9ration des transactions via Rest;<\/li>\n<li> enregistrement des transactions dans la base de donn\u00e9es;<\/li>\n<li> stockage in-memory pour la repr\u00e9sentation des donn\u00e9es de la position.<\/li>\n<\/ul>\n<p>\nFaisons dans ce tutoriel le premier et le troisi\u00e8me service, en laissant le second pour la deuxi\u00e8me partie (faites-le nous savoir dans les commentaires si cela vous int\u00e9resse).<\/p>\n<p>Ainsi, nous avons deux microservices. <\/p>\n<p>Le premier obtient des donn\u00e9es de l'ext\u00e9rieur. <\/p>\n<p>Le second traite ces donn\u00e9es et r\u00e9pond aux requ\u00eates entrantes. <\/p>\n<p>Nous voulons bien s\u00fbr obtenir une scalabilit\u00e9 horizontale, une mise \u00e0 jour sans interruption et d'autres avantages des microservices.<\/p>\n<p><i>Quelle t\u00e2che, assez complexe, nous attend ?<\/i><\/p>\n<p>En r\u00e9alit\u00e9, il y en a beaucoup, mais parlons maintenant de la mani\u00e8re dont les donn\u00e9es vont circuler entre ces microservices. On peut aussi faire un Rest entre eux, installer une sorte de queue, ou imaginer beaucoup d'autres choses avec leurs avantages et inconv\u00e9nients.<\/p>\n<p>Examinons une des approches possibles \u2013 l'interaction asynchrone via <b>le cadre Axon.<\/b>.<\/p>\n<p><i>Quels sont les avantages de cette solution ?<\/i><\/p>\n<p>Tout d'abord, l'interaction asynchrone augmente la flexibilit\u00e9 (oui, il y a aussi un inconv\u00e9nient ici, mais nous parlons pour l'instant uniquement des avantages). <\/p>\n<p>Deuxi\u00e8mement, nous obtenons directement de l'ordre du sujet. <b>Event Sourcing<\/b> et <b>CQRS<\/b>. <br \/>\nTroisi\u00e8mement, Axon fournit une infrastructure pr\u00eate \u00e0 l'emploi et nous devons nous concentrer uniquement sur le d\u00e9veloppement de la logique m\u00e9tier.<\/p>\n<p>Commen\u00e7ons.<\/p>\n<p>Notre projet sera sous gradle. Il comportera trois modules : <\/p>\n<ul>\n<li> common. module avec des structures de donn\u00e9es communes (nous n'aimons pas le copi\u00e9-coll\u00e9);<\/li>\n<li> tradeCreator. module avec un microservice pour la r\u00e9ception des transactions via Rest;<\/li>\n<li> tradeQueries. module avec un microservice pour l'affichage de la position.<\/li>\n<\/ul>\n<p>\nPrenons Spring Boot comme base et ajoutons le starter d'Axon.<\/p>\n<p>Axon fonctionne tr\u00e8s bien m\u00eame sans Spring, mais nous allons les utiliser ensemble.<\/p>\n<p>Ici, il faut s'arr\u00eater un instant et dire quelques mots sur Axon. <\/p>\n<p>C'est un syst\u00e8me client-serveur. Il y a un serveur - c'est une application distincte, que nous allons ex\u00e9cuter dans Docker. <\/p>\n<p>Et il y a des clients qui s'int\u00e8grent dans des microservices. <br \/>\nCela donne un aper\u00e7u g\u00e9n\u00e9ral. D'abord, le serveur Axon (dans Docker) est d\u00e9marr\u00e9, puis nos microservices. <\/p>\n<p>Au d\u00e9marrage, les microservices recherchent le serveur et commencent \u00e0 interagir avec lui. L'interaction peut \u00eatre grossi\u00e8rement divis\u00e9e en deux types : technique et commerciale. <\/p>\n<p>Technique - c'est l'\u00e9change de messages 'je suis en vie' (ces messages peuvent \u00eatre vus en mode de journalisation debug). <\/p>\n<p>Commerciale - c'est l'\u00e9change de messages comme 'nouvelle transaction'.<\/p>\n<p>Une caract\u00e9ristique importante, apr\u00e8s le d\u00e9marrage, le microservice peut demander au serveur Axon 'que s'est-il pass\u00e9' et le serveur transmet les \u00e9v\u00e9nements accumul\u00e9s au microservice. De cette mani\u00e8re, le microservice peut \u00eatre red\u00e9marr\u00e9 relativement en toute s\u00e9curit\u00e9 sans perdre de donn\u00e9es. <br \/>\nAvec ce syst\u00e8me d'\u00e9change, nous pouvons facilement lancer de nombreux exemplaires de microservices, <br \/>\net ce, sur des h\u00f4tes diff\u00e9rents.<\/p>\n<p>Oui, un seul exemplaire d'Axon-serveur n'est pas fiable, mais pour l'instant, c'est comme \u00e7a.<\/p>\n<p>Nous travaillons dans les paradigmes Event Sourcing et CQRS. Cela signifie que nous devons avoir des 'commandes', des '\u00e9v\u00e9nements' et des 'projections'. <\/p>\n<p>Nous aurons une commande : 'cr\u00e9er une transaction', un \u00e9v\u00e9nement 'transaction cr\u00e9\u00e9e' et trois projections : 'montrer toutes les transactions', 'montrer la position', 'montrer la position par instrument'.<\/p>\n<p>Le sch\u00e9ma de travail est le suivant : <\/p>\n<ol>\n<li> Le microservice tradeCreator re\u00e7oit une transaction par Rest.<\/li>\n<li> Le microservice tradeCreator cr\u00e9e une commande 'cr\u00e9er une transaction' et l'envoie au serveur Axon.<\/li>\n<li> Le serveur Axon re\u00e7oit la commande et la transmet au destinataire concern\u00e9, dans notre cas, c'est le microservice tradeCreator.<\/li>\n<li> Le microservice tradeCreator re\u00e7oit la commande, forme l'\u00e9v\u00e9nement 'transaction cr\u00e9\u00e9e' et l'envoie au serveur Axon.<\/li>\n<li> Le serveur Axon re\u00e7oit l'\u00e9v\u00e9nement et le transmet aux abonn\u00e9s int\u00e9ress\u00e9s.<\/li>\n<li> Actuellement, nous n'avons qu'un seul destinataire int\u00e9ress\u00e9 - c'est le microservice tradeQueries.<\/li>\n<li> Le microservice tradeQueries re\u00e7oit l'\u00e9v\u00e9nement et met \u00e0 jour ses donn\u00e9es internes.<\/li>\n<\/ol>\n<p>\n(Il est important que, au moment de la cr\u00e9ation de l'\u00e9v\u00e9nement, le microservice tradeQueries puisse ne pas \u00eatre disponible, mais d\u00e8s qu'il sera d\u00e9marr\u00e9, il recevra imm\u00e9diatement l'\u00e9v\u00e9nement).<\/p>\n<p>Oui, le serveur Axon est au centre des communications, tous les messages passent par lui.<\/p>\n<p><i>Passons au codage.<\/i><\/p>\n<p>Pour ne pas surcharger le post avec du code, je vais fournir ci-dessous seulement des fragments, le lien vers l'exemple complet sera plus bas.<\/p>\n<p>Commen\u00e7ons par le module g\u00e9n\u00e9ral common.<\/p>\n<p>Les parties communes comprennent l'\u00e9v\u00e9nement (class CreatedTradeEvent). Notez la nomination, c'est en fait le nom de la commande qui a g\u00e9n\u00e9r\u00e9 cet \u00e9v\u00e9nement, mais au pass\u00e9. Au pass\u00e9, car d'abord la commande appara\u00eet, entra\u00eenant la cr\u00e9ation de l'\u00e9v\u00e9nement.<\/p>\n<p>Les autres structures communes incluent des classes pour d\u00e9crire la position (class Position), la transaction (class Trade) et le c\u00f4t\u00e9 de la transaction (enum Side), c'est-\u00e0-dire achat ou vente.<\/p>\n<p>Passons au module tradeCreator. <\/p>\n<p>Ce module dispose d'une interface Rest (class TradeController) pour recevoir des transactions. <br \/>\nLa transaction re\u00e7ue est transform\u00e9e en commande \u00ab cr\u00e9er une transaction \u00bb et envoy\u00e9e au serveur 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>\nLa commande est trait\u00e9e par la classe class TradeAggregate. <br \/>\nPour qu'Axon le trouve, nous mettons l'annotation @Aggregate.<br \/>\nLa m\u00e9thode pour traiter la commande ressemble \u00e0 ceci (avec un raccourci) :<\/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>\nDe la commande, un \u00e9v\u00e9nement est g\u00e9n\u00e9r\u00e9 et envoy\u00e9 au serveur.<br \/>\nLa commande se trouve dans la classe CreateTradeCommand.<\/p>\n<p>Voyons maintenant le dernier module tradeQueries.<\/p>\n<p>Les requ\u00eates sont d\u00e9crites dans le paquet queries.<br \/>\nCe module dispose \u00e9galement d'une interface Rest<br \/>\npublic class TradeController.<\/p>\n<p>Pour exemple, regardons le traitement de la requ\u00eate : \u00ab montrer toutes les transactions \u00bb.<\/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>\nUne requ\u00eate de s\u00e9lection est cr\u00e9\u00e9e et envoy\u00e9e au serveur.<\/p>\n<p>La requ\u00eate de s\u00e9lection est trait\u00e9e par la classe TradesEventHandler.<br \/>\nIl y a une m\u00e9thode marqu\u00e9e avec l'annotation<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nC'est cette m\u00e9thode qui est responsable de la s\u00e9lection des donn\u00e9es de la m\u00e9moire.<\/p>\n<p>La question se pose, comment les informations sont-elles mises \u00e0 jour dans cette m\u00e9moire ? <\/p>\n<p>Commen\u00e7ons par le fait que c'est simplement un ensemble de ConcurrentHashMap, adapt\u00e9es \u00e0 des s\u00e9lections sp\u00e9cifiques. <br \/>\nPour leur mise \u00e0 jour, la m\u00e9thode suivante est utilis\u00e9e :<\/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>\nIl re\u00e7oit l'\u00e9v\u00e9nement \u00ab transaction cr\u00e9\u00e9e \u00bb et met \u00e0 jour les Maps.<\/p>\n<p>Ce sont les points cl\u00e9s du d\u00e9veloppement des microservices.<\/p>\n<p><i>Que peut-on dire sur les inconv\u00e9nients d'Axon ?<\/i><\/p>\n<p>Tout d'abord, cela complique l'infrastructure, une nouvelle point de d\u00e9faillance appara\u00eet - le serveur Axon, toutes les communications passent par lui. <\/p>\n<p>Ensuite, on voit tr\u00e8s clairement le probl\u00e8me des syst\u00e8mes distribu\u00e9s similaires - l'incoh\u00e9rence temporelle des donn\u00e9es. Dans notre cas, l'obtention d'une nouvelle transaction et la mise \u00e0 jour des donn\u00e9es pour les s\u00e9lections peuvent prendre un temps inacceptable.<\/p>\n<p><i>Qu'est-ce qui reste en dehors du cadre ?<\/i><\/p>\n<p>Rien n'est dit sur l'Event Sourcing et le CQRS, ce que c'est et pourquoi c'est n\u00e9cessaire.<br \/>\nSans expliquer ces concepts, certains points pourraient rester flous.<\/p>\n<p>Peut-\u00eatre que certains fragments de code n\u00e9cessitent \u00e9galement des explications.<\/p>\n<p>Nous en parlerons lors de <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">un webinaire ouvert<\/a><\/noindex> le 21 septembre.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Un exemple complet<\/a><\/noindex>.<br \/>\n<br \/>Source : <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 - 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\/fr\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Microservices avec communication via Axon | ProHoster","description":"Dans ce tutoriel simple, nous allons cr\u00e9er quelques microservices avec Spring Boot et organiser leur interaction via le cadre Axon.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}