{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/micronaut--introduction-tutorial-article","result":{"data":{"markdownRemark":{"id":"08f397b2-6b19-51ac-b4b6-ce2372871491","html":"<p>En la batalla por los mejores frameworks para micro-servicios existen una gran cantidad de contendientes y con variados lenguajes de programación que ofrecen la simplicidad y escalabilidad de un micro-servicio. En JAVA el principal framework que se viene a la mente es SPRING que ha sido y es uno de loas frameworks de JAVA mas robustos.</p>\n<p>Pero porque la tendencia de desarrollo de micro-servicios esta siendo mas abarcada por otros lenguajes tales como NodeJS, GOLANG, entre otros; esto principalmente debido a que el generar imágenes docker de JAVA resulta pesado y tiende a tener un elevado consumo de recursos a pesar de generar micro-servicios simples, además que dentro de JAVA ya existen diferentes alternativas para reducir este consumo de recursos pero que requiere configuraciones extra, cosa que sus contrincantes lo hacen dentro de su configuración normal.</p>\n<p>En este articulo no discutiremos cual es la mejor o peor tecnología para crear micro-servicios ya que eso depende en gran medida del alcance del proyecto y la arquitectura sobre la cual se desarrolla, el objetivo de este articulo es mostrar las nuevas tecnologías que rodean a JAVA orientadas al desarrollo de micro-servicios que buscan reducir al máximo el tamaño de la imagen de docker y consumo de recursos de una aplicación JAVA.</p>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQHb_swZ6u7PaQ/article-inline_image-shrink_1000_1488/0?e=1587600000&amp;v=beta&amp;t=WocOGBB5ZUolu7QpJSWTzEfYdElowzE-W9YM8bOwlSY\" alt=\"java-microservices-example\">\n\t<figcaption>https://www.scnsoft.com/blog/java-microservices-example</figcaption>\n</figure>\n<p>Micronaut se levanta entre algunos competidores tales como QUARKUS(<a href=\"https://quarkus.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://quarkus.io/</a>) o HELIDON(<a href=\"https://helidon.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://helidon.io/</a>) que tiene por detrás al mismo Oracle, en este caso se ha optado por MICRONAUT(<a href=\"https://micronaut.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://micronaut.io/</a>) basándose netamente en el tamaño de la comunidad para tener mayor acceso a información y soporte sobre algunos problemas que se encuentren el camino. Se puede revisar la comparación de los tres frameworks antes mencionadas en la siguiente dirección (<a href=\"https://itaffinity.wordpress.com/2019/05/16/graal-native-images-quarkus-micronaut-helidon/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://itaffinity.wordpress.com/2019/05/16/graal-native-images-quarkus-micronaut-helidon/</a>)</p>\n<p>En este articulo se pretende realizar un proyecto base de un micro-servicio que tenga una conexión a una base de datos(Postgresql) y exponga un CRUD de una tabla, todo esto para al final generar una imagen de docker y verificar el tamaño final de nuestro proyecto ya dockerizado.</p>\n<h3 id=\"requisitos\" style=\"position:relative;\"><a href=\"#requisitos\" aria-label=\"requisitos permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Requisitos:</h3>\n<ul>\n<li>Se necesita tener una instalación solida de JAVA por lo que se recomienda instalar SDKMAN (<a href=\"https://sdkman.io/install\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://sdkman.io/install</a>) una herramienta útil a la hora de controlar las versiones de JAVA</li>\n<li>Cliente de Micronaut instalado (<a href=\"https://micronaut.io/download.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://micronaut.io/download.html</a>)</li>\n<li>Docker funcional y corriendo (<a href=\"https://docs.docker.com/install/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://docs.docker.com/install/</a>)</li>\n<li>\n<p>Postgresql > 9</p>\n<h3 id=\"alcance\" style=\"position:relative;\"><a href=\"#alcance\" aria-label=\"alcance permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alcance:</h3>\n<p>El proyecto se basa en una gestión de tareas por hacer, en donde se crea una tarea y esta puede estar en tres estados pendiente, en proceso y finalizada.</p>\n</li>\n</ul>\n<p>Para esto se creara una sola tabla que contenga la descripción de la tarea, la fecha de creación y su estado.</p>\n<h3 id=\"proyecto\" style=\"position:relative;\"><a href=\"#proyecto\" aria-label=\"proyecto permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Proyecto:</h3>\n<p>En un terminal procedemos a ejecutar el siguiente comando:</p>\n<p><code class=\"language-text\">mn create-app com.up.base --features=graal-native-image</code></p>\n<p>Este comando permite generar un proyecto Micronaut que usa el paquete principal bajo el nombre de com.up.base y con la variante de imágenes nativas mediante la siguiente bandera —features=graal-native-image, GraalVM esn una tecnología que no se discutirá en este articulo pero es interesante como mediante este proyecto se busca realizar una ejecución nativa de JAVA para ms información en su pagina oficial (<a href=\"https://www.graalvm.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://www.graalvm.org/</a>). Se genera una carpeta con el nombre de nuestro proyecto el cual tiene la siguiente estructura:</p>\n<p>Para verificar si esta todo correcto en un terminal accedemos a la carpeta en donde se encuentra el gradlew del proyecto ejecutamos:</p>\n<p><code class=\"language-text\">./gradlew run</code></p>\n<p>Resultado de la ejecución\nAhora se procede con la configuración de Postgres, JPA y Lombok librerías necesarias para la conexión a la base de datos y desarrollo mas acelerado. Para esto se configura el archivo build.gradle</p>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQEGIcte0IVMBA/article-inline_image-shrink_1500_2232/0?e=1587600000&amp;v=beta&amp;t=8bz0qfo1Qmf25YJd6bVcl4_53b7IsnFaB54P1jh_fs4\" alt=\"microservice_micronaut_base/blob/master/base/build.gradle\">\n\t<figcaption>Fuente: https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/build.gradle</figcaption>\n</figure>\n<p>Ahora se configura las dependencias mediante el archivo de configuración del proyecto <strong>application.yml:</strong></p>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQEXLOv-kKrUaQ/article-inline_image-shrink_1500_2232/0?e=1587600000&amp;v=beta&amp;t=QMgMpGPF_E_WG3tXDwjTd32Dw2XjuEo62X7EEl_Nt-M\" alt=\"microservice_micronaut_base/blob/master/base/src/main/resources/application.yml\">\n\t<figcaption>Fuente: https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/src/main/resources/application.yml</figcaption>\n</figure>\n<p><strong>Nota: Tener en cuenta la cadena de conexión a la base de datos y que la misma este creada dentro de postgresql.</strong></p>\n<p>Configuradas las dependencias se procede a crear el dominio de la aplicación que consta de servicios de dominio y modelos, además de los repositorios de acceso a la base de datos y controladores http.</p>\n<ol>\n<li>Modelo de tarea - <a href=\"https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/src/main/java/com/up/domain/model/Task.java\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ver archivo</a></li>\n<li>Repositorio de tarea - <a href=\"https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/src/main/java/com/up/infraestructure/repository/ITaskRepository.java\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ver archivo</a></li>\n<li>Servicio de dominio de tarea - <a href=\"https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/src/main/java/com/up/domain/service/TaskService.java\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ver archivo</a></li>\n<li>Controlador http de tarea - <a href=\"https://github.com/FabianBG/microservice_micronaut_base/blob/master/base/src/main/java/com/up/application/controller/http/TaskController.java\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ver archivo</a></li>\n</ol>\n<p>Generado el código correspondiente se ejecuta el proyecto y podemos probar los servicios que se ejecuten correctamente mediante cualquier cliente REST.</p>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQG4Zofhsmhn0A/article-inline_image-shrink_1500_2232/0?e=1587600000&amp;v=beta&amp;t=RBn-OZqcZvJK5w9E2IqokteqLbzJKQwl55wi2bPrjd4\">\n</figure>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQGnoLBzEbhjUg/article-inline_image-shrink_1500_2232/0?e=1587600000&amp;v=beta&amp;t=hbepVtaA3bhIJ7G9H0BRHg2h4ATCSChj5KphoXwhpGw\">\n</figure>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C4E12AQEnFq66Gf6eDA/article-inline_image-shrink_1000_1488/0?e=1587600000&amp;v=beta&amp;t=k82dBBMvq-ul-Y8nxB_UJ9-2WBnrZmm9HffHyW5U7KY\">\n</figure>\n<p>Ahora para finalizar nuestro pequeño experimento vamos se generará una imagen nativa de docker del proyecto, para esto se procede a ejecutar el siguiente comando:</p>\n<p>Nota: dependiendo de la base de datos usada hay que configurar ciertos argumentos para la generación correcta de la imagen, mas información en el siguiente link (<a href=\"https://github.com/micronaut-projects/micronaut-data/blob/master/src/main/docs/guide/graal/graalJDBC.adoc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/micronaut-projects/micronaut-data/blob/master/src/main/docs/guide/graal/graalJDBC.adoc</a>)</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">./gradlew assemble\n\n\n./docker-build.sh</code></pre></div>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C5612AQGmDzGXjYTcUQ/article-inline_image-shrink_1000_1488/0?e=1587600000&amp;v=beta&amp;t=1CBYG--ly9d5gzbzvMm8fufOy-bC2JvMfgp_kHD-_yc\">\n</figure>\n<figure>\n\t<img src=\"https://media-exp1.licdn.com/dms/image/C5612AQGSPtwKNxg9xw/article-inline_image-shrink_1500_2232/0?e=1587600000&amp;v=beta&amp;t=aw0oF8NWBzbbeGZOLfGZ33th_MOBtEf2QqxEMrziTJM\">\n</figure>\n<h3 id=\"conclusiones\" style=\"position:relative;\"><a href=\"#conclusiones\" aria-label=\"conclusiones permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusiones:</h3>\n<p>En conclusión Micronaut es un framework de desarrollo de micro-servicios similar a Spring que toma lo mejor del mismo para un desarrollo rápido y mejora la compatibilidad con docker rápidamente sin configuraciones externas, adicionalmente de tener soporte para generar imágenes nativas que reducen aun mas el tamaño de imagen y optimizan la ejecución del código mejorando el uso de recursos.</p>","fields":{"slug":"/posts/micronaut--introduction-tutorial-article","tagSlugs":["/tag/tutorial/","/tag/micronaut/","/tag/java/","/tag/microservices/"]},"frontmatter":{"date":"2020-01-31T22:40:32.169Z","description":"Rapida introducción al desarrollo de microservicios en micronauta.","tags":["Tutorial","Micronaut","Java","Microservices"],"title":"Micro-servicios en JAVA ? - Micronaut una solución amigable para los devops","socialImage":"https://media-exp1.licdn.com/dms/image/C4E12AQG72Jbn1yF4mg/article-cover_image-shrink_600_2000/0?e=1587600000&v=beta&t=xb1hSQWVMWJ5Lf1_fJsX2l6WOpXkkDqAePHC-mCo_YI"}}},"pageContext":{"slug":"/posts/micronaut--introduction-tutorial-article"}}}