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 jimezam@gmail.com 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