Arquitectura de Microservicios (MSA)
Hoy vamos a hablar del Diseño Dirigido por el Dominio (DDD) y microservicios con Spring y Java +8. Este artículo pretende ser un kit de inicio en el que encontrar:
- Vista de DDD.
- Spring y springboot con ejemplos principales y anotaciones.
- Spring core sobre ejemplos principales y anotaciones.
- Spring data, patrones y algunas utilidades:
- jpa
- lombok
- mapstruct
- jackson
- jbxb
Para facilitar el seguimiento de esta entrada, hemos preparado un archivo PDF con los contenidos:
Entorno Tecnológico
Dicho esto, pasemos a ver las herramientas y tecnologías que serán utilizadas para el entorno del Producto:
Herramientas de desarrollo
Herramienta | URL | Versión | Información |
---|---|---|---|
Spring Tool Suite | https://spring.io/tools | Spring Tools 4 para Eclipse | El Spring Tool Suite es un entorno de desarrollo basado en Eclipse que esta modificado para desarrollar aplicaciones Spring. |
Maven | https://maven.apache.org/ | Maven 3.5 o superior | Apache Maven es una herramienta para la administración y comprensión de un proyecto software. |
Git / Gitlab | https://about.gitlab.com/ | – | Gitlab es un servicio web para el versionado de control y el desarrollo colaborativo basado en Git. |
Sourcetree | https://www.sourcetreeapp.com/ | Sourcetree 3 o superior | Sourcetree es una GUI basada en Git que ofrece una representación visual de tus repositorios. Sourcetree es un cliente Git gratuito para Windows y Mac. |
Junit | https://junit.org/junit5/ | Junit 5 o superior | JUnit es un framework open-source con el propósito de escribir y ejecutar test en el lenguaje de programación Java. (Implementado con Mockito 2.X https://site.mockito.org/) Maven Plugins: JaCoCo Maven plug-in proporciona el agente en tiempo de ejecución de JaCoCo a tus test y permite la creación de reportes básicos. |
Sonarqube | https://www.sonarqube.org/ | Sonarqube 7 o superior | Sonarqube es una plataforma open-source desarrollada por SonarSource para la continua inspección de la calidad de código para realizar revisiones automáticas con un análisis estático del código para detectar bugs, code smells, y vulnerabilidades en la seguridad. |
Jenkins | https://jenkins.io/ | Jenkins 2 o superior | Jenkins es un servidor automático open-source escrito en Java. Jenkins ayuda a automatizar la parte no humana del proceso de desarrollar software, con la integración continua y facilitando los aspectos técnicos de la entrega continua. |
Nexus | https://www.sonatype.com/nexus-repository-sonatype | Nexus 3 o superior | Nexus es un administrador de repositorios. Te permite recolectar y administrar tus dependencias para que no tengas que estar constantemente barajando una colección de JARs. Hace más fácil la distribución de tu software. Internamente, tu configuras tu «build» para publicar artefactos al Nexus y después se vuelven disponibles para otros desarrolladores. |
Especificaciones del entorno
Especificación | URL | Versión | Información |
---|---|---|---|
OpenJDK | https://adoptopenjdk.net/ | Openjdk 8.X | OpenJDK es la versión libre de la plataforma de desarrollo Java bajo concepto de lenguaje orientado a objeto. |
Spring Framework | https://spring.io/ | Spring 5.X | Spring Framework es un framework de aplicación y un contenedor de inversión de control para la plataforma Java. Las características del nucleo del framework pueden ser usadas por cualquier aplicación Java, pero hay extensiones para construir aplicaciones web por encima de la plataforma Java EE (Enterprise Edition). |
Spring-Boot | https://spring.io/projects/spring-boot | Spring-Boot 2.X | Spring Boot está diseñado para simplificar el bootstrapping y desarrollo de las nuevas aplicaciones Spring. El framework toma un acercamiento dogmático a la configuración, liberando a los desarrolladores de la necesidad de definir la configuración repetitiva. |
Swagger | https://swagger.io/ | Swagger 2.X o superior | Swagger es un framework open-source de software respaldado por un gran ecosistema de herramientas que ayuda a los desarrolladores a diseñar, construir, documentar y consumir servicios web RESTful. |
Tomcat | http://tomcat.apache.org/ | Tomcat 9.X | Apache Tomcat, comúnmente referido como Tomcat Server, en un Java Servlet Container open-source desarrollado por Apache Software Foundation (ASF). Mira Tomcat embebido en Spring Boot. |
Docker | https://www.docker.com/ | Docker 18.X | Docker es una herramienta diseñada para facilitar la creación, despliegue, y ejecución de aplicaciones usando contenedores. Los contenedores permitan a un desarrollador empaquetar una aplicación con todas las partes que necesita, tal como sus librerías y otras dependencias, y enviar todo como un solo paquete, |
Kubernetes | https://kubernetes.io/ | Kubernetes 1.X | Kubernetes (K8s) es un sistema open-source para el despliegue automático, escalado, y administrado de aplicaciones en contenedores. |
Rancher | https://rancher.com/ | Rancher 2.X | Rancher combina todo lo que necesita una organización para ejecutar contenedores en producción y manejar centralmente múltiples clusters de Kubernetes. ¡Pide una demostración hoy! |
Azure | https://azure.microsoft.com/es-es/ | – | Microsoft Azure es un servicio de cloud computing creado por Microsoft para construir, testear, desplegar, y gestionar aplicaciones y servicios a través de centros de datos de Microsoft. |
Onesait Platform | https://onesaitplatform.atlassian.net/ | X | Onesait Platform proporciona flexibilidad para que nuestros clientes puedan construir sus propias soluciones de una forma solidad y ágil usando tecnologías open-source, una arquitectura flexible, y un acercamiento innovador. |
Microservicios en Spring
Actualmente Spring es un framework de código abierto que facilita el desarrollo de aplicaciones java JEE & JSE. Está compuesto por múltiples módulos/proyectos que cubre todas las capas de la aplicación, con decenas de desarrolladores y miles de descargas al día. Provee de un contenedor encargado de manejar el ciclo de vida de los objetos (beans) para que los desarrolladores se enfoquen a la lógica de negocio. Permite la integración con diferentes frameworks. Debido a esta capacidad de modularidad y desarrollo en diferentes entornos es óptimo para la implementación de microservicios.
Características
Estos microservicios se caracterizan por ser:
- Ligeros: el impacto que se tiene al integrar el Spring es mínimo.
- No intrusivos: generalmente los objetos que se programan no tienen dependencias de clases específicas de Spring.
- Flexibles: aunque Spring provee funcionalidad para manejar las diferentes capas de la aplicación (vista, lógica de negocio, acceso a datos) no es necesario usarlo para todo. Brinda la posibilidad de utilizarlo en la capa o capas que queramos.
- Multiplataforma: escrito en Java, corre sobre JVM.
Módulos a utilizar
Los principales módulos que son necesarios para desarrollar microservicios en Spring son Spring Framework, Spring Data, Spring Boot y Spring Security:
- Spring Framework: proporciona un modelo integral de programación y configuración para aplicaciones empresariales modernas basadas en Java, en cualquier tipo de plataforma de implementación. Un elemento clave de Spring es el soporte de infraestructura a nivel de aplicación: se enfoca en las comunicaciones entre nivel de almacenamiento, sistema y red de las aplicaciones empresariales para que los equipos puedan enfocarse en la lógica de negocios a nivel de la aplicación, sin vínculos innecesarios con entornos de implementación específicos.
- Spring Boot: es una herramienta que nace con la finalidad de simplificar el desarrollo de aplicaciones basadas en el framework Spring Core: que el desarrollador solo si centre en el desarrollo de la solución, olvidándose por completo de la compleja configuración que actualmente tiene Spring Core para poder funcionar, sobre todo proporcionando un inicio rápido con menos codificación.
- Spring Data: es un proyecto (subproyectos) de SpringSource cuyo propósito es unificar y facilitar el acceso a distintos tipos de tecnologías de persistencia, tanto a bases de datos relacionales como a las del tipo NoSQL. Viene a cubrir el soporte necesario para distintas tecnologías de bases de datos NoSQL integrándolas con las tecnologías de acceso a datos tradicionales, simplificando el trabajo a la hora de crear las implementaciones concretas.
Normalmente utiliza una clase repositorio es que actúa de mediador entre el dominio de la aplicación y los datos que le dan persistencia. La tarea repetitiva de crear las implementaciones concretas de DAO para las entidades se simplifica porque solo vamos se necesita una interfaz proporcionada. - Spring Security: este módulo dota a Spring de una serie servicios de seguridad aplicables para sistemas basados en la arquitectura basados en J2EE. Los procesos de seguridad están destinados principalmente, a comprobar la identidad del usuario mediante la autenticación y los permisos asociados al mismo mediante la autorización. La autorización es dependiente de la autenticación ya que se produce posteriormente a su proceso.
Resumen anotaciones frecuentes IoC
- Autodescubrimiento: categorizan cada uno de los componentes asociándoles una responsabilidad concreta: @Scope, @Component, @Repository, @Service, @Controller.
- Personalización: @Configuration, @Bean.
- Inyección: por defecto la inyección es obligatoria. Se puede marcar como opcional en cuyo caso, si no encuentra el Bean, inyectará un null: @Autowire (@Inject), @Qualifier (@Named), @Value, @PropertySource, @Required, @Resource.
- JPA: @Entity, @Table (se aplican a una clase), @Id, @column, @Transient (se aplican a propiedades Java).
- Otras: @PostConstruct, @PreDestroy.
Más información
Podéis encontrar más información al respecto en la página web de Spring, así como en la del plugin Lombok.