RESUMEN LCIV P1.pdf
Document Details
Uploaded by UnrealSousaphone6337
UTN
Full Transcript
UNIDAD 1 - Microservicios Microservicios: Enfoque arquitectónico y organizativo para el desarrollo de software, el sistema se compone de pequeños servicios autónomos y especializados que se comunican a través de APIs. Tiene un enfoque en la entrega rápida y eficiente; al mismo tiempo, brinda flexibi...
UNIDAD 1 - Microservicios Microservicios: Enfoque arquitectónico y organizativo para el desarrollo de software, el sistema se compone de pequeños servicios autónomos y especializados que se comunican a través de APIs. Tiene un enfoque en la entrega rápida y eficiente; al mismo tiempo, brinda flexibilidad y eficiencia para las organizaciones y equipos de desarrollo. Cada Microservicio que creamos representa una funcionalidad específica y definida dentro de nuestra aplicación, permitiendo un desacoplamiento entre distintas partes del sistema. Cada Microservicio se encarga de una función del negocio lo que facilita el desarrollo, implementación, escalabilidad y mantenimiento. Facilita la escalabilidad horizontal al agregar más instancias de un microservicio específico para manejar más solicitudes sin afectar el rendimiento global del sistema. Autónomos: Los servicios no necesitan compartir código o implementación con otros servicios. - Despliegue independiente: Cada micro servicio puede ser implementado y actualizado por separado sin afectar otros servicios. Además, no es necesario detener o recopilar todo para realizar un cambio en un microservicio específico. - Lógica de negocio específica: Están diseñados para abordar una tarea o función específica del negocio, y tienen una sola responsabilidad. - Comunicación a través de interfaces: Se comunican entre sí a través de interfaces definidas como API Restful. - Escalabilidad independiente: Pueden escalar de manera independiente según la demanda específica. - Tecnología y plataforma independiente: Cada micro servicio puede estar desarrollado en diferentes tecnologías, lo que brinda libertad de utilizar herramientas adecuadas a cada servicio. - Aislamiento de fallos: Permite que un fallo en un servicio no afecte directamente a los demás servicios. Especializados: Cada servicio se diseña para un conjunto de capacidades y se enfoca en resolver un problema específico. La especialización de un microservicio tiene implicaciones importantes: - Enfoque en una sola responsabilidad: Tienen una funcionalidad limitada y claramente definida, lo que facilita el entendimiento del propósito y mantenimiento del código asociado. - Desarrollo y despliegue ágil: Al ser específico, el desarrollo de un micro servicio se puede llevar a cabo de manera más rápida y eficiente. - Acoplamiento reducido: Se minimizan las dependencias entre microservicios. Nos da mayor flexibilidad para modificar o mejorar un servicio sin afectar a otros. - Escalabilidad dirigida: Al ser especializados, permiten escalar solo los componentes que tengan una mayor carga de trabajo sin necesidad de escalar todo el sistema. - Mejor adaptación a la evolución de negocio: Son más adaptables a los cambios en los requerimientos o enfoque del negocio, pueden modificarse sin afectar al resto del sistema. Monolitos vs Microservicios: En las arquitecturas monolíticas, todos los procesos están estrechamente asociados y se ejecutan como un solo servicio. Si se necesita escalar una parte del sistema, se debe escalar toda la arquitectura y mejorar o modificar características se vuelve más complejo a medida que crece el código. En cambio, en una arquitectura de microservicios se crean componentes independientes que ejecutan cada proceso como un servicio específico. Cada servicio se puede actualizar, implementar y escalar según la demanda de funciones específicas de la aplicación. Escalabilidad: Se refiere a la capacidad de un sistema para adaptarse y manejar eficientemente un aumento en la demanda de recursos sin perder rendimiento o funcionalidad. Implica crecer y adaptarse de manera flexible para satisfacer las necesidades cambiantes y crecientes. Existen dos tipos principales: - Escalabilidad Vertical: Consiste en aumentar los recursos en un solo servidor o máquina para mejorar el rendimiento y capacidad. - Escalabilidad Horizontal: Si aumenta la capacidad del sistema, agregando más instancias o servidores idénticos para distribuir la carga de trabajo. Esta última es la que se utiliza en microservicios ya que tienen la capacidad de crecer horizontalmente. Ventajas y Desventajas de la arquitectura de microservicios: Ventajas: Desarrollo ágil y rápido despliegue Escalabilidad y flexibilidad (agregar o quitar instancias de servicios específicos) Mantenibilidad simplificada (el mantenimiento y actualizaciones se hacen de manera más enfocado sin afectar otros componentes) Independencia tecnológica (se pueden utilizar diferentes tecnologías) Mayor facilidad para equipos distribuidos (Pueden trabajar en microservicios específicos) Resistencia a fallos (aislar fallos y que no afecten a todo el sistema) Desventajas: Complejidad en gestion y coordinacion (al haber muchos servicios independientes se complejiza la gestión) Overhead de comunicación (se genera un overhead adicional debido a comunicación entre redes) Posible degradación del rendimiento (mala planificación de comunicación lleva a degradación general del rendimiento a nivel sistema) Mayor esfuerzo de pruebas y monitoreo (requieren un mayor esfuerzo por la naturaleza distribuida del sistema) Consistencia de datos (puede dificultarse debido a la cantidad de microservicios) Requerimientos de infraestructura adicionales (Puede requerir infraestructura adicional para manejar la complejidad) Tolerancia a fallos: Capacidad de un sistema para continuar funcionando de manera adecuada, proporcionar una funcionalidad degradada o una recuperación automatizada en caso de fallos o errores. Prácticas comunes de tolerancia a fallos: - Redundancia y replicación (copias redundantes para que si un microservicio falla otro pueda tomar su lugar) - Circuit breaker (Patrón para detectar errores en los microservicios y evitar solicitudes adicionales hasta que el microservicio se recupere) - Respuestas degradadas (Pueden proporcionar respuestas degradadas, lo que significa ofrecer una funcionalidad limitada o reducida.) - Gestión de colas y reintentos (Puede implementar una gestión de colas y reintentos para volver a intentar la solicitud en un momento posterior.) - Manejo adecuado de excepciones (Se debe capturar y manejar adecuadamente las excepciones para evitar que se propaguen los errores.) Gestión de errores: Se refiere a la forma en que el sistema maneja los errores y situaciones excepcionales cuando ocurren. Debe implementarse una gestión de errores robusta para proporcionar información significativa sobre los fallos y facilitar la resolución de problemas. Prácticas comunes de gestión de errores: - Registro y monitoreo de errores (Registrar y monitorear para identificar patrones y tendencias de fallos) - Respuestas con códigos de estado adecuados (Devolver códigos de estado significativos para que los clientes puedan entender la naturaleza del problema y responder en consecuencia) - Notificación y alertas (Deben configurarse sistemas de notificaciones y alertas para que el equipo de desarrollo sea informado inmediatamente y cuando ocurra un error crítico) - Reintentos y recuperación (Implementar mecanismos de reintentos y recuperación para intentar nuevamente la operación o proporcionar alternativas en caso de errores temporales) - Respuestas amigables para el usuario (Proporcionar mensajes de error evitando que sean técnicos o poco informativos.) Resiliencia: Capacidad de un sistema para resistir, recuperarse y adaptarse de manera efectiva ante situaciones inesperadas, fallos o condiciones adversas. Es una propiedad esencial en sistemas distribuidos y arquitectura de microservicios. Busca garantizar que el sistema pueda recuperarse de los fallos y seguir funcionando sin afectar negativamente a la experiencia de usuario. Patrones y buenas prácticas en microservicios: Conjunto de directrices, principios y estrategias que guían el diseño, desarrollo y despliegue efectivo de sistemas basados en microservicios. Diseñadas para abordar desafíos específicos al trabajar con arquitecturas de Microservicios. Abordan aspectos clave como: - Comunicación entre microservicios - Gestión de datos - Seguridad Circuit Breaker: Patrón de diseño para mejorar la resiliencia y tolerancia a fallos en sistemas distribuidos. Su objetivo es proteger al sistema de colapsos en cadena causados por fallos en 1 o varios servicios. Actúa como un mecanismo de protección entre los componentes del sistema. Tiene tres estados: Estado cerrado: Las solicitudes fluyen normalmente y al ser exitosas se mantiene cerrado. Estado abierto: Cuando el número de fallos alcanza un umbral predefinido, se cambia a estado abierto. En este estado se bloquean las solicitudes entrantes y evita que lleguen a los componentes. Pueden devolverse, respuestas predefinidas o respuestas de error rápidas para las solicitudes. Estado Semifuncional: Después de un periodo de tiempo se cambia el estado semi-funcional, donde una sola solicitud fluye hacia los componentes para evaluar si la recuperación ha tenido éxito. API Gateway: Patrón de diseño y componente clave en arquitecturas de Microservicios y sistemas distribuidos. Proporciona una interfaz unificada y simplificada para que los clientes interactúen con el sistema en su conjunto. Funciones y características del API Gateway: - Unificación de servicio: Hay que combinar múltiples vídeos, servicios y sus diferentes puntos de acceso a una única API pública. Se pueden realizar todas las solicitudes a través de la API Gateway sin conocer la estructura interna del sistema. - Composición de solicitudes: Puede agrupar varias solicitudes y realizar llamadas a diferentes microservicios para cumplir con la solicitud del cliente. Esto permite que el API Gateway optimice la comunicación interna para mejorar el rendimiento. - Enrutamiento y redirección: Puede realizar el enrutamiento de las solicitudes hacia el micro servicio adecuado, además puede redirigir las solicitudes a diferentes versiones de los microservicios. - Seguridad y autenticación: Actúa como un punto de control de acceso y puede gestionar la autenticación y autorización de los clientes. Esto centraliza la gestión de seguridad y protege los microservicios de accesos no autorizados. - Caché de datos: Reventar una capa de caché para almacenar respuestas a solicitudes comunes y reducir la carga en los micro servicios. - Monitoreo y análisis: Puede realizar el seguimiento y monitoreo de solicitudes entrantes y salientes, proporcionando información valiosa para analizar el rendimiento del sistema. API Gateway proporciona una capa de abstracción que facilita la gestión, mantenimiento y evolución de la arquitectura de microservicios. Puede ser implementado como un servicio independiente o incorporado en un servicio de orquestación. UNIDAD 2 - Docker Docker: Plataforma de contenedores que proporciona una forma eficiente de empacar, distribuir y ejecutar aplicaciones junto con todas sus dependencias en un entorno aislado. Utiliza contenedores que son instancias aisladas y son un proceso del SO anfitrión permitiendo una gestión de recursos más eficiente. Virtualización clásica: Utiliza un hipervisor, es decir, un software que crea y gestiona múltiples máquinas virtuales en una máquina física. Cada máquina virtual incluye su propio kernel y sistema operativo completo. Diferencias entre Docker y Virtualización clásica: Docker no utiliza virtualización en el sentido tradicional de máquinas virtuales completas. Utiliza tecnologías del kernel de Linux para lograr el aislamiento entre contenedores y permite que múltiples contenedores compartan recursos al permanecer aislados entre sí y del sistema operativo Anfitrión. Arquitectura de Docker: - Docker Daemon: Proceso que se ejecuta en el sistema anfitrión y es responsable de administrar los contenedores. - Docker Client (CLI): Permite a los usuarios interactuar con el daemon de Docker. - Docker Images: Plantillas que contienen una aplicación, sus dependencias y todas las configuraciones necesarias para ejecutarse. - Docker Containers: Instancias en tiempo de ejecución de imágenes. Contienen todos los componentes necesarios para ejecutar una aplicación. - Docker Registries: Repositorios que almacenan imágenes de docker. Un ejemplo es docker hub. Imagenes de Docker: Paquetes ligeros, independientes y ejecutables que contienen todo lo necesario para ejecutar una pieza de software. Son la base para crear y ejecutar contenedores. Se crean a partir de un archivo llamado Dockerfile,que específica los pasos necesarios para construir la imagen, el sistema operativo que usa los paquetes que instala y la configuración del entorno. Cache en las imágenes de docker: Las imágenes de Docker siguen un modelo de capas. Cada instrucción crea una nueva capa en la imagen, lo que permite reutilizar partes comunes de las imágenes y mantener un control eficiente de versiones y cambios. Al construir una imagen, docker verifica si las capas ya existen en el caché local. Si una capa ya se ha construido previamente, docker reutiliza esa capa desde el caché en lugar de volver a construirla. Contenedor de Docker: Es una instancia aislada y ejecutable de una imagen de docker. Permiten empaquetar, distribuir y ejecutar aplicaciones de manera eficiente y consistente. Volumen de Docker: Son una forma de persistir y compartir datos entre contenedores y el sistema anfitrión. Son puntos de montaje en el sistema de archivos que apuntan a ubicaciones específicas en el sistema anfitrión o a otros contenedores. Tienen varias ventajas: - Persistencia de datos: Los datos almacenados en un volumen persisten más allá del ciclo de vida del contenedor. - Compartición de datos: Permiten compartir datos entre varios contenedores. - Aislamiento de Aplicación: Permiten que los datos valiosos o críticos se mantengan fuera del ciclo de vida del contenedor. - Backup y Restauración: Facilita la realización de copias de seguridad y restauración de datos, ya que persisten en ubicaciones externas al contenedor. Docker Network: Componente de docker, que permite la comunicación entre contenedores en un entorno de contenerizado. Facilita la creación de redes virtuales en la que los contenedores se comunican entre sí. Permiten: - Aislamiento: Contenedores en diferentes redes no pueden comunicarse directamente entre sí, mejorando la seguridad y control. - Comunicación entre Contenedores: Los contenedores que se encuentran en una misma red pueden comunicarse utilizando sus nombres de servicio como nombres de host, lo que simplifica la comunicación y reduce la necesidad de conocer direcciones IP específicas. - Conectividad Externa: Se puede configurar la red para que permita la conectividad entre contenedores y recursos externos. Beneficios de Utilizar Docker: Aislamiento y consistencia (encapsula aplicaciones y sus dependencias en contenedores) Portabilidad (contienen todo lo necesario para ejecutar , haciendo que las aplicaciones sean altamente portátiles) Despliegue rápido (las imágenes se inician en cuestión de segundos lo que acelera el proceso de despliegue) Gestión simplificada (se puede gestionar múltiples contenedores usando herramientas como Docker Compose o Kubernetes) Eficiencia de Recursos (los contenedores comparten el mismo kernel del SO host, reduciendo la sobrecarga) Escalabilidad (facilita la escalabilidad al permitir replicación de contenedores según la demanda) Versionado y Rollback (se pueden versionar y etiquetar imágenes, facilitando el seguimiento de cambios) Colaboración mejorada (simplifica la colaboración entre desarrolladores y equipos de operaciones) Entornos de desarrollo reproducibles (asegura que los entornos de desarrollo sean consistentes, eliminando problemas causados por diferencias en configuraciones locales) Seguridad y aislamiento (ofrecen un nivel adicional de seguridad al aislar aplicaciones y procesos) Docker Compose: Herramienta que permite definir y ejecutar aplicaciones multi contenedor de manera más sencilla. Permite definir la configuración de los contenedores en un archivo de texto con formato YAML. Sus características y beneficios son: - Definición de servicios (podemos definirlos en el archivo YAML) - Orquestación sencilla (permite definir relaciones y dependencias entre servicios) - Entorno Reproducible (asegura que todos los miembros tengan un entorno consistente y reproducible) - Fácil implementación y escalabilidad (se puede usar un solo comando para construir, iniciar y administrar los contenedores) - Variables de Entorno (para la personalización de configuraciones para diferentes entornos) - Comunicación entre Contenedores (facilita la creación de redes internas para que los contenedores puedan comunicarse entre sí utilizando nombres de servicio en lugar de direcciones Ip) - Gestión de Volúmenes (evita la pérdida de datos cuando el contenedor se reinicia o reemplaza) - Configuración Centralizada (centraliza todo en un solo archivo) Estructura del Docker Compose: 1. Version (Versión de la sintaxis del archivo docker-compose) 2. Services (Se define cada servicio de la aplicacion) 2.a Image (la imagen docker a utilizar) 2.b Container Name (podemos asignar un nombre al contenedor) 2.c Ports (define los puertos a exponerse desde el contenedor) 2.d Environment Variables (permite definir para el contenedor) 2.e Volumes (indica los volúmenes a montarse en el contenedor) 2.f Depends On (define la dependencia entre servicios) 3. Networks (se pueden definir redes personalizadas para los servicios) 4. Volumes (podemos definir los volúmenes personalizados para los servicios) 5. Environment Variables (podemos definir variables de entorno globales para aplicarse en todos los servicios del archivo)