Cuando estamos utilizando un ordenador, una tablet o un teléfono móvil, ¿qué tipos de aplicaciones o programas podemos estar utilizando? Básicamente distinguimos dos grandes grupos:
Aplicaciones sin conexión a Internet. Este tipo de aplicaciones no necesitan ninguna conexión a Internet o a una red local de ordenadores para funcionar. Suelen llamarse aplicaciones de escritorio, y podemos encontrar ejemplos muy variados: un procesador de textos, un lector de libros electrónicos, un reproductor de música o vídeo, e incluso videojuegos que tengamos instalados.
Aplicaciones con conexión a Internet. Estas aplicaciones sí necesitan conexión, ya sea a Internet o a una red local. Dentro de este grupo, encontramos varios subtipos:
Podemos encontrar diversas definiciones de aplicación web buscando en Internet. Una de las más habituales hace referencia a aplicaciones que se cargan o ejecutan desde un navegador web, accediendo a un servidor. Estas aplicaciones interactúan con el servidor para procesar datos y presentar información al usuario a través del navegador.
Sin embargo, el avance experimentado en este sector durante los últimos años ha ampliado este concepto. Así, una aplicación web sería aquella realizada a partir de lenguajes y tecnologías de desarrollo web, tales como HTML, CSS, JavaScript, PHP, entre otros. Estas aplicaciones pueden ejecutarse en un navegador convencional o mediante un motor de navegador embebido en otro sistema, como el webview de Android o iOS.
De este modo, además de las aplicaciones web “tradicionales”, también tendrían cabida en esta definición las llamadas aplicaciones híbridas (desarrolladas con tecnologías web pero exportadas a formato nativo para diversos dispositivos), y aplicaciones de escritorio que emplean tecnologías web, como framework Electron de JavaScript. Un ejemplo de estas aplicaciones es Visual Studio Code, que aprovecha las ventajas de las tecnologías web para ofrecer experiencias de usuario avanzadas y multiplataforma.
La web es una plataforma global que proporciona acceso a una gran cantidad de recursos como documentos, videojuegos, redes sociales, foros, entre otros. Se popularizó a principios de los años 90 gracias a aplicaciones como el correo electrónico y los chats. Con la llegada de la web 2.0, surgieron nuevas aplicaciones que la potenciaron aún más, como los blogs o las redes sociales. Hoy en día, es común ver vídeos o películas en Internet, algo que hace unos años era impensable.
En una aplicación web podemos distinguir los siguientes tres elementos principales:
Como hemos comentado, las aplicaciones web funcionan bajo una arquitectura cliente-servidor, que distribuye las tareas entre los servidores (proveedores de recursos y servicios) y los clientes (solicitantes de dichos recursos y servicios).
Los pasos típicos en la comunicación cliente-servidor son los siguientes:
En muchos casos, la arquitectura del servidor es multicapa o multinivel. Esto significa que podemos tener diferentes aplicaciones en distintos equipos (o en el mismo) que ofrecen recursos o servicios. Por ejemplo, un servidor de bases de datos puede estar en una máquina, un servidor web en otra (o en la misma que el servidor de bases de datos), y un servidor de correo electrónico en otra máquina. De esta manera, se distribuyen los procesos y el trabajo, e incluso se podrían configurar opciones de seguridad y rendimiento separadas para cada servidor.
Ejemplo: arquitectura de dos o tres niveles
Consideremos una petición de un cliente para obtener un listado de noticias almacenadas en una base de datos. Este proceso puede ser representado con un diagrama de secuencia como sigue:
En una arquitectura de tres niveles, el servidor web y el servidor de bases de datos pueden estar en la misma máquina o en máquinas separadas, cada una con su hardware y control de acceso específicos. Esta configuración es común en aplicaciones web, ya que permiten una mejor gestión y seguridad de los datos.
En una arquitectura de dos niveles, el servidor web también actúa como servidor de bases de datos, respondiendo directamente a las peticiones del cliente sin consultar a otros servidores. Esta configuración es menos flexible y segura, y puede ofrecer un rendimiento inferior en sistemas muy congestionados.
Hemos visto la arquitectura de una aplicación web y cómo los elementos del front-end y el back-end interactúan mediante la comunicación cliente-servidor. En este apartado vamos a ver cómo se localizan y acceden a estas aplicaciones web en Internet. Aquí es donde entran en juego los conceptos de dominios y URLs.
Hostings y nombres de dominio
El servidor, que se encarga de recibir peticiones de todos los clientes que se conecten a él y enviarles la información que solicitan, necesita estar disponible desde cualquier lugar en Internet para que los usuarios puedan conectarse a él.
Por tanto, en primer lugar, debemos buscar un servidor en Internet en el que alojar nuestro sitio web. Esto puede hacerse de varias formas:
Además de un espacio de alojamiento, es necesario adquirir un nombre de dominio para que los usuarios puedan recordar y utilizar para identificar nuestra web de forma única en Internet. Este dominio se vincula a la dirección IP del servidor, permitiendo que las solicitudes del cliente lleguen al lugar correcto.
Por ejemplo, cuando escribimos la dirección www.google.es, un sistema conocido como DNS (Sistema de Nombres de Dominio) traduce este nombre de dominio a la dirección IP del servidor donde está alojada la aplicación de Google en español. Este proceso, llamado resolución de DNS, es crucial para el funcionamiento de las aplicaciones web, ya que facilita la localización de recursos en la red global.
El nombre de dominio se adquiere a través del registro de dominio, un proceso gestionado por empresas autorizadas por la ICANN (Internet Corporation for Assigned Names and Numbers). Para registrar un dominio, se debe contactar con una empresa registradora, comprobar que el dominio deseado está disponible, y seguir el proceso de registro.
URLs
Hemos visto que, en el esquema de funcionamiento de una aplicación web, el cliente solicita recursos al servidor. La forma en que los solicita es mediante URLs. Una URL (Uniform Resource Locator) es una secuencia de caracteres que sigue un estándar y que permite denominar recursos dentro de Internet para que puedan ser localizados.
Por ejemplo, cuando escribimos en un navegador una dirección como http://www.miweb.com/paginas/pagina.html, estamos introduciendo una URL para localizar un recurso (en este caso, una página HTML).
Una URL se compone de:
protocolo://subdominio.dominio.com/carpeta/pagina?param=valor
Ejercicio 1:
Hemos visto que la ICANN autoriza a diversas empresas para gestionar el registro de nombres de dominio en Internet. Estas empresas, conocidas como agentes registradores de dominio, ofrecen distintos planes de pago para este servicio. Busca en Internet una lista de agentes registradores de dominio oficiales para España y consulta los precios que tienen algunos de ellos.
Para que los clientes y servidores puedan comunicarse, es necesario establecer un protocolo de comunicación. Un protocolo define una serie de reglas que especifican qué tipo de mensajes se van a intercambiar, en qué orden y qué contenido va a tener cada tipo de mensaje, asegurando que ambos extremos de la comunicación (cliente y servidor) puedan entenderse.
Todas las comunicaciones en una red (o en Internet) se basan en el protocolo TCP/IP para funcionar. Este protocolo está basado en dos partes:
Sobre la base de TCP/IP, se establecen diversos protocolos específicos según el tipo de aplicación que se vaya a utilizar (web, correo electrónico, subida de archivos, etc). Para las aplicaciones web, los protocolos de comunicación más utilizados son:
Normalmente, los navegadores web cambian automáticamente del protocolo HTTP a HTTPS al conectar con páginas que necesitan ser más seguras (login, datos de pago, etc.). Este cambio puede observarse en la barra de direcciones del navegador, donde se mostrará el protocolo https o el icono de un candado. Sin embargo, es necesario configurar el servidor web para aceptar comunicaciones HTTPS cuando sea necesario.
Otros protocolos, aunque menos utilizados en aplicaciones web, son esenciales para otras aplicaciones en Internet. Por ejemplo, para el envío y recepción de correo electrónico se emplean los protocolos SMTP y POP3/IMAP respectivamente. Para transferir archivos a un servidor remoto, se puede usar el protocolo FTP. Este último protocolo es especialmente útil durante el desarrollo de aplicaciones web para subir actualizaciones al servidor.
El protocolo fundamental para las aplicaciones web es HTTP (o su versión segura, HTTPS). En ambos casos, se trata de un protocolo para aplicaciones cliente-servidor, donde los datos que se envían uno y otro tienen un formato determinado.
Peticiones HTTP
Por un lado, están los datos que el cliente envía al servidor, y que se denominan peticiones (en inglés, requests). Estas peticiones se componen, a grandes rasgos, de:
Todos estos datos, a bajo nivel, se encapsulan en paquetes y se fragmentan de acuerdo al protocolo TCP para ser enviados al servidor.
Respuestas HTTP
Por su parte, el servidor, cuando recibe una petición de un cliente, emite una respuesta (en inglés, response) con la información solicitada, o con algún código de error en caso de que hubiera sucedido alguno. Las respuestas se componen de estos elementos:
Monitorización con Google Chrome
Podemos usar el navegador Google Chrome para comprobar lo que cliente (navegador) y servidor se envían en un proceso HTTP. Para ello, vamos al menú de Herramientas para desarrolladores, y más concretamente a la sección Network. Desde ahí, accedemos a una web conocida (por ejemplo, ceice.gva.es), y podemos comprobar la información enviada y recibida:
Ejercicio 2:
Utiliza Google Chrome (opción de Herramientas para desarrolladores, pestaña Network) para ver el esquema de petición y respuesta HTTP hacia alguna web conocida, como por ejemplo stackoverflow.com. Identifica el código de estado, las cabeceras de respuesta (trata de identificar algunas de ellas) y el contenido.
En las comunicaciones en redes TCP/IP, cuando un equipo envía un paquete de datos a otro, es necesario identificar tanto el origen como el destino. Las aplicaciones que inician la transmisión deben incorporar valores obligatorios tales como: dirección MAC de origen y de destino, dirección IP de origen y de destino y puerto de origen y de destino. Estos campos siempre deben tener un valor asignado. Esto significa que, cuando se quiere visitar una página web que está alojada en un equipo (por ejemplo, el equipo con el nombre www.google.es), el cliente debe saber cuál es la dirección IP de destino para incorporarla en el paquete.
De hecho, cuando se abre un navegador web es posible acceder a un recurso tanto por su nombre de dominio como por su dirección IP. Siguiendo con el ejemplo anterior, si accedemos a una ventana de terminal y ejecutamos el comando ping www.google.es, obtendremos en la primera línea su dirección IP. Si se coloca esa misma dirección IP en un navegador web, se puede comprobar que devuelve la misma página web de inicio. Sin embargo, como usuarios, nos resulta más fácil dirigirnos a un equipo (host, servidor web, servidor de correo, etc.) utilizando su nombre de dominio que recordar su dirección IP correspondiente.
El DNS (Domain Name System) ó Sistema de Nombres de Dominio es el encargado de proporcionar un mecanismo eficaz para la traducción de direcciones IP de recursos de red a nombres fácilmente legibles y memorizables por las personas, y viceversa. A esta acción se la conoce como resolución DNS. Para ello, utiliza una base de datos distribuida y jerárquica que asocia direcciones IP de hosts, servicios o cualquier recurso conectado a internet o red privada con información de diverso tipo.
El DNS soporta tanto IPv4 como IPv6, y la información se almacena en forma de registros de recursos, en inglés Resource Records (RR), de distintos tipos, los cuales pueden almacenar direcciones IP u otro tipo de información. Esta información se agrupa en zonas, que corresponden a un espacio de nombres o dominio concretos y que son mantenidas por el servidor DNS autoritativo de la misma. A continuación, profundizaremos un poco más en estos y otros conceptos.
El DNS se estructura en tres componentes principales: espacio de nombres de dominio, servidores de nombres y resolvers.
Espacio de nombres de dominio
El espacio de nombres de dominio es una estructura jerárquica de árbol invertido donde cada nodo contiene registros de recursos (RR) que proporcionan información sobre los componentes hardware y software que respaldan dicho dominio, como por ejemplo, los hosts, los servidores de nombres, los servidores web, los servidores de correo, etc.
Del nodo raíz, situado en el nivel más alto, parten las ramas que conforman las zonas. Éstas, a su vez, pueden contener uno o más nodos o dominios que a su vez pueden dividirse en subdominios según se baja en la jerarquía.
Es importante no confundir los conceptos de zona y dominio. Un dominio se divide en subdominios para facilitar su administración, y cada parte administrada por uno o más servidores DNS es una zona. El dominio es el árbol del espacio de nombres y la zona es la parte del árbol administrada por un servidor de nombres de dominio concreto.
En la figura anterior hay tantos dominios como recuadros de letras agrupados en 4 zonas delimitadas por las líneas discontinuas. El nombre de dominio correspondiente a cada zona (se nombran según su nodo superior) es A, B.A, C.A, I.C.A. Cada una de estas cuatro zonas tendrá uno o más servidores DNS para gestionarla.
Servidores de nombres
Los servidores de nombres son servidores encargados de mantener y proporcionar información del espacio de nombres o dominios.
Con esta organización de servidores de nombres, y su intercomunicación, se consigue la distribución y redundancia del espacio de dominios.
Resolvers
Un resolver es una rutina del sistema operativo que funciona como intermediaria entre las aplicaciones, el sistema operativo y los servidores DNS. Cuando una aplicación necesita una resolución, ya sea de un nombre o de una dirección IP, llama a esta rutina devolviendo la información deseada de forma compatible para que el host la entienda.
La principal función de un servidor DNS es responder a consultas de clientes o de otros servidores DNS. Existen dos tipos principales de consultas:
En resumen, las consultas recursivas son generalmente generadas por los clientes DNS, mientras que las consultas iterativas son creadas por los servidores DNS al consultar a otros servidores.
En términos generales, el proceso que se sigue en una resolución DNS es el siguiente.
Veamos un ejemplo concreto de resolución de nombres para comprender mejor el proceso. Supongamos que un cliente necesita localizar el equipo www.educacion.gob.es y envía una petición a su servidor DNS. Asumamos también que su servidor no tiene información sobre ese dominio. Así, observaremos cómo se lleva a cabo la resolución completa
Este proceso consume bastante ancho de banda, por lo que es recomendable implementar una solución DNS interna con caché, especialmente en redes con alto tráfico hacia el exterior, como colegios, universidades, bibliotecas o grandes empresas. Esto permite obtener tiempos de respuesta más rápidos y una mejor experiencia de navegación web.
Herramienta DIG
DIG (Domain Information Gopher) es una herramienta de línea de comandos que realiza búsquedas en los registros DNS, a través de los nombres de servidores, y muestra el resultado. Se puede ejecutar tanto en Linux como en Windows aunque, en este último, es posible que sea necesaria su instalación previa.
Veamos un ejemplo de cómo funciona con el comando dig www.gva.es
:
Explicación de la salida:
Si se ejecuta DIG especificando la opción +trace, se muestra una traza de los servidores por los que pasa la consulta hasta llegar al servidor autoritativo, permitiendo ver la lista completa de nodos y pasos de resolución de un nombre. Esto es muy útil para entender cómo funciona el sistema de nombres de dominio.
Después de revisar los tipos de aplicaciones web, la arquitectura básica, los protocolos más comunes y el papel del DNS, llegamos a un componente esencial en el desarrollo de aplicaciones web robustas y eficientes: los patrones de diseño.
Un patrón de diseño o arquitectura software comprende un conjunto de pautas a seguir, elementos a desarrollar, jerarquías y orden que dotan a una aplicación de una estructura preestablecida, que la hace más propicia para funcionar como debe. Sus principales objetivos son, por un lado, estandarizar la forma en que se desarrollan las aplicaciones, y por otro, elaborar elementos o componentes reutilizables entre diversas aplicaciones, al ajustarse todos a un mismo patrón.
En el ámbito de las aplicaciones web, existen patrones de diseño específicos que nos guían a la hora de estructurar, diseñar y programar estas aplicaciones. Uno de los más utilizados (o quizá el más utilizado) es el patrón MVC, que comentaremos a continuación, pero también han surgido otros (muchos a partir de éste), que han querido dar una vuelta de tuerca más, o adaptarse a las necesidades de aplicaciones web más específicas o concretas. Veremos también algunos de estos patrones en este apartado.
MVC son las siglas de Modelo-Vista-Controlador (o en inglés, Model-View-Controller), y es, como decíamos antes, el patrón por excelencia ahora mismo en el mundo de las aplicaciones web, e incluso muchas aplicaciones de escritorio.
Como su nombre indica, este patrón se basa en dividir el diseño de una aplicación web en tres componentes fundamentales:
Es un patrón de diseño muy conciso y bien estructurado, lo que le ha valido la fama que tiene hoy en día. Entre sus muchas ventajas, permite aislar el código de los tres elementos involucrados (vista, modelo y controlador), de forma que el trabajo es mucho más modular y divisible, pudiendo encargarse de las vistas, por ejemplo, un diseñador web que no tenga mucha idea de programación en el servidor, y del controlador un programador PHP que no tenga muchas nociones de HTML.
En forma de esquema, podríamos representarlo así:
Como alternativas al patrón MVC, y a raíz de este mismo patrón, surgieron otros algo más específicos. Casi todos ellos tienen como base la parte del modelo (es decir, el acceso y gestión de los datos o información de la aplicación) y la parte de la vista (es decir, la presentación al usuario). Así, podríamos decir que el único punto “discordante” sería el controlador, que en otros patrones se ha sustituido por otros elementos. De hecho, al conjunto de patrones que siguen esta filosofía (es decir, centrarse en la vista y el modelo, y añadir algo más), se les suele llamar en general MVW (en inglés, Movel-View-Whatever, en español, Modelo-Vista-Cualquier cosa). La finalidad de esto es, en algunos casos, descomponer el trabajo realizado por los controladores en varios submódulos, y en otros casos, prescindir directamente del controlador. Veamos algunos de los patrones más populares.
El patrón MVVM
El patrón MVVM, como recogen sus siglas, se centra exclusivamente en los componentes del modelo y de la vista (Modelo-Vista-Vista-Modelo), y prescinde del controlador. De esta forma, el usuario interactúa directamente con la vista, y las acciones o cambios que introduzca en ella afectan directamente al modelo, y viceversa (los cambios en el modelo se reflejan de forma automática en la vista).
Este patrón está cobrando especial relevancia en las llamadas SPA (Single Page Applications), aplicaciones web con una sola página que recarga parcialmente sus contenidos ante las acciones del usuario. En estos casos, no es necesario un controlador que diga qué vista cargar, porque sólo hay una vista principal (que puede estar compuesta por subvistas), y si la estructura es lo suficientemente sencilla, vista y modelo pueden estar intercomunicados sin intermediarios. Algunos frameworks surgidos últimamente han dado aún más peso a este patrón, como es el caso de Angular.
El patrón MOVE
El patrón MOVE sustituye el controlador del patrón MVC por dos elementos. Uno que denomina operaciones (que sería la O de sus siglas), y que englobaría todo el conjunto de acciones que la aplicación es capaz de realizar, y otro que serían los eventos (que sería la E de sus siglas), y que representarían todos aquellos sucesos que desencadenan que se ejecute una operación determinada. Así, las acciones de los usuarios son eventos sobre la aplicación que provocan que se ejecuten determinadas operaciones. Estas operaciones, a su vez, pueden acceder al modelo para obtener o actualizar información, y pueden generar o llamar a una vista que mostrar al usuario como respuesta. Se divide así la tarea de los controladores entre los eventos y las operaciones.
El patrón MVP
El patrón MVP sustituye el controlador (o controladores) del MVC por lo que se denominan presentadores. Estos presentadores son una especie de intermediarios entre el modelo y la vista, de forma que cada vista tiene el suyo propio, y actúa tras la vista para comunicarse con el modelo, obtener los datos, y cargarlos en ella para mostrarlos al usuario. Se tiene así encapsulado con cada vista su presentador, y la aplicación puede considerarse un conjunto de pares vista-presentador, que se encargan de comunicarse con el modelo, que queda por detrás.
Para implantar una aplicación web y que los clientes puedan utilizarla, necesitamos contar con una serie recursos hardware y software.
Al hablar de aplicaciones web, es importante determinar el lenguaje o lenguajes de programación en que se desarrollan. En el ámbito de las aplicaciones web, distinguimos dos tipos de lenguajes:
Hemos visto a grandes rasgos el hardware y software que necesitaremos tanto en los clientes como en el servidor. ¿Qué software concreto vamos a utilizar en este curso?
En el caso del navegador para el cliente, existen varias opciones dependiendo del sistema operativo del cliente: Mozilla Firefox, Google Chrome, Internet Explorer / Edge (sólo para Windows), Safari (sólo en Windows y Macintosh), Opera… Posiblemente los dos primeros (Chrome y Firefox) sean las mejores opciones.
En el caso del servidor web, dependerá del tipo de lenguaje servidor que vayamos a utilizar para hacer nuestra página, y del sistema operativo del servidor. En nuestro caso, emplearemos lenguaje PHP, y también JavaScript con el framework Node.js. Para el primero, emplearemos el servidor Apache, que instalaremos a través de algún sistema XAMPP o similar, que integra Apache con un servidor MySQL/MariaDB y el lenguaje PHP preinstalados. Para lo segundo, instalaremos el framework Node.js para construir con él el servidor, y algunos módulos adicionales para facilitar la tarea del desarrollo de la aplicación en sí, como veremos en unidades posteriores.
Si vamos a emplear lenguaje Java (JSP, servlets, etc.), podemos instalar algún servidor sencillo y gratuito como Tomcat, o servidores de aplicaciones más pesados y complejos como Glassfish. También funcionan en todo tipo de sistemas Si optamos por tecnología .NET (ASP.NET), podemos utilizar IIS (Internet Information Services), un servidor web disponible para Windows, ya que esta tecnología sólo funciona en sistemas operativos Windows.
Para el servidor de base de datos, podemos emplear diferentes alternativas, como MySQL/MariaDB, PostreSQL, Oracle, o SQL Server. También podemos optar por sistemas No-SQL, como MongoDB. Todas ofrecen versiones gratuitas (algunas de ellas con recursos limitados para uso personal) y comerciales (más potentes). MySQL, PostgreSQL y Oracle funcionan en diversos sistemas, pero SQL Server es propiedad de Microsoft, y funciona en sistemas Windows. En nuestro caso, optaremos por un servidor MySQL/MariaDB para la comunicación con PHP y Apache (a través del mencionado XAMPP), y por un servidor MongoDB para las aplicaciones que hagamos con Node.js.
IDEs
Para el desarrollo de aplicaciones es necesario contar con un buen entorno de desarrollo o IDE con el que editar el código, depurar y probar las aplicaciones.
Existen multitud de opciones disponibles, la mayoría de ellas gratuitas. Desde entornos de propósito general válidos para muchos lenguajes (Atom, Sublime, Visual Studio Code…) a otros más específicos y orientados a algún lenguaje en concreto, como PhpStorm.
En nuestro caso, optaremos por Visual Studio Code, por su versatilidad y popularidad creciente. Permite instalar multitud de extensiones para trabajar con distintos tipos de lenguajes y frameworks, y nos permite también una fácil integración con PHP y Node.js.
Algunos frameworks útiles
También es conveniente conocer algunos frameworks populares y realmente útiles para el desarrollo de aplicaciones web. Estos frameworks se pueden clasificar dependiendo de si se emplean para la parte del cliente o la del servidor. En el primer caso, podemos hablar de Angular, React, Vue y algunos otros (aunque éstos son hoy por hoy los más populares), pero para el apartado que nos interesa, que son los frameworks en el lado del servidor, nos centraremos en:
A continuación se enumeran algunas webs donde consultar o descargar los recursos indicados en este tema, para el desarrollo de aplicaciones en entorno servidor.
Ejercicio 3:
Utiliza la herramienta Google Trends para buscar los términos de Laravel, Symfony y Node.js. Deduce a partir de las búsquedas cuál de ellos crees que es más popular actualmente. Después, acude a la web de InfoJobs y busca ofertas de trabajo con estos tres frameworks, para determinar cuál es el más demandado en la actualidad.