Saltar a contenido

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

Ver instroducción a 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
Se crea la estructura java con el main:
package hello.micronaut;
import io.micronaut.runtime.Micronaut;
public class Application {
    public static void main(String[] args) {
        Micronaut.run(Application.class);
    }
}
Y se puede iniciar el servidor ejecutando la app.
Para añadir puntos de terminación (urls para servir) se crean controladores en ficheros del mismo paquete:

HelloControleer.java
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

  1. Preparación
    Añadir la dependencia de motor de templates.
    El directorio para los templates y views por defecto es src/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"))
    }

}
El parámetro de @View es el nombre que utilizaremos para renderizar una vista

  1. 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));
    }

}
Y utilizar la anotación @Introspected en el objeto POJO para crear BeanIntrospection de Java.

  1. 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>
Que se pueden configurar consultado este enlace

Incluimos la Thymeleaf template::

src/main/resources/views/home.html
<!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>
and layout:

src/main/resources/views/layoutFile.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

revisar

No es necesario añadir llamadas en app para que funcione el controlador.

25.6 Autenticación

Documentación oficial

25.6.1 Aut básica

Ejemplo
y el manual sobre seguridad

25.6.2 Autentificación basado en sesion

Ejemplo

25.7 Enlaces