====== 03 - Diagramas C4 ====== El modelo **C4** describe la arquitectura de un sistema en cuatro niveles: **Contexto**, **Contenedores**, **Componentes** y **Código**. Cada nivel responde a una pregunta distinta y tiene distinta audiencia. ===== 1. Los cuatro niveles ===== ^ Nivel ^ Pregunta ^ Audiencia ^ | **Contexto** | ¿Cómo se relaciona el sistema con personas y sistemas externos? | Cualquier interesado | | **Contenedores** | ¿Qué aplicaciones y almacenes forman el sistema? | Técnicos y arquitectos | | **Componentes** | ¿Qué módulos componen cada contenedor? | Desarrolladores | | **Código** | ¿Cómo se organizan las clases? | Desarrolladores del componente | Los tres primeros son los más usados; el nivel de código es esencialmente el diagrama de clases del tema anterior. ===== 2. Elementos ===== * **Persona:** usuario del sistema. * **Sistema de software:** el conjunto completo; en el nivel de contexto es la caja mayor. * **Contenedor:** unidad ejecutable o almacén de datos: aplicación web, API, base de datos, cola de mensajes. * **Componente:** módulo con responsabilidad dentro de un contenedor. * **Relación:** conecta elementos, normalmente con su tecnología y protocolo (HTTP, JDBC...). ===== 3. Contexto ===== @startuml !include Person(student, "Estudiante", "Consulta el catálogo") System(biblioteca, "Sistema de biblioteca", "Gestiona libros y préstamos") Rel(student, biblioteca, "Usa", "HTTPS") @enduml El nivel de contexto no entra en detalles internos: solo muestra el sistema, sus usuarios y los sistemas externos con los que habla. ===== 4. Contenedores ===== @startuml !include Person(student, "Estudiante", "Consulta el catálogo") System_Boundary(c1, "Sistema de biblioteca") { Container(spa, "Aplicación web", "TypeScript", "Interfaz del usuario") Container(api, "API REST", "Java, Spring Boot", "Expone la lógica") ContainerDb(db, "Base de datos", "MariaDB", "Guarda libros y préstamos") } Rel(student, spa, "Usa", "HTTPS") Rel(spa, api, "Llama a", "HTTPS/JSON") Rel(api, db, "Lee y escribe", "JDBC") @enduml Aquí aparecen las tecnologías y los protocolos. Para el monolito por capas que se construye en 1.º, el diagrama de contenedores muestra aplicación, API y base de datos. ===== 5. Componentes ===== @startuml !include Component(ctrl, "Controller", "Recibe peticiones HTTP") Component(svc, "Service", "Reglas de negocio") Component(repo, "Repository", "Acceso a datos") Rel(ctrl, svc, "invoca") Rel(svc, repo, "usa") @enduml El nivel de componentes muestra la organización interna de un contenedor, por ejemplo las capas del monolito. ===== 6. Cuándo usar cada nivel ===== ^ Situación ^ Diagrama ^ | Explicar el sistema a alguien nuevo | Contexto | | Decidir tecnologías o despliegue | Contenedores | | Planificar el código de un módulo | Componentes | | Diseñar o revisar clases | Código (diagrama de clases) | No hay que dibujar los cuatro niveles siempre: se elige el nivel que responde a la pregunta que se quiere contestar. Mantener los diagramas actualizados importa más que el detalle.