Overview
Este tutorial muestra cómo compilar una arquitectura de microservicios utilizando Spring Boot, Spring Cloud y MongoDB. Concretamente, este tutorial te guía paso a paso para crear múltiples servicios que funcionen juntos y formen una aplicación completa.
Puedes encontrar el código fuente completo en los siguientes repositorios de GitHub:
Spring Boot
Spring Boot es un framework diseñado sobre el Spring Framework. Agrega autoconfiguración, valores por defecto y funcionalidades listas para producción para simplificar la construcción de aplicaciones Java basadas en Spring, incluida la integración con Spring Data MongoDB. Para obtener más información, consulta la Documentación de Spring Boot.
Spring Nube
Spring Cloud es una colección de herramientas para construir sistemas distribuidos y microservicios. Ofrece funcionalidades para la gestión de configuración, descubrimiento de servicios y enrutamiento inteligente. Para obtener más información, ver la documentación de Spring Cloud.
Tutorial
Esta guía muestra cómo realizar las siguientes acciones:
Verifique los requisitos previos
Clonar los repositorios de ejemplo
Configurar un servidor de configuración
Configure un registro de servicios
Configura una puerta de enlace API
Crea microservicios MongoDB
Probar las API REST
Verificar los requisitos previos.
Antes de comenzar, asegúrese de tener instalado lo siguiente:
Java Development Kit (JDK) 21 o posterior. Puedes descargar el JDK del sitio web de Oracle.
Git
MongoDB (dos implementaciones para desarrollo local). Para aprender a configurar MongoDB localmente, consulta la guía Crear una implementación local de Atlas con Docker.
Clonar los repositorios de ejemplo.
Clona los repositorios de aplicaciones y configuraciones de microservicios ejecutando los siguientes comandos:
git clone git@github.com:mongodb-developer/microservices-architecture-mongodb.git git clone git@github.com:mongodb-developer/microservices-architecture-mongodb-config-repo.git
Siga las instrucciones en el README.md archivo del microservices-architecture-mongodb repositorio para iniciar cada servicio.
Configure un servidor de configuración.
Un servidor de configuración almacena todos los archivos de configuración de tus microservicios en un único repositorio.
La configuración del servidor de configuración se define en el archivo microservices-architecture-mongodb/config-server/src/main/resources/application.properties:
spring.application.name=config-server server.port=8888 spring.cloud.config.server.git.uri=${HOME}/Work/microservices-architecture-mongodb-config-repo spring.cloud.config.label=main
Esta configuración especifica la ubicación del repositorio de Git que almacena la configuración de tus microservicios y la rama a utilizar.
La aplicación servidor de configuración está definida en la siguiente clase Java ubicada en el directorio microservices-architecture-mongodb/config-server/src/main/java/com/mongodb/configserver/:
package com.mongodb.configserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
Nota
La anotación @EnableConfigServer permite la funcionalidad del servidor de configuración en su aplicación Spring Boot.
Configura un registro de servicios.
Un registro de servicios rastrea qué microservicios están en ejecución y sus ubicaciones. Otros servicios usan esta información para comunicarse con los microservicios que necesitan.
La configuración del registro de servicios está definida en el siguiente archivo de propiedades:
spring.application.name=service-registry server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
Las dos últimas propiedades evitan que el registro de servicios se registre a sí mismo.
La aplicación de registro de servicio se define en la siguiente clase de Java ubicada en el directorio microservices-architecture-mongodb/service-registry/src/main/java/com/mongodb/serviceregistry/:
package com.mongodb.serviceregistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; public class ServiceRegistryApplication { public static void main(String[] args) { SpringApplication.run(ServiceRegistryApplication.class, args); } }
Nota
La anotación @EnableEurekaServer habilita la funcionalidad del registro de servicios en tu aplicación Spring Boot.
Configura un gateway de API.
Una API gateway proporciona un único punto de entrada para acceder a todos tus microservicios. El gateway distribuye las solicitudes entre varios microservicios y gestiona la seguridad, la supervisión y otros aspectos.
La configuración del gateway API se define en el archivo microservices-architecture-mongodb/api-gateway/src/main/resources/application.yml:
server: port: 8080 spring: application: name: api-gateway cloud: gateway: routes: - id: company-service uri: lb://company-service predicates: - Path=/api/company/**,/api/companies - id: employee-service uri: lb://employee-service predicates: - Path=/api/employee/**,/api/employees eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ instance: hostname: localhost
Esta configuración define las rutas para los servicios de la empresa y de los empleados, y registra el gateway en el registro de servicios.
Crea microservicios MongoDB.
Esta aplicación incluye dos microservicios: un servicio de empresa y un servicio de empleados. Cada microservicio se conecta a su propia instancia de MongoDB para mantener la independencia.
La configuración del servicio de la empresa está definida en el archivo microservices-architecture-mongodb-config-repo/company-service.properties:
spring.data.mongodb.uri=${MONGODB_URI_1:mongodb://localhost:27017} spring.threads.virtual.enabled=true management.endpoints.web.exposure.include=* management.info.env.enabled=true info.app.name=Company Microservice info.app.java.version=21 info.app.type=Spring Boot server.port=8081 eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.instance.hostname=localhost
La configuración del servicio de empleados se define en el archivo microservices-architecture-mongodb-config-repo/employee-service.properties:
spring.data.mongodb.uri=${MONGODB_URI_2:mongodb://localhost:27018} spring.threads.virtual.enabled=true management.endpoints.web.exposure.include=* management.info.env.enabled=true info.app.name=Employee Microservice info.app.java.version=21 info.app.type=Spring Boot server.port=8082 eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.instance.hostname=localhost
Nota
Para el desarrollo local, el servicio de la empresa se conecta a MongoDB en el puerto 27017 y el servicio para empleados se conecta a MongoDB en el puerto 27018. Para producción, utiliza clústeres de MongoDB Atlas separados y establece las cadenas de conexión utilizando las variables de entorno MONGODB_URI_1 y MONGODB_URI_2.
Prueba las API REST.
Después de iniciar todos los servicios, verifica que tu arquitectura de microservicios funciona correctamente asegurando que los siguientes servicios estén en funcionamiento:
Servidor de configuración en el puerto 8888
Registro de servicio en el puerto 8761
Puerta de enlace de API en el puerto 8080
Servicio de la empresa en el puerto 8081
Servicio de empleados en el puerto 8082
Además, asegúrate de tener dos instancias de MongoDB ejecutándose en los puertos 27017 y 27018, o dos clústeres de MongoDB Atlas.
Ejecuta el script de prueba ejecutando el siguiente comando:
./2_api-tests.sh
El script crea empresas y empleados, luego los recupera usando la API REST. La salida devuelta por el script se asemeja a lo siguiente:
DELETE Companies 2 DELETE Employees 2 POST Company 'MongoDB' POST Company 'Google' GET Company 'MongoDB' by 'id' { "id": "661aac7904e1bf066ee8e214", "name": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00" } GET Company 'Google' by 'name' { "id": "661aac7904e1bf066ee8e216", "name": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00" } GET Companies [ { "id": "661aac7904e1bf066ee8e214", "name": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00" }, { "id": "661aac7904e1bf066ee8e216", "name": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00" } ] POST Employee Maxime POST Employee Tim GET Employee 'Maxime' by 'id' { "id": "661aac79cf04401110c03516", "firstName": "Maxime", "lastName": "Beugnet", "company": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00", "joined": "2018-02-12T00:00:00.000+00:00", "salary": 2468 } GET Employee 'Tim' by 'id' { "id": "661aac79cf04401110c03518", "firstName": "Tim", "lastName": "Kelly", "company": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00", "joined": "2023-08-23T00:00:00.000+00:00", "salary": 13579 } GET Employees [ { "id": "661aac79cf04401110c03516", "firstName": "Maxime", "lastName": "Beugnet", "company": "Google", "headquarters": "Mountain View", "created": "1998-09-04T00:00:00.000+00:00", "joined": "2018-02-12T00:00:00.000+00:00", "salary": 2468 }, { "id": "661aac79cf04401110c03518", "firstName": "Tim", "lastName": "Kelly", "company": "MongoDB", "headquarters": "New York", "created": "2009-02-11T00:00:00.000+00:00", "joined": "2023-08-23T00:00:00.000+00:00", "salary": 13579 } ]
El servicio para empleados consulta al servicio de la empresa para recuperar los detalles de la empresa. El siguiente código muestra cómo el servicio de empleados se comunica con el servicio de la empresa a través del registro del servicio:
private CompanyDTO getCompany(String company) { String url = "http://company-service/api/company/name/"; CompanyDTO companyDTO = restTemplate.getForObject(url + company, CompanyDTO.class); if (companyDTO == null) { throw new EntityNotFoundException("Company not found: ", company); } return companyDTO; }
La URL hace referencia al servicio de la empresa por su nombre y no por la dirección IP ni el puerto, lo que confirma que el registro de servicios funciona correctamente.
Recursos adicionales
Para obtener más información sobre cómo crear microservicios con Spring y MongoDB, consulta los siguientes recursos: