servidor web - Universidad de Alicante

Transcripción

servidor web - Universidad de Alicante
Tema 1.
HTTP y
aplicaciones web
1.
El protocolo HTTP
El protocolo HTTP y su relación con las aplicaciones
web
Petición/Respuesta HTTP
• Un servidor web está a la escucha por un determinado puerto
(típicamente el 80), aceptando peticiones y generando respuestas
según el protocolo HTTP
• El protocolo especifica la sintaxis de peticiones y respuestas
• El intercambio de información se hace en modo texto
GET notas.html HTTP/1.0
HTTP/1.0 200 OK
<html>
<head> </head>
<body>
<h1> Notas de ADI </h1>
...
Estructura de la petición
Línea de
petición
Cabeceras
GET / HTTP/1.1
Host: www.ua.es
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6;
rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/
xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
If-Modified-Since: Tue, 20 Sep 2011 08:58:31 GMT
If-None-Match: "f90d3d-63b6-4e7855b7;4dd6141f"
Estructura de la respuesta
Línea de
estado
Cabeceras
Cuerpo
entidad
HTTP/1.1 200 OK
Date: Tue, 20 Sep 2011 09:08:58 GMT
Server: Apache/1.3.41
Content-Location: index.html.es-es
Vary: negotiate,accept-language
TCN: choice
Last-Modified: Tue, 20 Sep 2011 08:58:31 GMT
Etag: "f90d3d-63b6-4e7855b7;4dd6141f"
Accept-Ranges: bytes
Content-Length: 25526
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
Content-Language: es-es
(línea en blanco...)
<html xmlns="http://www.w3.org/1999/xhtml" lang="es"
xml:lang="es">
<head>
<title>Universidad de Alicante</title>
...
Una página = múltiples recursos
• Una sola página contiene normalmente múltiples recursos
(imágenes, código Javascript, flash,...). Cada uno de ellos requiere
una transacción HTTP separada
Métodos de petición
• Los navegadores suelen usar dos tipos: GET y POST
• GET (solicitar un recurso).
• Se pueden enviar también parámetros con la petición. En su caso van en la 1ª línea de la petición HTTP
• Al pulsar en enlace o enviar formulario tipo GET
• POST (enviar datos).
• Los datos van al final de la petición
• Al enviar formulario tipo POST
• Existen otros, pero para lanzarlos desde un navegador hay que usar
Javascript
• PUT
• DELETE
• ...
Códigos de estado
• Diferentes rangos numéricos indican distintos tipos de resultados
• Consultar por ejemplo http://httpstatus.es
• 1xx Informational
• 2xx success (p. ej. 200 OK)
• 3xx redirection (p. ej. 301 MOVED PERMANENTLY)
• 4xx client error (p. ej. 404 NOT FOUND, 400 BAD REQUEST, 401
UNAUTHORIZED, 418 I’M A TEAPOT :) )
• 5xx server error
• Se pueden usar como respuestas a llamadas a un API
• Por ejemplo, aunque la gente entiende comúnmente el 404 como “página no
encontrada” en realidad es “recurso no encontrado”. Imaginemos una llamada a
un API para obtener el expediente de un alumno al que pasamos un DNI inexistente
Protocolo “sin estado”
• Cada ciclo petición/respuesta es independiente del anterior
• No se “recuerda” nada del anterior ciclo
• Como esto es un problema para ciertas actividades en la web, se
han añadido elementos al HTTP para “solucionarlo” => Cookies
• Tendremos que tener en cuenta esto cuando usemos HTTP para
acceder a un API (aplicaciones REST)
• En principio el servidor no recordaría que ya nos hemos autentificado
http://xkcd.com/869/
2.
Aplicaciones web
Aplicaciones web
• Una aplicación web es una colección de “rutinas” o “programas”. A
cada uno se accede a través de una URL
• La comunicación con la aplicación se hace a través de HTTP
• Al igual que en línea de comandos podemos pasar parámetros. En
HTTP se pasan bien en la primera línea de la petición, bien al final
1. “Parsea” los parámetros
HTTP y verifica que son válidos.
Valida permisos
GET notas/verNota?asig=adi&dni=22333444 HTTP/1.0
2. Lanza una consulta SQL en la B.D.
y obtiene los resultados
verNota
HTTP/1.0 200 OK
<html>
<head> </head>
<body>
<h1> Tu nota de ADI </h1>
<p> Juan Ruiz: 10 </p>
</body>
3. Formatea los resultados en HTML
Capas lógicas (layers)
• El código de “verNota” no debería ser
monolítico, ya que implica tareas muy
diferentes
• Lo más común es organizar el código
en capas
• Cada capa forma una unidad lógica
• ... y solo se relaciona con las adyacentes
• En aplicaciones web típicamente se
distinguen 3 capas
• Acceso a datos
• Lógica de negocio
• Presentación
http://en.wikipedia.org/wiki/Multitier_architecture
Servidores de aplicaciones
• Estrictamente hablando, un servidor web solo sirve páginas
“estáticas” (HTML)
• Un servidor de aplicaciones nos da infraestructura software para
ejecutar aplicaciones web. Además de ejecutar las aplicaciones
puede ofrecer servicios adicionales como
• Clustering y balanceo de carga
• Autentificación y autorización
• Conexión con bases de datos y transaccionalidad
• ...
Capas vs. niveles
• Hay que distinguir entre capas lógicas (layers) y niveles físicos
(tiers), aunque muchas veces se usan de forma intercambiable
• Las capas implican separación lógica en la organización del código
• Un nivel físico distinto implica una máquina distinta (o una máquina virtual distinta)
• Podemos tener varias capas en el mismo nivel (p. ej. misma máquina como servidor
web y de aplicaciones)
Presentación
Servidor web
Negocio
Servidor de aplicaciones
Acceso a datos
Servidor legacy
y de acceso a datos
Base de datos
Frontend y Backend
• El frontend es la parte con que interactúa el usuario, el backend
todo lo que hay “por detrás”
• Hasta ahora hemos simplificado considerando que todo lo hace el
servidor y que el cliente se limita a renderizar el HTML, pero...
• En aplicaciones web modernas el código frontend suele
ejecutarse en el cliente y el backend en el servidor
Charla: Picking a Technology Stack, Pamela Fox, Coursera
Petición/Respuesta con AJAX
• No solo hay petición/respuesta en el “cambio de página”, también se
puede disparar mediante Javascript (AJAX)
3. Arquitecturas
web
Arquitecturas web
• En general, siempre vamos a separar en presentación/negocio/
acceso a datos, pero aparte de esto hay mucho que decidir...
• ¿Dónde va a residir el frontend? ¿Va a ser “estático” (solo HTML, cliente “tonto”) o
“dinámico” (HTML + Javascript)?
• ¿Cómo vamos a organizar la capa de negocio? ¿Va a ser monolítica o la vamos a
dividir en módulos independientes (servicios)?
• ¿Vamos a colocar las capas en niveles separados físicamente?
• ¿Usaremos nuestra propia infraestructura o “la nube”?
• ...
• Vamos a discutir unos cuantos modelos típicos
Aplicaciones monolíticas
• Aquí, “monolítico” no significa que el
código no esté organizado en capas,
sino que la aplicación es una única
“unidad de despliegue”
• Es la arquitectura más “clásica” en
aplicaciones web
• Aunque no tienen por qué, es típico que
sean además “orientadas a
presentación” (generan HTML que se
envía al cliente)
Aplicaciones “orientadas a
presentación”
• El HTML no está pre-generado, se genera dinámicamente
• Bien “a base de printfs” (para entendernos)
• Bien con un lenguaje de plantillas, en que se mezcla código estático con sentencias
genéricas de un lenguaje de programación o con instrucciones especiales de control
de flujo
slim-lang.org
PHP
Mustache: http://mustache.github.io/mustache.5.html
Ejemplo: Twitter hasta 2010
Presentación: Decomposing Twitter: Adventures in Service-Oriented Architecture, QCon New York 2013
Ejemplo: LinkedIn 2003-2005
http://www.slideshare.net/linkedin/linkedins-communication-architecture
Problemas
• “Too many cooks spoil the broth”
• Acoplamiento del código
• Difícil optimizar
• Por ejemplo, ver el timeline y enviar un tweet
son operaciones muy diferentes (1ª frecuente,
solo lectura, 2ª menos frecuencia, escritura)
El caso Amazon
• Un buen día de 2002, Jeff Bezos se despierta y decide que... (http://
steverant.pen.io)
• En adelante, todos los equipos expondrán sus datos y funcionalidades a través de interfaces de
servicios.
• Cada equipo deben comunicarse con los demás a través de estos interfaces.
• No se permitirá otra forma de intercomunicar procesos: ni accesos directos, ni acceso directo al
almacén de datos de otro equipo, ni memoria compartida ni puertas traseras de ningún tipo. La
única comunicación permitida es a través del interfaz de servicio y sobre la red.
• No importa qué tecnología se use: HTTP, Corba, PubSub, protocolos propios...
• Todos los interfaces de servicio deben diseñarse desde el principio para ser externalizables, es decir,
el equipo debe [...] ser capaz de exponer el interfaz a desarrolladores externos. Sin excepciones.
• El que no haga esto será despedido.
• ¡Gracias y que tengáis un buen día¡
Aplicaciones orientadas a servicios
• La capa de negocio se divide en módulos totalmente
independientes, llamados servicios
• SOA: Service Oriented Architecture
• Cuidado, se ha convertido en un término de marketing con un altísimo nivel de hype
SOA según los desarrolladores
“El motivo de introducir estos servicios no es escalar el sitio web. Añadiendo
servicios no va a funcionar más rápidamente [...] En realidad esto va de escalar
las cosas para los ingenieros [...] Va de hacer a la gente más productiva.”
Jay Kreps, LinkedIn
“Lo llames SOA, descomposición funcional, o simplemente buena ingeniería, las
funcionalidades relacionadas deben ir juntas, mientras que las no relacionadas
deben ir separadas. Más aún, cuanto más desacopladas estén las
funcionalidades no relacionadas, más flexibilidad tendrás para escalarlas
independientemente unas de otras.”
Randy Shoup, eBay
Ejemplos: Twitter
Presentación: Decomposing Twitter: Adventures in Service-Oriented Architecture, QCon New York 2013
¿Qué pasa cuando se envía un tweet?
Ejemplos: LinkedIn
Problemas de SOA
• Primera regla sobre el diseño de objetos distribuídos de
Martin Fowler: “no distribuyas tus objetos”
• Sobrecarga en la comunicación entre servicios
• Es difícil dividir en servicios y diseñar APIs estables cuando
no está muy claro cuáles deberían ser tus funcionalidades
más importantes (p.ej. startups)
• De Steve Yegge
• Es más difícil encontrar quién es el responsable de un error (en un
proceso pueden estar implicados muchos servicios)
• Cualquier servicio de tus compañeros se convierte en un posible
“atacante” de tu servicio
• Depurar los problemas de interacción con otros servicios es difícil
Tecnologías de implementación
• El protocolo de comunicación con los servicios podría ser propio,
pero ya hay “estándares” definidos
• SOAP: multiplataforma, pesado, basado en XML, facilita la generación automática
de código
• REST: multiplataforma, ligero, se podría ver como una “capa muy fina” sobre HTTP
“Para diseñar un buen API para los servicios necesitamos usar algo que la gente
conozca. Así que, aunque no hay nada superior desde el punto de vista técnico
en REST y JSON sobre usar RPC con un protocolo de nivel más bajo, usar algo
que la gente comprenda bien [...] ayuda mucho en el diseño del API”
Jay Kreps, LinkedIn
REST
• Realmente no es una tecnología sino una filosofía de diseño
• Simplificando
• Cada recurso se representa con una URL única
• http://miaplicaciondeviajes.com/usuarios/pepito
• http://miaplicaciondeviajes.com/usuarios/pepito/viajes/1
• La operación sobre el recurso se define con el método de la petición HTTP
• GET = leer, POST = crear, PUT, PATCH = actualizar, DELETE = borrar
• El intercambio de datos se hace en formatos estándar
• Típicamente XML o JSON
• No hay estado
• Lo que significa que para cada operación restringida tenemos que enviar de nuevo las credenciales
Lógica de negocio en el cliente
• Un paso más allá
• Ya hemos visto que el código del servidor se puede considerar como un API que
ofrece diferentes servicios
• Podemos colocar la aplicación en su mayor parte en el cliente (frontend). Aquí
estárá la presentación y parte del negocio
• En el servidor está la otra parte de negocio y el código de acceso a datos
The New Application Architectures, Adrian Colyer http://www.infoq.com/presentations/SpringOne-2GX-2012-Keynote-2
Ejemplo: Coursera
Frontend Architectures, Pamela Fox: http://frontend-architectures.appspot.com/
Platform as a Service
• Los servicios no se ejecutan en una infraestructura propia, sino en
“la nube”
• La plataforma también es un servicio (Platform as a Service PaaS) http://www.paasify.it/vendors
Backend as a Service
• Todas las aplicaciones hacen una serie de tareas comunes
• Gestionar usuarios: identificar, dar de alta, de baja, ...
• Almacenar y recuperar datos
• ...
• Los servicios BaaS ofrecen APIs para estas tareas, incluso algunos
permiten ejecutar funciones propias en sus servidores
Referencias: libros
• Accesible online desde la UA en http://proquestcombo.safaribooksonline.com
Referencias: charlas
• Jeremy Cloud: “Decomposing Twitter:
Adventures in Service-Oriented
Architecture” (QCon NY 2013)
• http://www.infoq.com/presentations/twitter-soa
• Jay Kreps: “Lessons from Building and
Scaling LinkedIn” (QCon NY 2013)
• http://www.infoq.com/presentations/linkedinarchitecture-stack

Documentos relacionados

operar sobre recursos

operar sobre recursos Una sola página contiene normalmente múltiples recursos (imágenes, código Javascript, flash,...). Cada uno de ellos requiere una transacción HTTP separada

Más detalles