24. Micronaut¶
Los microservicios es un paradigma de programación donde se pasa de una aplicación monolítica a servicios orientados al negocio.
Por ejemplo una tienda online se implementa con un servidor web que ejecuta nuestra aplicación que a su vez accede a una bd. Esta aplicación tiene módulos para pagos, pedidos, almacen etc. Para pasar a microservicios tendriamos app para cada uno de estos módulos ( que es el microservicio) Entre ellos deben intercambiar información, por ejemplo a través del api del microservicio (no a través de la base de datos )
25. Introducción micronaut¶
La arquitectura de las aplicaciones en Micronaut se basa en el patrón de diseño de Inversión de Control (IoC) y la programación reactiva. Micronaut está diseñado para ser un framework ligero y modular que se centra en la creación de microservicios.
El patrón de IoC en Micronaut se utiliza para la inyección de dependencias y la gestión de componentes. En Micronaut, los componentes son objetos que pueden ser inyectados en otros componentes o utilizados directamente. Micronaut también proporciona un modelo de programación reactiva que permite la gestión de flujos de datos asincrónicos y la escalabilidad.
La arquitectura de Micronaut se compone de varios módulos, cada uno con una funcionalidad específica. Estos módulos incluyen:
-
Micronaut Core: Proporciona la funcionalidad básica de IoC y la inyección de dependencias. Este módulo también proporciona la funcionalidad para trabajar con Micronaut Bean, que son los objetos gestionados por Micronaut.
-
Micronaut Web: Proporciona una implementación del patrón Modelo-Vista-Controlador (MVC) para el desarrollo de aplicaciones web. Este módulo también proporciona la funcionalidad para trabajar con tecnologías web, como HTTP y WebSocket.
-
Micronaut Data: Proporciona la funcionalidad para trabajar con bases de datos y otras tecnologías de persistencia, como JPA e Hibernate.
-
Micronaut Security: Proporciona una serie de características de seguridad, como la autenticación y la autorización, para aplicaciones web y servicios.
-
Test: Proporciona la funcionalidad para la prueba de aplicaciones Micronaut.
25.1 Patrón de diseño de Inversión de Control IoC¶
En lugar de que el programador controle el flujo de ejecución de la aplicación, la aplicación se encarga de controlar el flujo de ejecución. Esto se logra mediante la creación de objetos y la inyección de dependencias en lugar de crear y gestionar objetos manualmente.
El patrón de IoC se implementa a través de la inyección de dependencias, que es un proceso por el cual un objeto recibe sus dependencias de otro objeto en lugar de crearlos por sí mismo. En otras palabras, en lugar de crear objetos y gestionar las dependencias manualmente, la inyección de dependencias permite que el contenedor IoC cree y gestione los objetos y sus dependencias.
El contenedor IoC es el componente principal de la implementación del patrón de IoC. El contenedor IoC se encarga de crear y gestionar los objetos de una aplicación , y se asegura de que las dependencias de cada objeto estén disponibles cuando sea necesario. El contenedor IoC también proporciona la funcionalidad para configurar y personalizar los objetos y las dependencias, lo que permite una mayor flexibilidad y escalabilidad en el desarrollo de aplicaciones.
Existen dos tipos principales de IoC:
* la IoC basada en constructor y se refiere a la inyección de dependencias a través de los constructores de los objetos
* la IoC basada en setter. Se refiere a la inyección de dependencias a través de los métodos setter
Micronaut implementa IoC utilizando la inyección de dependencias (DI) y la gestión de componentes.
La inyección de dependencias en Micronaut se realiza a través de la anotación @Inject. Cuando se utiliza la anotación @Inject en una clase, Micronaut se encarga de instanciar y gestionar los objetos necesarios. Por ejemplo, si una clase necesita una instancia de otra clase como dependencia, Micronaut se encargará de instanciar y proporcionar esa instancia a través de la inyección de dependencias.
La gestión de componentes en Micronaut se realiza mediante la anotación @Singleton. Cuando se utiliza la anotación @Singleton en una clase, Micronaut crea una única instancia de esa clase y la gestiona durante todo el ciclo de vida de la aplicación.
Además de la inyección de dependencias y la gestión de componentes, Micronaut también proporciona un contenedor IoC (llamado Micronaut Application Context) que se encarga de la creación y gestión de los objetos y sus dependencias. El contenedor IoC de Micronaut es extremadamente ligero y rápido, lo que lo hace ideal para aplicaciones de microservicios.
La configuración del contenedor IoC de Micronaut se realiza a través de archivos de configuración, como application.yml o application.properties. En estos archivos de configuración, se pueden especificar las propiedades y valores de configuración necesarios para la creación de objetos y la inyección de dependencias.
25.2 Patrón de diseño de Progrmación Orientada a Aspectos (AOP)¶
El patrón de AOP permite la separación de las preocupaciones transversales (cross-cutting concerns) de una aplicación, como la gestión de transacciones, el registro de logs y la seguridad. AOP permite agregar estas funcionalidades en una aplicación sin tener que modificar el código principal de la aplicación.
25.3 Programación reactiva¶
25.4 Instalación de Micronaut¶
Seguimos el método recomendado en micronaut :
1. Linux o WSL en windows, abrimos terminal
2. Instalamos sdkman
3. Abrimos nueva terminal o ejecutamos source "$HOME/.sdkman/bin/sdkman-init.sh"
4. Ejecutamos sdk install micronaut
5. Comprobamos la versión mn --version
25.4.1 Usando web online¶
Rellenamos el formulario y descargamos el resultado, por ejemplo para maven Java o hacer un "push" a github.
25.5 Inicio rápido¶
Se puede crear una nueva aplicación usando la herramienta de micronaut:
mn create-app hello-micronaut -build maven
package hello.micronaut;
import io.micronaut.runtime.Micronaut;
public class Application {
public static void main(String[] args) {
Micronaut.run(Application.class);
}
}
Para añadir puntos de terminación (urls para servir) se crean controladores en ficheros del mismo paquete:
package hello.micronaut;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
@Controller("/hello")
public class HelloController {
@Get("/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld(String name) {
return "Hello " + name;
}
}
25.5.1 Micronaut views¶
Para la integración de micronaut con "Server Side View Rendering, ver documentación.
No es el objetivo principal de micronaut pero a veces se necesita crear las páginas en el servidor (render). Seguimos estos pasos:
25.5.1.1 Introducción¶
- Preparación
Añadir la dependencia de motor de templates.
El directorio para los templates y views por defecto essrc/main/resources/views
En el controlador tenemos varias formas de crear las vistas:
1. Usando la notación @View y devolviendo un objeto java.util.Map
:
@Controller("/views")
class ViewsController {
@View("home")
@Get("/")
public HttpResponse index() {
return HttpResponse.ok(CollectionUtils.mapOf("loggedIn", true, "username", "sdelamo"))
}
}
- Devolver un objeto POJO y las propiedades del POJO se exponen a la vista.
@Controller("/views")
class ViewsController {
@View("home")
@Get("/pogo")
public HttpResponse<Person> pogo() {
return HttpResponse.ok(new Person("sdelamo", true));
}
}
- Usar
ModelAndView
en lugar de la notación@View
@Controller("/views")
class ViewsController {
@Get("/modelAndView")
ModelAndView modelAndView() {
return new ModelAndView("home",
new Person("sdelamo", true))
}
Incluso el método del controlador puede usar la anotación @Introspected en lugar de en el POJO
@View("fruits")
@Get
<---REVISAR , parece faltar la notación
public Fruit index() {
return new Fruit("apple", "red");
}
25.5.1.2 Thymeleaf¶
Micronaut Views Thymeleaf includes ThymeleafViewsRenderer which uses the Thymeleaf Java template engine.
Incluimos las dependencias Maven
<dependency>
<groupId>io.micronaut.views</groupId>
<artifactId>micronaut-views-thymeleaf</artifactId>
</dependency>
Incluimos la Thymeleaf template::
<!DOCTYPE html>
<html lang="en" th:replace="~{layoutFile :: layout(~{::title}, ~{::section})}" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<section>
<h1 th:if="${loggedIn}">username: <span th:text="${username}"></span></h1>
<h1 th:unless="${loggedIn}">You are not logged in</h1>
</section>
</body>
</html>
<!DOCTYPE html>
<html th:fragment="layout (title, content)" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:replace="${title}">Layout Title</title>
</head>
<body>
<h1>Layout H1</h1>
<div th:replace="${content}">
<p>Layout content</p>
</div>
<footer>
Layout footer
</footer>
</body>
</html>
Un ejemplo de micronaut con Thymeleaf
25.5.2 Creando un cliente¶
No es necesario añadir llamadas en app para que funcione el controlador.
25.6 Autenticación¶
25.6.1 Aut básica¶
Ejemplo
y el manual sobre seguridad
25.6.2 Autentificación basado en sesion¶
25.7 Enlaces¶
- web oficial
- Documentación ultima versión
- Introducción rápida