{"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\/es\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","title":{"rendered":"Microservicios con comunicaci\u00f3n a trav\u00e9s de Axon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En este tutorial sencillo, crearemos un par de microservicios en Spring Boot y organizaremos la interacci\u00f3n entre ellos a trav\u00e9s del marco de trabajo Axon.<\/p>\n<p><img decoding=\"async\" alt=\"Microservicios con comunicaci\u00f3n a trav\u00e9s de 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>Supongamos que tenemos esta tarea.<\/i><\/p>\n<p>Hay una fuente de transacciones en el mercado de valores. Esta fuente nos transmite las transacciones a trav\u00e9s de una API REST. <\/p>\n<p>Necesitamos obtener estas transacciones, almacenarlas en una base de datos y crear un almacenamiento en memoria conveniente. <\/p>\n<p>Este almacenamiento debe cumplir las siguientes funciones:<\/p>\n<ul>\n<li> devolver una lista de operaciones;<\/li>\n<li> devolver la posici\u00f3n completa, es decir, una tabla de \"instrumento\" \u2014 \"cantidad actual de t\u00edtulos\";<\/li>\n<li> devolver la posici\u00f3n para un instrumento espec\u00edfico.<\/li>\n<\/ul>\n<p>\n<i>\u00bfC\u00f3mo abordaremos la soluci\u00f3n a esta tarea? <\/i><\/p>\n<p>Siguiendo los preceptos de la moda de microservicios, debemos dividir la tarea en microservicios compuestos:<\/p>\n<ul>\n<li> obtener transacciones a trav\u00e9s de REST;<\/li>\n<li> almacenar las transacciones en la base de datos;<\/li>\n<li> almacenamiento en memoria para presentar los datos de la posici\u00f3n.<\/li>\n<\/ul>\n<p>\nEn el marco de este tutorial, haremos el primer y el tercer servicio, dejando el segundo para la segunda parte (escriba en los comentarios si esto le interesa).<\/p>\n<p>As\u00ed que tenemos dos microservicios. <\/p>\n<p>El primero obtiene datos del exterior. <\/p>\n<p>El segundo procesa estos datos y responde a las solicitudes entrantes. <\/p>\n<p>Por supuesto, queremos lograr escalabilidad horizontal, actualizaciones sin tiempo de inactividad y otras ventajas de los microservicios.<\/p>\n<p><i>\u00bfCu\u00e1l es la tarea, bastante dif\u00edcil, que tenemos por delante?<\/i><\/p>\n<p>En realidad son muchas, pero ahora hablemos de c\u00f3mo fluir\u00e1n los datos entre estos microservicios. Tambi\u00e9n podemos hacer REST entre ellos, podemos poner alguna cola, hay muchas ideas con sus pros y contras.<\/p>\n<p>Consideremos uno de los enfoques posibles: interacci\u00f3n asincr\u00f3nica a trav\u00e9s de <b>Marco Axon<\/b>.<\/p>\n<p><i>\u00bfCu\u00e1les son las ventajas de esta soluci\u00f3n?<\/i><\/p>\n<p>Primero, la interacci\u00f3n asincr\u00f3nica aumenta la flexibilidad (s\u00ed, hay una desventaja, pero por ahora solo estamos hablando de ventajas). <\/p>\n<p>En segundo lugar, obtenemos directamente <b>Event Sourcing<\/b> y <b>CQRS<\/b>. <br \/>\nEn tercer lugar, Axon proporciona una infraestructura lista para usar, y solo necesitamos concentrarnos en el desarrollo de la l\u00f3gica de negocio.<\/p>\n<p>Comencemos.<\/p>\n<p>Nuestro proyecto estar\u00e1 basado en Gradle. Tendr\u00e1 tres m\u00f3dulos: <\/p>\n<ul>\n<li> common. m\u00f3dulo con estructuras de datos comunes (no nos gusta copiar y pegar);<\/li>\n<li> tradeCreator. m\u00f3dulo con el microservicio para recibir transacciones a trav\u00e9s de REST;<\/li>\n<li> tradeQueries. m\u00f3dulo con el microservicio para mostrar la posici\u00f3n.<\/li>\n<\/ul>\n<p>\nTomaremos Spring Boot como base y conectaremos el starter de Axon.<\/p>\n<p>Axon funciona excelentemente sin Spring, pero los utilizaremos juntos.<\/p>\n<p>Aqu\u00ed es necesario detenerse y comentar un poco sobre Axon. <\/p>\n<p>Es un sistema cliente-servidor. Hay un servidor, que es una aplicaci\u00f3n independiente, la vamos a ejecutar en Docker. <\/p>\n<p>Y hay clientes que se integran en microservicios. <br \/>\nAs\u00ed que la imagen es la siguiente. Primero se inicia el servidor Axon (en Docker), luego nuestros microservicios. <\/p>\n<p>Al iniciar, los microservicios buscan el servidor y comienzan a interactuar con \u00e9l. La interacci\u00f3n se puede dividir condicionalmente en dos tipos: t\u00e9cnica y de negocio. <\/p>\n<p>T\u00e9cnica: es el intercambio de mensajes como 'estoy vivo' (se pueden ver esos mensajes en modo de depuraci\u00f3n). <\/p>\n<p>De negocio: son mensajes como 'nuevo trato'.<\/p>\n<p>Una caracter\u00edstica importante es que, despu\u00e9s de iniciar, el microservicio puede preguntar al servidor Axon '\u00bfqu\u00e9 ha ocurrido?' y el servidor env\u00eda al microservicio los eventos acumulados. De esta manera, el microservicio puede reiniciarse de manera bastante segura sin p\u00e9rdida de datos. <br \/>\nCon este esquema de intercambio, podemos iniciar muchos instancias de microservicios muy f\u00e1cilmente, <br \/>\nincluso en diferentes hosts.<\/p>\n<p>S\u00ed, una instancia del servidor Axon no es fiable, pero por ahora es as\u00ed.<\/p>\n<p>Trabajamos en las paradigmas de Event Sourcing y CQRS. Esto significa que debemos tener 'comandos', 'eventos' y 'consultas'. <\/p>\n<p>Tendremos un comando: 'crear trato', un evento 'trato creado' y tres consultas: 'mostrar todos los tratos', 'mostrar posici\u00f3n', 'mostrar posici\u00f3n por instrumento'.<\/p>\n<p>El esquema de trabajo resulta ser el siguiente: <\/p>\n<ol>\n<li> El microservicio tradeCreator recibe el trato a trav\u00e9s de Rest.<\/li>\n<li> El microservicio tradeCreator crea el comando 'crear trato' y lo env\u00eda al servidor Axon.<\/li>\n<li> El servidor Axon recibe el comando y lo reenv\u00eda al destinatario interesado, en nuestro caso, el microservicio tradeCreator.<\/li>\n<li> El microservicio tradeCreator recibe el comando, forma el evento 'trato creado' y se lo env\u00eda al servidor Axon.<\/li>\n<li> El servidor Axon recibe el evento y lo reenv\u00eda a los suscriptores interesados.<\/li>\n<li> Actualmente solo tenemos un destinatario interesado: es el microservicio tradeQueries.<\/li>\n<li> El microservicio tradeQueries recibe el evento y actualiza sus datos internos.<\/li>\n<\/ol>\n<p>\n(Es importante que en el momento de la formaci\u00f3n del evento, el microservicio tradeQueries puede no estar disponible, pero tan pronto como se inicie, recibir\u00e1 el evento de inmediato).<\/p>\n<p>S\u00ed, el servidor Axon est\u00e1 en el centro de las comunicaciones, todos los mensajes pasan a trav\u00e9s de \u00e9l.<\/p>\n<p><i>Pasemos a la codificaci\u00f3n.<\/i><\/p>\n<p>Para no saturar la publicaci\u00f3n con c\u00f3digo, a continuaci\u00f3n solo incluir\u00e9 fragmentos, la enlace al ejemplo completo estar\u00e1 m\u00e1s abajo.<\/p>\n<p>Empecemos con el m\u00f3dulo com\u00fan.<\/p>\n<p>En \u00e9l, las partes comunes son el evento (class CreatedTradeEvent). Tenga en cuenta la nomenclatura, esencialmente es el nombre del comando que gener\u00f3 este evento, pero en pasado. En pasado porque primero aparece el comando, que lleva a la creaci\u00f3n del evento.<\/p>\n<p>Otras estructuras comunes son las clases para describir una posici\u00f3n (class Position), una operaci\u00f3n (class Trade) y la parte de la operaci\u00f3n (enum Side), es decir, compra o venta.<\/p>\n<p>Pasemos al m\u00f3dulo tradeCreator. <\/p>\n<p>Este m\u00f3dulo tiene una interfaz Rest (class TradeController) para recibir operaciones. <br \/>\nDe la operaci\u00f3n recibida se forma el comando 'crear operaci\u00f3n' y se env\u00eda al servidor 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>\nPara procesar el comando se utiliza la clase class TradeAggregate. <br \/>\nPara que Axon lo encuentre, colocamos la anotaci\u00f3n @Aggregate.<br \/>\nEl m\u00e9todo para procesar el comando se ve as\u00ed (con abreviaciones):<\/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>\nDel comando se forma un evento y se env\u00eda al servidor.<br \/>\nEl comando se encuentra en la clase CreateTradeCommand.<\/p>\n<p>Ahora veamos el \u00faltimo m\u00f3dulo tradeQueries.<\/p>\n<p>Las consultas se describen en el paquete queries.<br \/>\nEn este m\u00f3dulo tambi\u00e9n hay una interfaz Rest.<br \/>\npublic class TradeController.<\/p>\n<p>Como ejemplo, veamos el manejo de la solicitud: 'mostrar todas las operaciones'.<\/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 crea una solicitud de selecci\u00f3n y se env\u00eda al servidor.<\/p>\n<p>Para procesar la solicitud de selecci\u00f3n se utiliza la clase TradesEventHandler.<br \/>\nEn \u00e9l hay un m\u00e9todo marcado con la anotaci\u00f3n.<\/p>\n<pre><code class=\"java\">   @QueryHandler\n    public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)\n<\/code><\/pre>\n<p>\nEs el responsable de seleccionar datos del almacenamiento en memoria.<\/p>\n<p>Surge la pregunta de c\u00f3mo se actualiza la informaci\u00f3n en este almacenamiento. <\/p>\n<p>Empecemos por decir que es simplemente un conjunto de ConcurrentHashMap, dise\u00f1ados para consultas espec\u00edficas. <br \/>\nPara su actualizaci\u00f3n se aplica el m\u00e9todo:<\/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>\n\u00c9l recibe el evento \"trade creado\" y actualiza los Mapas.<\/p>\n<p>Estos son los aspectos clave del desarrollo de microservicios.<\/p>\n<p><i>\u00bfQu\u00e9 se puede decir sobre las desventajas de Axon?<\/i><\/p>\n<p>En primer lugar, esto complica la infraestructura, se introduce un punto de fallo: el servidor Axon, toda la comunicaci\u00f3n pasa a trav\u00e9s de \u00e9l. <\/p>\n<p>En segundo lugar, se manifiesta de manera muy clara una desventaja de este tipo de sistemas distribuidos: la inconsistencia temporal de los datos. En nuestro caso, entre recibir una nueva operaci\u00f3n y actualizar los datos para las consultas puede pasar un tiempo inaceptablemente largo.<\/p>\n<p><i>\u00bfQu\u00e9 ha quedado fuera de la vista?<\/i><\/p>\n<p>No se ha mencionado nada sobre Event Sourcing y CQRS, qu\u00e9 son y para qu\u00e9 sirven.<br \/>\nSin la explicaci\u00f3n de estos conceptos, algunos puntos podr\u00edan no haber quedado claros.<\/p>\n<p>Es posible que ciertos fragmentos de c\u00f3digo tambi\u00e9n requieran aclaraciones.<\/p>\n<p>De esto hablaremos en <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/WrwW\/\">un webinar abierto<\/a><\/noindex> el 21 de septiembre.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/petrelevich\/jvm-digging\/tree\/master\/eventSourcing\/axonTrader\">Ejemplo completo<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\udd47Microservicios con comunicaci\u00f3n a trav\u00e9s de Axon | ProHoster","description":"En este tutorial sencillo, crearemos un par de microservicios en Spring Boot y organizaremos la interacci\u00f3n entre ellos a trav\u00e9s del marco de trabajo Axon.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mikroservisy-s-kommunikacziej-cherez-axon","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/94393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=94393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/94393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/94394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=94393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=94393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=94393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}