Servidores Web (II)

Anuncio
Contenidos
Servidores/aplicaciones con/sin Estado
Sesiones Web con Servlets
Contextos compartidos con Servlets
Acceso concurrente desde Servlets
Servidores Proxy Cache
Servidores Virtuales
Servidores Web (II)
1
2
Información del Estado de Sesión
¿Aplicaciones sobre Protocolo HTTP?
Algunos protocolos y aplicaciones necesitan que el servidor mantenga
información especifica de cada cliente durante la sesión.
Por ejemplo en un servicio de transferencia de ficheros: un fichero se
transmite en bloques, requiriendo varias intercambios de mensajes para
completar la transferencia. Un protocolo necesario seria:
El protocolo HTTP es un protocolo petición–
respuesta:
Client Request 1: /catalog?sessionid=1
Server Reply 1: OK.
Client Request 2: /catalog?Add=108
Server Reply 2: “OK.
Client Request 3: /showCart
Server Reply 3: “OK.
Client Request 4: /cashier?VISAnumber=1111
Server Reply 4: “OK.
Estado el cliente
FTP se rve r
Estado en servidor
FTP se rve r
FTP C l ie nt
FTP C li e nt
file ID
file ID file posit ion
file posit ion
GET file name
file ID
send <file ID>, block 0
data from block 0 of file
send <file ID>, block 1
data from block 1 of file
...
3
GET file name
ready
send next block
data from block 0 of file
send next block
data from block 1 of file
...
4
Servidor con estado vs. sin estado
Un servidor con estado mantiene información del
estado de la sesión para cada cliente.
Si hay fallos en la red se complica el mantenimiento
de la informacion de estado.
Los servidores sin estado son mucho más faciles
de implementar que los servidores con estado.
Aplicaciones Web con estado
Soluciones:
Mantener información de estado en aplicación Web (NO en el
servidor):
Scripts CGI la guarda en ficheros, Servlet en variables,….
Y enviar información sobre sessión hacia/desde cliente.
Campo de sesión en petición.
Cookies (son más campos en cabecera).
FTP se rve r
Client Request 1: /catalog?sessionid=1.
Server Reply 1: “página productos en venta”
Client Request 2: /catalog?Add=108&sessionid=1.
Server Reply 2: “OK.
Client Request 3: /showCart?sessionid=1. OK, envio 108
Server Reply 3: “OK.
Client Request 4: /cashier?VISAnumber=1111&sessionid=1.
Server Reply 4: “OK.
FTP C lie nt
file ID file position
GET file name
ready
send next block
data from block 0 of file
send next block
data from block 1 of file
...
data is lost due to network failure
OK, cobro 108
client resubmits request
client receives data as block 0 of file;
the true block 0 is missed.
5
6
Sesiones con HTTPSession (II)
Sesiones con HTTPSession (I)
Permite almacenar información de estado sobre la sesión de un cliente.
Internamente puede utilizar a) cookies, o b) parametro sesión en URL.
Si no existe
session, la crea.
Client Request 1:
/catalog.
Server Reply 1:
“página productos en venta”.
+ URL con sessionid=1.
Class CatalogServlet
{
doGet(HttpServletRequest req,
HttpServletResponse res )
{
HttpSession session = req.getSession();
if session.getAttribute(“Cart”)==null)
{sc = new ShoppingCart();
session.setAttribute(“Cart”,sc);
}
out.println(” lista de productos”);
}
7
Client Request 1:
/catalog.
Server Reply 1:
“página productos en venta”.
+ URL con sessionid=1..
Client Request 2:
/catalog?Add=108&sessionid=1.
Server Reply 2:
“OK”
Class CatalogServlet
{
doGet(HttpServletRequest req,
HttpServletResponse res )
{
HttpSession session = req.getSession();
String bookId = req.getParameter(“Add");
try {
ShoppingCart cart = (ShoppingCart)
session.getAttribute(“Cart”,sc);
cart.add(bookId, book);
}
out.println(“comprando” +book.GetTitle());
}
}
8
Sesiones con HTTPSession (III)
Client Request 1:
/catalog.
Server Reply 1:
“página productos en venta”.
+ URL con sessionid=1..
Client Request 2:
/catalog?Add=108&sessionid=1.
Server Reply 2:
“OK”
Client Request 3:
/ShowCart&sessionid=1.
Server Reply 3:
“OK”
Class ShowCartServlet
{
doGet(HttpServletRequest req,
HttpServletResponse res )
{
HttpSession session = req.getSession();
try {
ShoppingCart cart = (ShoppingCart)
session.getAttribute(“Cart”,sc);
out.println(” El total es “ +
cart.getTotal());
}
}
Variables “compartidas”
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastasActuales extends HttpServlet {
Static int pujaActualBMW = 0;
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Subastas Actuales
</title> </head><body>");
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
…… pujaActual = Integer.parseInt
(request.getParameter("miPuja")); }
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaFerari extends HttpServlet {
Static int pujaActualFerrari= 0;
9
Servlets: Contexto (I)
Contexto: Conjunto de servlets, paginas web y
otros recursos que forman una aplicación.
Instalados en el mismo directorio del
contenedor.
BuyServlet
SellServlet
www.ebay.com/subastas/BuyServlet
ListaPujas
www.ebay.com/subastas/SellServlet
Pueden tener objetos compartidos.
?
?
out.println("</body></html>");
}
}
10
Servlets: Contexto (II)
HelloServlet
Se accede por mismo directorio en URL.
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
out.println(“Subasta BMW, puja actual:”
+pujaActuaBMWl);
out.println(“Subasta Ferrari, puja actual:”
+pujaActualFerrari);
tablas.html
colors.html
/Subastas
Pueden llamarse entre ellos para componer una
página web.
11
public class NewBDServlet extends HttpServlet
{
Private BookDB bookDB;
Public void Init()
{
bookDB = BookDB.instance();
//BookDB.addBook( new Book());
ServletContext context = getServletContext();
context.setAttribute(“example.bookstore.database“
,bookDB);
}
}
public class CatalogServlet extends HttpServlet
{
Public void Init()
{
ServletContext context = getServletContext();
bookDB =
(BookDB)context.getAttribute(“example.bookstore.
database“);
}
}
Objetos compartidos por varios
servlet dentro de un contexto.
Interface ServletContext
void setAttribute(String name,
Object object)
Object getAttribute(String name)
NewDBServlet
CatalogServlet
bookDB
Index.html
colors.html
/bookstore
12
Syncronized en Servlets
Multiples Clientes “Concurrentes”
<
POST /SubastaBMW
miPuja=50
t=1. A puja 50E por BMW
H1 H2
POST /SubastaBMW
miPuja=60
eBay
Server
t=1. B puja 60E por BMW
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
Static int pujaActual = 0;
Static int pujaActual = 0;
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
pujaActual = Integer.parseInt
(request.getParameter("miPuja"));
public synchronized
doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
pujaActual = Integer.parseInt
(request.getParameter("miPuja"));
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Gracias!
</title></head><body>");
out.println(“Has pujado” +pujaActual);
out.println("</body></html>");
}
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Gracias!</title>
</head><body>");
out.println(“Has pujado” +pujaActual);
out.println("</body></html>");
}
13
}
Bloque de Código Syncronized
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SubastaBMW extends HttpServlet {
Static int pujaActual = 0;
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Gracias!
</title></head><body>");
synchronized(this) {
pujaActual = Integer.parseInt
(request.getParameter("miPuja"));
out.println(“Has pujado” +pujaActual);
}
out.println("</body></html>");
}
Syncronized crea un
MONITOR en cada objeto
de esa clase:
*Solo un único thread
puede acceder a todo el
objeto.
void
Subasta
Servlet
Monitor
Instruction execution order:
• Hilo 1 llama doPost,
• pujaActual=10,
• Hilo 1: “Has Pujado 10!”
Hilo 2 llama doPost,
• pujaActual=20,
• Hilo 2: “Has Pujado 20!”
14
Time
Servidor Proxy Cache (I)
Si el método es utilizado
frecuentemente, Syncronized
puede hace que el sistema sea
ineficiente (Las threads estan
esperando en el monitor para
entrar en el método):
1.
2.
Servidor Web reenvia petición (1,b), almacena
respuesta (1.c) y devuelve respuesta (1.d).
Servidor Web encuentra recurso localmente (2.b), y lo
devuelve (2.c).
Sincronizar un bloque de
código.
Client
1.a
1.d
pujaActual
=….
1.b
Proxy
server
2.a.
2.b.
Monitor
Client
1.c.
2.c.
Situados en mismo lugar
15
Web
server
Web
server
Internet
16
Consistencia de datos en
Servidor Proxy Cache
Servidor Proxy Cache (II)
Ventajas: disminuye tráfico WAN, acceso local es más
rápido, a veces.
Desventajas: Tasa aciertos (HitRate) < 50% con disco
duro 10 Gbytes.
Timeout.
mensaje a servidor origen If-Modified-Since (2.b)
Client
1.a
1.b
1.d
2.b.
1.c.
Multiples servicios en un solo hardware.
Configurar DNS server y Apache server.
In DNS server conf file
DNS
<VirtualHost *:80>
DocumentRoot /www/grid
ServerName www.grid.com
ErrorLog logs/serverGridlog
</VirtualHost>
Client
GET www.grid.com
Client
GET www.unavarra.es
In apache httpd.conf file
NameVirtualHost *:80
www.grid.com
125.12.43.5
server
125.12.43.5
www.unavarra.es
www.grid.com
1.c.
2.d.
<VirtualHost *:80>
DocumentRoot /www/unavarra
ServerName www.unavarra.es
ErrorLog logs/serverUPNAlog
</VirtualHost>
19
Situados en mismo lugar
Web
server
2.b
Web
server
Internet
1 maquina con 1 IP, 2 servicios con diferente nombre.
www.grid.com 125.12.43.5
www.unavarra.es 125.12.43.5
Proxy
server
2.c.
Client
Virtual Hosts
1.b
2.a.
Web
server
17
1.a
1.d
2.c.
Situados en mismo lugar
(si FALSE) acceder a Cache,
(si TRUE) pedir nueva version a servidor origen.
Client
Proxy
server
2.a.
Client
Web
server
(si time<timeout) acceder a Cache,
(si time>timeout) acceder a página de servidor origen.
Internet
18
Descargar