Download PPT

Document related concepts
no text concepts found
Transcript
Java RMI
Sistemas distribuidos
María de los Santos Pérez Hernández
[email protected]
Entornos orientados a objetos
• Tendencia actual hacia sistemas compuestos por un conjunto de
objetos que interactúan entre sí.
– Un programa solicita servicios invocando los métodos que
ofrece un objeto.
– La invocación de métodos se ve como un paso de mensajes.
Sistemas Distribuidos
1
Entornos orientados a objetos
op1
op2
DATOS
Implementación de
métodos
opN
Sistemas Distribuidos
(op1, op2, ..., opN)
2
Entornos orientados a objetos
•
•
•
•
•
•
•
•
•
•
•
Comunicación entre objetos: Mensajes.
Encapsulación.
Identidad del objeto (Identificación).
Herencia.
Acciones.
Clases.
Instancias.
Interfaces vs implementaciones.
Herencia múltiple.
Enlace dinámico.
Recolección de basura.
Sistemas Distribuidos
3
Enlace dinámico
Shape *aShape;
ShapeList *aList;
int n = aList ->numberElements();
for (int i=1; i<=n; i++) {
aShape = aList -> nthELement();
cout << “Perimeter:” << aShape->perimeter() << “\n”;
}
Sistemas Distribuidos
4
Modelo de objetos
Sistemas Distribuidos
5
Modelo de objetos en sistemas distribuidos
Máquina A
Sistemas Distribuidos
Máquina B
6
Máquina C
Modelo de objetos en sistemas distribuidos
• Sistemas distribuidos.
– Aplicaciones inherentemente distribuidas.
– Se caracterizan por su complejidad.
• Sistemas orientados a objetos.
– Más cercanos al lenguaje natural.
– Facilitan el diseño y la programación.
Sistemas Distribuidos
7
Modelo de objetos en sistemas distribuidos
• ANSA (1989-1991) fue el primer proyecto que intentó
desarrollar una tecnología para modelizar sistemas distribuidos
complejos
– Utilizaba un diseño orientado a objetos
• Estándares:
– RMI: invocación de métodos remotos de Java
– CORBA: expande DCE con servicios orientados a objetos
– DCOM: versión CORBA de Microsoft
Sistemas Distribuidos
8
Modelo de objetos en sistemas distribuidos
• ROID: Remote Object IDentifier.
– Java RMI: ObjID.
• Localización de objetos.
– Servicio de nombres.
• Control de concurrencia.
• Transacciones.
• Protección de objetos.
• Recolección de basura de objetos remotos.
Sistemas Distribuidos
9
Invocación de métodos remotos (RMI)
• Comunicación cliente/servidor => RPC.
• Sistemas distribuidos basados en objetos => RMI (Remote
method invocation).
• RMI: Acción de invocar un método de un interfaz remoto en un
objeto remoto.
• RMI ofrece:
– Mecanismos para crear servidores y objetos cuyos métodos
se puedan invocar remotamente.
– Mecanismos que permiten a los clientes localizar los objetos
remotos.
Sistemas Distribuidos
10
Invocación de métodos remotos en Java
• Java RMI
• El soporte para RMI en Java está basado en las interfaces y
clases definidas en los paquetes java.rmi y java.rmi.server
• Características de Java RMI:
– No requiere un IDL (Interface Definition Language).
– La transferencia de objetos de tipos de datos complejos se lleva a cabo
mediante mecanismos de serialización.
– Es necesario tratar mayor número de excepciones que en el caso de
invocación de métodos locales.
Sistemas Distribuidos
11
Invocación de métodos remotos en Java
• Localización de objetos remotos:
– Servidor de nombres: java.rmi.Naming
• Ejemplo:
BankAccount acct = new BankAccountImpl();
String url = “rmi://java.Sun.COM/account”;
// enlazamos una url a un objeto remoto
java.rmi.Naming.bind(url, acct);
....
// búsqueda de la cuenta
acct = (BankAccount) java.rmi.Naming.lookup(url);
Sistemas Distribuidos
12
Arquitectura de Java RMI
Sistemas Distribuidos
13
Arquitectura de Java RMI
• Nivel de transporte: se encarga de las comunicaciones y de
establecer las conexiones necesarias
• Nivel de gestión de referencias remotas: trata los aspectos
relacionados con el comportamiento esperado de las referencias
remotas (mecanismos de recuperación, etc.)
• Nivel de resguardo/esqueleto (proxy/skeleton) que se encarga
del aplanamiento (serialización) de los parámetros
– proxy: resguardo local. Cuando un cliente realiza una
invocación remota, en realidad hace una invocación de un
método del resguardo local.
– Esqueleto (skeleton): recibe las peticiones de los clientes,
realiza la invocación del método y devuelve los resultados.
Sistemas Distribuidos
14
¿Cómo escribir aplicaciones con Java RMI?
1
Definición de la
interfaz remota
2
Implementación de la
interfaz remota
(.java)
3
javac
(.class)
4
Servidor
(.class)
rmic
8
Cliente
usa
Esqueleto
(.class)
Esqueleto
(.class)
5
(.java)
9
Arrancar RMIRegistry
javac
6
Crear los objetos
(.class)
10
7
Ejectuar
Cliente
Registrar los objetos
SERVIDOR
CLIENTE
Sistemas Distribuidos
15
Ejemplo
Sistemas Distribuidos
16
Modelización de la interfaz remota (Sumador)
public interface Sumador extends java.rmi.Remote
{
public int sumar(int a, int b)
throws java.rmi.RemoteException;
}
Sistemas Distribuidos
17
Clase que implementa la interfaz (SumadorImpl)
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class SumadorImpl extends UnicastRemoteObject implements
Sumador {
public SumadorImpl(String name) throws RemoteException {
super();
try {
System.out.println("Rebind Object " + name);
Naming.rebind(name, this);
} catch (Exception e){
System.out.println("Exception: " + e.getMessage());
e.printStackTrace();
}
}
public int sumar (int a, int b) throws RemoteException {
return a + b;
}
}
Sistemas Distribuidos
18
Código del servidor (SumadorServer)
import java.rmi.*;
import java.rmi.server.*;
public class SumadorServer {
public static void main (String args[]) {
try {
SumadorImpl misuma = new
SumadorImpl("MiSumador");
} catch(Exception e) {
System.err.println("System exception" + e);
}
}
}
Sistemas Distribuidos
19
Registro del servicio
• Antes de arrancar el cliente y el servidor, se debe arrancar el
programa rmiregistry en el servidor para el servicio de nombres.
El puerto que utiliza el rmiregistry por defecto es el 1099.
– rmiregistry [port_number]
• El método rebind es utilizado normalmente en lugar del método
bind, porque garantiza que si un objeto rémoto se registró
previamente con dicho nombre, el nuevo objeto reemplazará al
antiguo.
Sistemas Distribuidos
20
Código en el cliente (SumadorClient)
import java.rmi.registry.*;
import java.rmi.server.*;
public class SumadorClient {
public static void main(String args[]){
int res = 0;
try {
System.out.println("Buscando Objeto ");
Sumador misuma = (Sumador)Naming.lookup("rmi://" + args[0] +
"/" +"MiSumador");
res = misuma.sumar(5, 2);
System.out.println("5 + 2 = " + res);
}
catch(Exception e){
System.err.println(" System exception");
}
System.exit(0);
}
}
Sistemas Distribuidos
21
Búsqueda
• Cualquier programa que quiera instanciar un objeto remoto debe
realizar una búsqueda de la siguiente forma:
Sumador misuma = (Sumador)Naming.lookup("rmi://" + args[0] + "/"
+"MiSumador");
• El método lookup devuelve una referencia remota a un objeto
que implementa la interfaz remota.
• El método lookup interactúa con rmiregistry.
Sistemas Distribuidos
22
Pasos
• Java RMI:
– Enlace a un nombre: bind(), rebind()
– Encontrar un objeto y obtener su referencia: lookup()
– refObj.nombre_met()
Sistemas Distribuidos
23
Cuadro general
Cliente
Servidor
op1
op2
opN
Stub
Skeleton
Red
Sistemas Distribuidos
24
¿Cómo se ejecuta?
• Compilación
javac Sumador.java
javac SumadorImpl.java
javac SumadorClient.java
javac SumadorServer.java
• Generación de los esqueletos
rmic SumadorImpl
• Ejecución del programa de registro de RMI
rmiregistry
• Ejecución del servidor
java SumadorServer
• Ejecución del cliente
java SumadorCliente <host-del-servidor>
Sistemas Distribuidos
25
Java RMI vs CORBA
• Java RMI es más sencillo:
– Trata sólo con objetos Java.
• Java RMI permite pasar por valor cualquier objeto que se pueda
“serializar”.
• CORBA es más flexible:
– Proporciona soporte RMI de objetos implementados en
diversos lenguajes y clientes escritos también en distintos
lenguajes.
• CORBA añade bastante complejidad.
Sistemas Distribuidos
26
Referencias bibliográficas
• Distributed Systems. Concepts and Design. 2º edición
G. Coulouris, J. Dollimore, T. Kindberg.
Addison-Wesley, 1994
http://www.dcs.qmw.ac.uk/research/distrib/book.html
• Información on-line de Sun (Remote Method Invocation
Specification):
http://java.sun.com/products/jdk/1.1/docs/guide/rmi/spec/rmiT
OC.doc.html
• Distributed Operating Systems
A. S. Tanenbaum
Prentice-Hall, 1995
Sistemas Distribuidos
27