Download Invocación remota de métodos

Document related concepts
no text concepts found
Transcript
Invocación remota de métodos
Jorge Iván Meza Martínez
[email protected]
Especialización en Gestión de Redes de Datos
Universidad Nacional de Colombia – Sede Manizales
1/58
Contenidos
●
Capas de middleware
●
Protocolo request-reply
●
Invocación remota de procedimientos (RPC)
●
Interfaz vs. Implementación
●
Lenguaje de definición de interfaces
●
Invocación remota de métodos (RMI)
–
Caso de estudio: Java RMI
2/58
Evaluación pre-contenido
1. En qué consiste la invocación remota de
procedimientos o RPC ?
2.En qué consiste la invocación remota de métodos o
RMI ?
3.En qué se diferencian RPC/RMI de la transmisión de
información a través de sockets ?
4.Qué es la interfaz y la implementación de un servicio ?
5.Cuál es la utilidad de un lenguaje de definición de
interfaces ?
6.Para qué son útiles el stub y el skel en RMI ?
3/58
Introducción
●
●
●
●
Se basa en el patrón de paso de mensajes y su
comunicación se realiza internamente a través de
sockets.
Provee un protocolo para establecer comunicaciones
de dos vías: request y reply.
Provee el soporte para la ejecución remota de
operaciones.
Los casos mas conocidos son RPC (remote
procedure call) en el paradigma procedimental y
RMI (remote method invocation) en el orientado a
objetos.
4/58
Capas de middleware
5/58
Protocolo request - reply
6/58
Invocación remota de procedimientos
●
●
●
●
Su meta es hacer que la programación distribuida se
vea igual que la convencional.
Transparencia en el acceso.
Los procedimientos remotos son manipulados por
los desarrolladores de la misma manera como se
hace con los locales.
Oculta necesidades como la codificación de
información, paso de mensajes, preservar la
semántica de las invocaciones, etc.
7/58
Conceptos de diseño para RPC
●
Estilo de programación → basada en interfaces.
●
Semántica de las invocaciones.
●
Elementos clave de transparencia.
8/58
Interfaz
Interfaz versus implementación
Implementación
Pública
Privada
9/58
Interfaz versus implementación
Cómo los
provee
Implementación
Interfaz
Los servicios
que provee
10/58
Beneficios de la separación
●
●
●
Abstracción → sólo es necesario conocer que
servicios se ofrecen sin profundizar en los detalles
de como fueron desarrollados.
Los usuarios no necesitan conocer detalles de su
implementación como en que lenguaje están hechos
(heterogeneidad).
Permite la actualización de la implementación de los
servicios sin impacto en el sistema mientras se
mantegan las interfaces.
11/58
Lenguaje de definición de interfaces
(IDL)
Proceso #1
Proceso #2
Marshalling / serialization
12/58
Ejemplos de IDL
●
Sun XDR → RPC
●
Corba IDL → RMI
●
WSDL → Servicios Web
13/58
Ejemplo Corba IDL
// In file Person.idl
struct Person {
string name;
string place;
long year;
};
interface PersonList {
readonly attribute string listname;
void addPerson(in Person p) ;
void getPerson(in string name, out Person p);
long number();
};
14/58
Semántica de las invocaciones
15/58
Transparencia
●
●
●
La invocación de procedimientos remotos es tan
parecida a los procedimientos locales como sea
posible.
La transformación de entidades (marshalling) y el
paso de mensajes permanece oculto al desarrollador.
La solicitud de retransmisiones y la recepción de la
información se maneja automáticamente.
→ Transparencia de ubicacion y acceso.
16/58
Implementación de RPC
17/58
Remote Method Invocation
●
●
●
●
●
Similar a RPC pero en el mundo de los objetos
distribuidos.
Su desarrollo se basa también en el uso de interfaces
sobre protocolos request – reply.
Ofrece un nivel de transparencia similar al de RPC.
Permite una completa interacción de los objetos
remotos con los locales.
Permite la manipulación de las referencias de los
objetos remotos.
18/58
Retos del diseño de RMI
●
El modelo de objetos
–
Referencias a objetos
–
Uso de interfaces
–
Invocación de acciones
–
Manejo de excepciones
–
Recolección de basura
19/58
Retos del diseño de RMI
●
Objetos distribuidos
20/58
Retos del diseño de RMI
●
Modelo de objetos distribuidos
Referencias a objetos remotos a través de las interfaces remotas
21/58
Implementación de RMI
22/58
Implementación de RMI
23/58
Roles de los objetos del middleware
●
●
Proxy
–
Hacer transparente el acceso al objeto remoto por
parte del cliente.
–
Hay un proxy por cada objeto remoto.
Dispatcher
–
●
Enrruta las solicitudes y respuestas desde y hacia los
objetos correspondientes.
Skeleton
–
Recibe las solicitudes transforma los parámetros e
invoca el método remoto (ahora local).
24/58
Caso de estudio: Java RMI
●
●
●
●
Interacción Java → Java o Java → IDL.
Se integra naturalmente al modelo de objetos de
Java.
Es necesario considerar la concurrencia en la
implementación.
Los argumentos y valores retornados deben ser
Serializable.
25/58
Caso de estudio: Java RMI
●
●
●
Los objetos remotos deben implementar la interfaz
Remote.
Los métodos remotos deben manejar la excepción
RemoteException.
Los objetos remotos pasan como parámetros por
referencia mientras que los objetos locales pasan
como parámetros por valor.
26/58
Caso de estudio: Java RMI
27/58
Pasos del desarrollo
●
●
●
●
●
Diseñar las interfaces remotas.
Implementar los objetos remotos que implementan
las interfaces remotas.
Hacer disponible las clases en la red.
Implementar el servidor que publica los objetos
remotos.
Implementar el cliente que obtiene y manipula los
objetos remotos.
28/58
Ejemplo: clases utilizadas
RMI Registry
Servidor
Cliente
Invocación
Remota
Invocación
Stub
Respuesta
Skel
Respuesta
Interfaz local
(sin implementación)
Objeto remoto
(con implementación)
29/58
30/58
Evaluación post-contenido
1. En qué consiste la invocación remota de
procedimientos o RPC ?
2.En qué consiste la invocación remota de métodos o
RMI ?
3.En qué se diferencian RPC/RMI de la transmisión de
información a través de sockets ?
4.Qué es la interfaz y la implementación de un servicio ?
5.Cuál es la utilidad de un lenguaje de definición de
interfaces ?
6.Para qué son útiles el stub y el skel en RMI ?
31/58
Ejemplo: clases utilizadas
●
●
●
●
Interfaz Saludable extends Remote
Define la especificación de los métodos remotos.
Debe ser conocida por cliente y servidor.
Clase SaludableImpl implements Saludable
Sus instancias son los objetos que pueden invocarse
remotamente.
Clase SaludadorServer
Publica los objetos remotos
Clase SaludadorClient
Localiza los objetos remótos e invoca métodos en
ellos.
32/58
Interfaz remota: Saludable.java
import java.rmi.*;
public interface Saludable extends Remote {
String saludar(int hora, String nombre)
throws RemoteException;
// especificación de otros métodos remotos ...
} 33/58
Implementación objeto remoto:
SaludableImpl.java
import java.rmi.*;
public class SaludableImpl implements Saludable
{
public SaludableImpl()
{ super();
}
// Implementación de métodos no remotos … // Implementación de métodos remotos … public String saludar(int hora, String nombre)
throws RemoteException
{
// …
}
}
34/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Saludador", stub);
35/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
Crea un manejador de seguridad para
registry.rebind("Saludador", stub);
la publicación del objeto remoto
36/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
Crea una instancia del objeto remoto.
registry.rebind("Saludador", stub);
(Polimorfismo interfaz → implementación)
37/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Saludador", stub);
Creación del stub para el objeto remoto.
38/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Obtención del sistema de registro de RMI.
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Saludador", stub);
39/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Publicación del stub y con él del
Saludable unSaludable = new SaludableImpl();
objeto remoto en el framework de RMI.
Se registra con el nombre de Saludador.
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Saludador", stub);
40/58
Implementación del servidor del objeto
remoto: SaludadorServer.java
System.setSecurityManager(
new RMISecurityManager());
Saludable unSaludable = new SaludableImpl();
Saludable stub = (Saludable)
UnicastRemoteObject.exportObject(unSaludable, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind("Saludador", stub);
41/58
Implementación del cliente del objeto
remoto
System.setSecurityManager(
new RMISecurityManager());
Registry registry = LocateRegistry.getRegistry(HOST);
Saludable saludador = (Saludable) registry.lookup("Saludador");
Creación de un manejador de seguridad
System.out.println("Hola a las 08:00 am: " + para acceder al objeto remoto
saludador.saludar(8, "Jorge"));
42/58
Implementación del cliente del objeto
remoto
System.setSecurityManager(
new RMISecurityManager());
Registry registry = LocateRegistry.getRegistry(HOST);
Saludable saludador = (Saludable) registry.lookup("Saludador");
System.out.println("Hola a las 08:00 am: " + Obtención del sistema de registro RMI
saludador.saludar(8, "Jorge"));
en el servidor especificado.
43/58
Implementación del cliente del objeto
remoto
System.setSecurityManager(
Búsqueda del objeto solicitado (Saludador)
new RMISecurityManager());
en el sistema de registro requerido.
Registry registry = LocateRegistry.getRegistry(HOST);
Saludable saludador = (Saludable) registry.lookup("Saludador");
System.out.println("Hola a las 08:00 am: " + saludador.saludar(8, "Jorge"));
44/58
Implementación del cliente del objeto
remoto
System.setSecurityManager(
new RMISecurityManager());
Invocación de métodos en el
Registry registry = objeto remoto.
LocateRegistry.getRegistry(HOST);
Saludable saludador = (Saludable) registry.lookup("Saludador");
System.out.println("Hola a las 08:00 am: " + saludador.saludar(8, "Jorge"));
45/58
Implementación del cliente del objeto
remoto
System.setSecurityManager(
new RMISecurityManager());
Registry registry = LocateRegistry.getRegistry(HOST);
Saludable saludador = (Saludable) registry.lookup("Saludador");
System.out.println("Hola a las 08:00 am: " + saludador.saludar(8, "Jorge"));
46/58
Compilar la interfaz: común en el
cliente y en el servidor
$ javac Saludable.java
$ jar cvf saludable.jar Saludable.class
→ saludable.jar
47/58
Compilar el servidor
$ javac ­cp saludable.jar \
SaludableImpl.java \
SaludadorServer.java
48/58
Compilar el cliente
$ javac ­cp saludable.jar \
SaludadorClient.java
49/58
Crear las políticas de seguridad
server.policy
grant {
permission java.security.AllPermission;
};
client.policy
grant {
permission java.security.AllPermission;
};
50/58
Crear las políticas de seguridad
server.policy
grant {Estas políticas sólo deben utilizarse
permission java.security.AllPermission;
durante el desarrollo ya que son
};
demasiado permisivas. Deben ajustarse
según los requisitos del contexto antes
client.policy
de pasarse el sistema a producción.
grant {
permission java.security.AllPermission;
};
51/58
Ejecutar el servicio de registro de objetos
$ rmiregistry
$ rmiregistry &
dos> start rmiregistry
52/58
Ejecutar el servidor
Linux
$ java ­cp .:saludable.jar
\
­Djava.security.policy=server.policy \
SaludadorServer
Windows
$ java ­cp .;saludable.jar
\
­Djava.security.policy=server.policy \
SaludadorServer
53/58
Ejecutar el cliente
Linux
$ java ­cp .:saludable.jar \
­Djava.security.policy=client.policy \
SaludadorClient
Windows
$ java ­cp .;saludable.jar \
­Djava.security.policy=client.policy \
SaludadorClient
54/58
El resultado de la invocación remota
Hola a las 08:00 am: Buenos dias Jorge
Hola a las 16:00 am: Buenas tardes Jorge
Hola a las 20:00 am: Buenas noches Jorge
55/58
Actividad
Se desea desarrollar un sistema mediante la invocación remota
de métodos que permita administrar un parqueadero de 5
lugares (numerados desde el 1 hasta el 5).
Cuando llegue un carro este podrá verificar si existe al menos
un espacio disponible y de estarlo podrá parquearse. Para
guardar un carro en el parqueadero se deberá especificar su
número de placa y el sistema le informará el número del
espacio del parqueadero donde fue guardado.
56/58
Actividad
Para retirar un carro del parqueadero se deberá especificar su
número de placa o el número del lugar donde fue parqueado.
Una vez retirado el sitio queda libre para otro carro.
El sistema verificará que no será posible retirar un carro que no
haya ingresado ni uno de una ubicación que no exista en las
instalación físicas del parqueadero.
57/58
Actividad
●
Identifique las entidades involucradas.
●
Establezca las funcionalidades del sistema.
●
Determine las responsabilidades de cada entidad.
●
Diseñe la interfaz remota.
●
Realice la implementación de la intefaz remota.
●
Realice la implementación del servidor.
●
Realice la implementación del cliente.
58/58