Publicado el 17 de Enero del 2019
696 visualizaciones desde el 17 de Enero del 2019
361,1 KB
20 paginas
+
Java RMI
Sistemas Distribuidos
Rodrigo Santamaría
+ Java RMI
• RMI
• Java RMI
2
+
RMI
3
l Remote Method Invocation: middleware para que un
objeto que se ejecuta en una JVM use métodos de otro
objeto que se ejecuta en otra JVM (local o remota)
l Un paso más allá de los sockets
l
Introducción a RMI y tutorial:
l http://download.oracle.com/javase/tutorial/rmi/overview.html
l Tutorial de sockets:
l http://download.oracle.com/javase/tutorial/networking/sockets/
clientServer.html
+
RMI
Aplicación
4
l Aplicación basada en RMI
l Dos fases fundamentales
l Localizar objetos remotos
Registrados mediante el registro RMI
Pasados por referencia en invocaciones remotas
l Comunicarse con objetos remotos
Gestionado por el servidor RMI, para el usuario es como
llamar a métodos locales
+
RMI vs Sockets
5
RMI
Sockets
n Invocación de objetos remotos
n Invocación de métodos remotos
n Sencillo
n Complicado
n No hay un protocolo
n Necesidad de un protocolo
n Genera mucho tráfico
n Stub+registro+objetos
n Genera poco tráfico
En el fondo, RMI = Sockets + Serialización + Algunas utilidades
+
RMI
Implementación
6
1. Definir interfaz con los métodos remotos
n Será conocida por cliente y servidor
2. Implementar el servidor
1. El elemento que dará el servicio de la interfaz
3. Instanciar el servidor y registrarlo mediante un stub:
n Referencia remota al servidor generada por RMI para el uso
de los clientes
4. Implementar el cliente que usará el servicio
+ Java RMI
• RMI
• Java RMI
7
+
Java RMI
Implementación
8
1. Interfaz: clase que extiende java.rmi.Remote
2. Servidor: clase que implementa la interfaz
n Puede tener más métodos que los de la interfaz
3. Stub: instancia de la interfaz asociada a un servidor
n Sólo contiene los métodos de la interfaz
n Es la que se registra en RMI
4. Cliente: cualquier clase que localice el stub y use su
interfaz
+
Java RMI
Esquema
pepe.usal.es
Interfaz
9
1) Publicación
maria.usal.es
Interfaz
2) Implementación
Cliente
4) Uso
b
u
t
S
3) Registro
Servicio
+
Java RMI
Interfaz
10
/**
* Interfaz para un servicio RMI de corredores de bolsa
* Debe heredar de java.rmi.Remote
* Debe manejar RemoteException en sus métodos
*/
public interface Corredor extends Remote
{
String listarTitulos() throws RemoteException;
void comprar(String nombre, int cantidad) throws RemoteException;
void vender(String nombre, int cantidad) throws RemoteException;
}
+
Java RMI
Interfaz: publicación
11
n La interfaz debe ser accesible a cliente y servidor
n La interfaz debe ser idéntica en ambos extremos
n Tres formas de publicación
n Como clases sin compilar (ficheros .java)
n Si los compiladores o los ficheros no son iguales, dará error
n Como clases compiladas (ficheros .class)
n Si las versiones de java no son iguales, puede dar error
n Como archivo .jar
n La mejor opción:
cd /home/usuario/workspace/rmiInterface/src
javac rmiInterface/Corredor.java
jar cvf bolsaInterface.jar rmiInterface/*.class
+
Java RMI
Interfaz: codebase
12
n Lugar desde el que se cargan las clases en la JVM
n P. ej. el CLASSPATH es un codebase “local”
n El codebase “remoto” se usa para acceder a las clases desde
applets o RMI, mediante URLs
n El codebase se puede modificar
n Como argumento de la JVM: -Djava.rmi.codebase="url"
n Desde el código:
n System.setProperty("java.rmi.server.codebase", "url");
n En Java RMI, la url del codebase debe apuntar a la
localización de las interfaces compartidas
+
Java RMI
Interfaz: URLs
13
n En el caso de una carpeta con clases (.java o .class), se
referencia la carpeta:
n "file:///Users/rodri/Documents/workspace/assoo/bin/"
n En el caso de un único fichero, lo referenciamos directamente
n "file:///Users/rodri/Documents/workspace/interface.jar"
n En teoría, nuestra interfaz podría estar publicada y acceder a
ella mediante una url remota:
n "http://vis.usal.es/rodrigo/documentos/aso/rmi/interface.jar"
n Sin embargo, muchas implementaciones de RMI no lo soportan o
requieren reconfiguraciones del registro
14
+
Java RMI
Servidor y Stub
/**
* Servidor de bolsa que implementa Corredor
* Debe implementar una interfaz de java.rmi.Remote
*
*/
public class Bolsa implements Corredor
{
String listarTitulos() throws RemoteException
{...}
void comprar(String nombre, int cantidad) throws RemoteException;
{...}
void vender(String nombre, int cantidad) throws RemoteException;
{...}
//Cualquier otra función interna que sea necesaria
}
//Registramos un objeto Bolsa de nombre “LaBolsa”
String nombre="LaBolsa";
Corredor motor=new Bolsa();
Corredor stub=(Corredor) UnicastRemoteObject.exportObject(motor,0);
Registry registro=LocateRegistry.getRegistry();
registro.rebind(nombre,stub);
+
Java RMI
Stub: registro
15
n Para poder registrar el stub al nombre de servicio, debe
estar activado el registro RMI (rmiregistry)
n Tres maneras:
l Desde un terminal con
rmiregistry [port]
l Desde java con
Runtime.getRuntime().exec("rmiregistry");
l Desde java con
LocateRegistry.createRegistry(int port);
l Cuidado: no iniciar un registro si ya hay otro corriendo
+
Java RMI
Stub: registro
16
n Dos modos de asociar un stub a un registro desde Java:
n Mediante java.rmi.registry.Registry
n Registry registro=LocateRegistry.getRegistry();
n registro.rebind(nombre,stub);
n Mediante java.rmi.Naming
n Naming.rebind(nombre, stub)
+
Java RMI
Cliente
17
public class Cliente
{
public static void main(String args[])
{
try
{
String nombre="LaBolsa";
//Instanciar el registro RMI
Registry registro=LocateRegistry.getRegistry(args[0]);
//Instanciar un objeto de la clase del servidor
Corredor corredor=(Corredor) registro.lookup(nombre);
//Uso del servicio
...
}
catch (Exception e)
{
System.err.println("Excepción en el cliente de la bolsa:");
e.printStackTrace();
}
}
}
18
+
Java RMI
Cliente: búsqueda
n Dos modos de buscar el stub de un servicio:
n Mediante java.rmi.registry.Registry
n Registry registro=LocateRegistry.getRegistry();
n registro.lookup(nombre);
n Mediante java.rmi.Naming
n Naming.lookup(nombre)
+
Java RMI
Gestor de seguridad
19
l Si nuestra interfaz contiene métodos que requieren como
argumentos o devuelven clases distintas del API de Java, hay
que implementar un gestor de seguridad
l Para evitar intrusiones de código maligno
l Para activar el gestor:
if (System.getSecurityManager()==null)
System.setSecurityManager(new SecurityManager());
l Podemos modificar la política de seguridad de Java con
un fichero de permisos con líneas como:
grant{ permission java.security.AllPermission; };
Y especificar el fichero con la opción de la JVM
l -Djava.security.policy=grantFilePath
20
Comentarios de: JavaRMI (0)
No hay comentarios