En este tema, exploraremos las diferentes capas que componen una arquitectura de sistemas. Entender estas capas es fundamental para diseñar sistemas robustos y escalables que puedan evolucionar con las necesidades del negocio.

Objetivos de Aprendizaje

  • Comprender la importancia de dividir un sistema en capas.
  • Identificar y describir las capas comunes en una arquitectura de sistemas.
  • Analizar cómo cada capa interactúa con las demás.
  • Implementar una arquitectura multicapa en un proyecto de software.

Importancia de las Capas en una Arquitectura

Dividir un sistema en capas tiene varias ventajas:

  • Separación de responsabilidades: Cada capa tiene una responsabilidad específica, lo que facilita el mantenimiento y la evolución del sistema.
  • Reutilización: Las capas pueden ser reutilizadas en diferentes partes del sistema o en otros proyectos.
  • Escalabilidad: Permite escalar diferentes partes del sistema de manera independiente.
  • Facilidad de prueba: Las capas pueden ser probadas de manera aislada, lo que simplifica el proceso de pruebas.

Capas Comunes en una Arquitectura de Sistemas

  1. Capa de Presentación (UI)

  • Responsabilidad: Interactuar con el usuario final.
  • Componentes: Interfaces de usuario, controladores de vista.
  • Tecnologías comunes: HTML, CSS, JavaScript, frameworks como React, Angular, Vue.js.

  1. Capa de Aplicación (Lógica de Negocio)

  • Responsabilidad: Contiene la lógica de negocio del sistema.
  • Componentes: Servicios, controladores, validadores.
  • Tecnologías comunes: Java, C#, Python, Node.js.

  1. Capa de Persistencia (Acceso a Datos)

  • Responsabilidad: Manejar la interacción con la base de datos.
  • Componentes: Repositorios, DAOs (Data Access Objects).
  • Tecnologías comunes: SQL, NoSQL, ORM (Object-Relational Mapping) como Hibernate, Entity Framework.

  1. Capa de Base de Datos

  • Responsabilidad: Almacenar y recuperar datos.
  • Componentes: Bases de datos relacionales y no relacionales.
  • Tecnologías comunes: MySQL, PostgreSQL, MongoDB, Cassandra.

  1. Capa de Infraestructura

  • Responsabilidad: Proveer servicios de soporte como autenticación, autorización, logging, etc.
  • Componentes: Servicios de infraestructura, middleware.
  • Tecnologías comunes: OAuth, JWT, ELK Stack (Elasticsearch, Logstash, Kibana).

Interacción entre Capas

Las capas deben interactuar de manera controlada y definida. A continuación, se muestra un ejemplo de cómo las capas pueden interactuar en un sistema típico:

Usuario -> [Capa de Presentación] -> [Capa de Aplicación] -> [Capa de Persistencia] -> [Capa de Base de Datos]

Ejemplo Práctico

Imaginemos una aplicación de gestión de tareas. A continuación, se muestra un ejemplo simplificado de cómo se podría estructurar utilizando una arquitectura en capas.

Capa de Presentación (UI)

<!DOCTYPE html>
<html>
<head>
    <title>Gestión de Tareas</title>
</head>
<body>
    <h1>Lista de Tareas</h1>
    <ul id="taskList"></ul>
    <script src="app.js"></script>
</body>
</html>

Capa de Aplicación (Lógica de Negocio)

// app.js
document.addEventListener('DOMContentLoaded', function() {
    fetch('/api/tasks')
        .then(response => response.json())
        .then(tasks => {
            const taskList = document.getElementById('taskList');
            tasks.forEach(task => {
                const li = document.createElement('li');
                li.textContent = task.name;
                taskList.appendChild(li);
            });
        });
});

Capa de Persistencia (Acceso a Datos)

# repository.py
class TaskRepository:
    def __init__(self, db_connection):
        self.db_connection = db_connection

    def get_all_tasks(self):
        cursor = self.db_connection.cursor()
        cursor.execute("SELECT * FROM tasks")
        return cursor.fetchall()

Capa de Base de Datos

-- schema.sql
CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

INSERT INTO tasks (name) VALUES ('Tarea 1'), ('Tarea 2'), ('Tarea 3');

Ejercicio Práctico

Ejercicio: Implementa una nueva capa de servicio que maneje la lógica de negocio para agregar una nueva tarea.

  1. Capa de Aplicación (Lógica de Negocio)
    • Crea una función addTask que envíe una solicitud POST al servidor para agregar una nueva tarea.
  2. Capa de Persistencia (Acceso a Datos)
    • Añade un método add_task en TaskRepository para insertar una nueva tarea en la base de datos.
  3. Capa de Base de Datos
    • Asegúrate de que la tabla tasks permita la inserción de nuevas tareas.

Solución:

  1. Capa de Aplicación (Lógica de Negocio)

    // app.js
    function addTask(taskName) {
        fetch('/api/tasks', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ name: taskName })
        }).then(response => response.json())
          .then(task => {
              const taskList = document.getElementById('taskList');
              const li = document.createElement('li');
              li.textContent = task.name;
              taskList.appendChild(li);
          });
    }
    
  2. Capa de Persistencia (Acceso a Datos)

    # repository.py
    class TaskRepository:
        def __init__(self, db_connection):
            self.db_connection = db_connection
    
        def get_all_tasks(self):
            cursor = self.db_connection.cursor()
            cursor.execute("SELECT * FROM tasks")
            return cursor.fetchall()
    
        def add_task(self, task_name):
            cursor = self.db_connection.cursor()
            cursor.execute("INSERT INTO tasks (name) VALUES (%s)", (task_name,))
            self.db_connection.commit()
    
  3. Capa de Base de Datos

    -- schema.sql
    CREATE TABLE tasks (
        id SERIAL PRIMARY KEY,
        name VARCHAR(255) NOT NULL
    );
    
    INSERT INTO tasks (name) VALUES ('Tarea 1'), ('Tarea 2'), ('Tarea 3');
    

Conclusión

En esta sección, hemos aprendido sobre las diferentes capas que componen una arquitectura de sistemas y cómo cada una de ellas tiene una responsabilidad específica. También hemos visto un ejemplo práctico de cómo implementar una arquitectura en capas y hemos realizado un ejercicio para reforzar los conceptos aprendidos. En el próximo tema, exploraremos las diferencias entre microservicios y monolitos, y cómo elegir la arquitectura adecuada para tu proyecto.

Arquitecturas de Sistemas: Principios y Prácticas para Diseñar Arquitecturas Tecnológicas Robustas y Escalables

Módulo 1: Introducción a las Arquitecturas de Sistemas

Módulo 2: Principios de Diseño de Arquitecturas

Módulo 3: Componentes de una Arquitectura de Sistemas

Módulo 4: Escalabilidad y Rendimiento

Módulo 5: Seguridad en Arquitecturas de Sistemas

Módulo 6: Herramientas y Tecnologías

Módulo 7: Casos de Estudio y Ejemplos Prácticos

Módulo 8: Tendencias y Futuro de las Arquitecturas de Sistemas

© Copyright 2024. Todos los derechos reservados