Microservicios con Spring Cloud

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.