Microservicios con Spring Cloud
Introducción al Seminario de Microservicios con Spring Cloud
Bienvenida y Presentación
- Buenas tardes, se da la bienvenida a los participantes del seminario sobre microservicios, organizado por la Dirección General de Tecnologías de la Información y Comunicación.
- Se invita a los asistentes a unirse a la comunidad Aprendetik UNAM y suscribirse al canal de YouTube para acceder a contenidos desarrollados en conjunto.
- Se enfatiza la importancia de estos seminarios como oportunidades para descubrir experiencias prácticas en el desarrollo de software.
Temática del Seminario
- El enfoque principal será la arquitectura de microservicios, que permite desarrollar sistemas escalables y resilientes adaptados a las necesidades actuales.
- Se presenta al ponente, ingeniero Jorge Uriel Hernández Orozco, experto en arquitectura de software con más de 15 años de experiencia.
Agenda del Seminario
Estructura y Contenido
- El ingeniero Hernández compartirá su pantalla para discutir sobre microservicios e implementaciones específicas en Spring Cloud.
- La agenda incluye una definición formal e intuitiva de los microservicios, así como ejemplos prácticos relacionados con esta arquitectura.
- Se abordarán desafíos y buenas prácticas en la implementación de arquitecturas basadas en microservicios.
Contexto Actual y Evolución
Importancia de la Nube
- La nube es fundamental hoy en día; proporciona agilidad, resiliencia y rapidez en el lanzamiento de productos.
- Los microservicios no son una moda pasajera; han evolucionado para responder a los desafíos actuales del desarrollo software.
Definición y Características
- Los microservicios son un estilo arquitectónico que descompone aplicaciones en servicios pequeños e independientes enfocados en capacidades específicas.
- Esta arquitectura surge como respuesta a las limitaciones del modelo monolítico tradicional, conocido como "infierno monolítico".
Descomposición Funcional
Estrategias para Implementar Microservicios
- La descomposición funcional permite separar funcionalidades dentro del sistema evitando conflictos entre equipos que trabajan simultáneamente.
- Existen diferentes estrategias para descomponer aplicaciones: por subdominios o capacidades específicas (productos, pedidos, etc.), facilitando así el trabajo colaborativo.
Ventajas y Desventajas de la Arquitectura de Microservicios
Flexibilidad en la Implementación
- La arquitectura de microservicios ofrece flexibilidad, permitiendo a los equipos elegir su stack tecnológico según sus necesidades.
- Se puede implementar utilizando diversos lenguajes y frameworks como Java, PHP o Python, así como diferentes tipos de bases de datos (relacionales y no relacionales).
- Esta flexibilidad es clave para resolver problemas específicos que se presentan en el desarrollo.
Autonomía del Equipo
- La autonomía es un beneficio principal; los equipos pueden seleccionar tecnologías sin depender de una única versión del código base.
- Esto acelera el ciclo de vida del desarrollo, reduciendo el tiempo para desplegar nuevas funcionalidades desde meses a días o semanas.
Ejemplos Prácticos
- Empresas como Netflix, Uber y Spotify utilizan esta arquitectura debido a su alta demanda y necesidad de flexibilidad en despliegues frecuentes.
- La independencia operativa permite controlar los despliegues autónomamente, lo cual es fundamental para mantener la eficiencia.
Escalabilidad
- La escalabilidad operativa permite crear múltiples equipos independientes que funcionan sin gestión adicional.
- Cada microservicio puede escalar independientemente para manejar picos de demanda, lo que no sería posible con una arquitectura monolítica.
Tolerancia a Fallas
- La separación funcional permite que ciertos servicios fallen sin afectar al sistema completo, manteniendo otros servicios operativos.
- Este aislamiento ayuda a contener fallas y evitar colapsos totales en sistemas críticos como los bancarios.
Despliegue Frecuente y Riesgo Reducido
- Los microservicios permiten despliegues más frecuentes con menor riesgo gracias a su descomposición funcional por subdominio o producto.
- Aunque herramientas modernas como Docker y Kubernetes facilitan esta arquitectura, originalmente no existían cuando se diseñó este enfoque.
Aplicaciones Nativas en la Nube
- Al hablar de microservicios, también se considera el diseño para aplicaciones nativas en la nube que aprovechan mejor las características del entorno cloud.
- Existe una alineación natural entre microservicios y aplicaciones nativas en la nube debido a sus principios compartidos.
Consideraciones sobre la Implementación de Arquitecturas Distribuidas
Complejidad Operativa
- La implementación de arquitecturas distribuidas implica un alto costo y complejidad operativa, lo que debe ser considerado al momento de decidir su adopción.
- Monitorear una arquitectura distribuida es significativamente más complejo que gestionar un monolito, debido a las intermitencias de red y fallos operativos.
Comparación con Monolitos
- Un monolito en un clúster con balanceador de carga es más fácil de monitorear y operar en comparación con microservicios, donde se requiere una estrategia más elaborada.
- El uso de herramientas especializadas y roles alineados a la visión empresarial son esenciales para enfrentar los retos que presenta esta complejidad.
Costos e Inversiones
- La inversión en capital humano e infraestructura no es menor; esto debe ser justificado por el crecimiento o la complejidad del sistema.
- La necesidad de separar funcionalidades en sistemas grandes suele ser la razón principal para migrar a microservicios.
Latencia y Fallos en Redes
Impacto de la Latencia
- La latencia generada por las llamadas entre servicios independientes puede incrementar considerablemente los tiempos de respuesta, afectando el rendimiento general del sistema.
- En el mejor escenario, una invocación en red puede tardar hasta un segundo, pero frecuentemente oscila entre 5 a 10 segundos.
Ejemplo Práctico
- Se menciona un caso reciente en Amazon Prime donde los tiempos de respuesta eran inaceptables debido a su arquitectura basada en microservicios.
- Para resolver este problema, se optó por diseñar un monolito que cumpliera con los requerimientos necesarios sin problemas significativos.
Consistencia de Datos
Desafíos en Microservicios
- Mantener la consistencia de datos se vuelve complicado al implementar bases de datos por servicio dentro del contexto de microservicios.
- Al particionar datos, ya no se pueden utilizar transacciones ACID tradicionales, lo cual representa un gran reto para garantizar la integridad.
Soluciones Propuestas
- Se introduce el concepto de "consistencia eventual" mediante patrones arquitecturales como "Saga", que permite manejar eventos para lograr consistencia temporalmente.
Dificultades Operativas
Trazabilidad y Depuración
- La depuración se complica enormemente; identificar errores dentro del ecosistema distribuido requiere mayor esfuerzo comparado con sistemas monolíticos simples.
Contexto Técnico
- Muchos equipos implementan soluciones sin comprender completamente los fundamentos técnicos detrás del diseño arquitectónico elegido. Esto puede llevar a decisiones apresuradas o mal informadas.
Implementación Efectiva
Herramientas Disponibles
- Aunque existen herramientas como Spring Cloud que facilitan la implementación técnica, es crucial entender los problemas inherentes a estas arquitecturas antes de proceder.
Diferencias entre Spring Boot y Microservicios
Conceptos Fundamentales
- Usar Spring Boot para crear APIs REST no implica necesariamente una arquitectura de microservicios; es crucial entender la diferencia entre ambos conceptos.
- La fragmentación y descomposición en el diseño de aplicaciones presentan desafíos, pero las APIs pueden coexistir en una aplicación monolítica sin problemas.
- Spring Boot es un framework maduro que permite implementar APIs rápidamente con configuraciones mínimas, alineándose a principios de aplicaciones nativas de nube.
Implementación y Flexibilidad
- Se puede utilizar Spring Boot en un TechStack autorizado, aprovechando la experiencia del equipo sin perder beneficios adicionales.
- Permite ejecutar distintas versiones y tipos de librerías independientemente, manteniendo flexibilidad en el uso de bases de datos.
Arquitectura Interna con Spring Boot
Estilos Arquitectónicos
- Existen diferentes estilos arquitectónicos como Layered (en capas) o Hexagonal, que son comunes entre desarrolladores y se pueden implementar fácilmente con Spring Boot.
- La evolución hacia contenedores como Docker está integrada en Spring Boot, facilitando la creación de imágenes listas para producción.
Metodologías Relacionadas
- No todos los despliegues están ligados a microservicios; se recomienda explorar metodologías como el 12 Factor App Methodology para construir aplicaciones en la nube.
Contratos de Servicio en Microservicios
Especificaciones Abiertas
- Los contratos de servicio son fundamentales para los microservicios; se definen formalmente mediante Open API Specification.
- Estos contratos permiten que múltiples clientes (aplicaciones web, móviles, IoT, etc.) interactúen eficientemente con los servicios.
Cambio en el Mindset
- La implementación basada en contratos cambia la forma de trabajo y está alineada al concepto de Domain Driven Design (DDD), promoviendo una mejor colaboración entre equipos.
Implementación Técnica con JPA
Uso de ORM
- En la implementación tradicional se utilizan ORMs como JPA para definir entidades y gestionar datos dentro del sistema.
- La capa de negocio respeta reglas definidas previamente e incluye gestión adecuada de excepciones durante su operación.
Integración y Desafíos
Integración Efectiva
- Al integrar sistemas separados, se requiere un enfoque diferente; aunque el código base puede ser similar, la integración presenta nuevos retos.
Soluciones Propuestas por Spring Cloud
- Para abordar estos desafíos, se utiliza Spring Cloud como un conjunto de proyectos diseñados para facilitar la integración en arquitecturas distribuidas.
Introducción a la Configuración de Microservicios
Problemas en Arquitecturas Distribuidas
- Se mencionan cuatro problemas clave al manejar arquitecturas distribuidas: gestión de configuraciones, descubrimiento de servicios, enrutamiento de peticiones y tolerancia a fallas.
- Además, se destacan otros temas importantes como seguridad, eventos, trazabilidad y observabilidad en sistemas distribuidos.
Gestión de Configuraciones
- La configuración centralizada es crucial para evitar redeploys constantes que pueden afectar múltiples consumidores.
- Spring Cloud Config Server permite una configuración centralizada para minimizar interrupciones en el consumo de aplicaciones.
Externalización de Propiedades
- Utiliza Configuration Profiles para externalizar propiedades que no deben estar codificadas directamente en el código fuente.
- Las configuraciones incluyen datos de conexión a bases de datos y colas de mensajes como RabbitMQ o Kafka.
Mecanismos para Evitar Redeploy
Refreshing Caliente
- Implementar un mecanismo manual o automatizado para invocar un endpoint permite refrescar configuraciones sin necesidad de redeploy.
- Esto optimiza recursos y reduce intermitencias derivadas de cambios en las configuraciones.
Descubrimiento de Servicios
Service Discovery con Eureka
- En arquitecturas donde los servicios son efímeros, el descubrimiento automático es esencial; Eureka facilita este proceso registrando instancias cuando se levantan.
- Cada instancia registrada puede recibir peticiones automáticamente gracias al registro realizado por Eureka.
Enrutamiento con Spring Cloud Gateway
- Spring Cloud Gateway actúa como un punto único de entrada que enruta las peticiones hacia los servicios registrados en Eureka.
- Este enfoque evita conexiones punto a punto entre servicios, mejorando la eficiencia del sistema.
Importancia de la Autenticación y Seguridad en Sistemas
Centralización de Responsabilidades
- La autenticación y autorización son fundamentales para la seguridad en sistemas, permitiendo centralizar responsabilidades mediante políticas.
Limitación de Consumo
- El rate limiting es crucial para evitar el consumo excesivo por parte de un cliente, lo que permite monitorear métricas y gestionar el uso del servicio.
Simplificación de Invocaciones a Servicios
Interacción con API Gateway
- Las invocaciones se simplifican al interactuar lógicamente con el API Gateway, sin necesidad de conocer la ubicación física del servicio solicitado.
Desafíos en Arquitecturas Distribuidas
Complejidad Operativa
- La complejidad operativa aumenta significativamente al manejar múltiples servicios en lugar de un monolito, lo que requiere una gestión cuidadosa.
Consistencia y Trazabilidad
Características de los Sistemas
- Los sistemas distribuidos son eventualmente consistentes y requieren herramientas especializadas para asegurar trazabilidad end-to-end.
Comparación entre Arquitecturas Monolíticas y Microservicios
Elección del Estilo Arquitectural
- No hay una arquitectura superior; la elección depende del análisis de requerimientos no funcionales y atributos de calidad específicos del sistema.
Mitigación de Ataques a APIs
Uso de WAFs
- Para mitigar ataques a las APIs, se utilizan Web Application Firewalls (WAF), como CloudFlare, que ayudan a contener ataques DDoS y otros tipos.
Monitoreo Efectivo en Microservicios
Herramientas Tecnológicas
- Se recomienda utilizar el stack ELK (Elasticsearch, LogStash, Kibana), diseñado para gestionar logs y monitorear microservicios eficientemente.
Implementación Comercial para Observabilidad
Correlation ID en Peticiones
- Es esencial implementar un correlation ID para rastrear peticiones a través de múltiples servicios, facilitando así la trazabilidad en aplicaciones distribuidas.
Desafíos en la Operación de Microservicios
Complejidad Operativa
- La operación efectiva de microservicios es compleja; los errores pueden surgir durante la segmentación o integración posterior entre servicios.
Integración Progresiva con Microservicios
Facilitar Transiciones Tecnológicas
- Los microservicios pueden facilitar la integración progresiva entre sistemas desarrollados con diferentes tecnologías sin necesidad de reemplazarlos completamente.
Mecanismo de Comunicación en Sistemas
Definición de Contratos Formales
- Se menciona la importancia de un contrato formal, conocido como Open API Specification (OAS), que actúa como la piedra angular para la comunicación entre sistemas.
- Este contrato formal proporciona un blindaje, asegurando que mientras se respete, los sistemas pueden operar conforme a lo esperado.
Configuración de Entornos con Spring Cloud
- Omar González pregunta sobre cómo desacoplar la configuración de entornos en Spring Cloud Configure.
- Se explica el uso de "Spring Profiles" para definir configuraciones específicas para cada entorno (desarrollo, QA, producción).
- Se menciona el principio de "backing services", parte del concepto 12 Factor Apps.
Despliegue y Activación de Perfiles
- Al desplegar aplicaciones empaquetadas (YAR), se puede activar un perfil específico según el entorno deseado.
- La aplicación busca automáticamente el archivo correspondiente al perfil activado (por ejemplo, application QA.yaml).
Beneficios de Microservicios y Serverless
Arquitectura Serverless
- Enrique López pregunta sobre los beneficios que aporta Cervorlux en comparación con otros proveedores cloud.
- Se discute cómo serverless permite empaquetar aplicaciones sin necesidad de contenedores complejos si la lógica no es complicada.
Optimización y Gestión Automática
- Serverless gestiona automáticamente las métricas y recursos necesarios sin intervención manual.
- Esta arquitectura está diseñada para instanciar servicios bajo demanda, optimizando costos al evitar instancias inactivas.
Prevención de Inconsistencias en Datos
Implementación del Patrón Saga
- Melanie Saray pregunta sobre cómo prevenir inconsistencias en arquitecturas distribuidas.
- Se introduce el patrón Saga o Transaccional Saga como solución probada para mantener consistencia en datos distribuidos.
Flujo de Compensación
- El patrón implica enviar eventos compensatorios si una operación falla durante su ejecución.
- Diseñar este flujo es complejo y requiere atención a las fallas inherentes a sistemas distribuidos.
Cursos Disponibles sobre Microservicios
Oportunidades Educativas
- Se menciona la posibilidad de ofrecer un curso detallado sobre microservicios en UNAM debido a la demanda constante por este tema.
- El curso abarca principios fundamentales discutidos durante el seminario y ofrece una oportunidad para profundizar más.
Turn any video into a summary like this
YouTube links, meetings, lectures. With transcripts, search, and chat.