Vous êtes sur la page 1sur 18

RMI

Aplicaciones Distribuidas

Contenido

Objetos Distribuidos y RMI.

Interface Remota.

Clase Implementacin.

Referencias Remotas.

Registro RMI.

Paso de parmetros.

Descarga dinmica de cdigo.

Desarrollo y despliegue.

Limitaciones RMI.
2

Objetos Distribuidos

Motivacin:
La escalabilidad se consigue con la distribucin.
La distribucin se consigue con la fragmentacin en mdulos.
En una aplicacin OO, los mdulos estn definidos por clases.

Objetivo:
Distribuir los objetos de una aplicacin de forma transparente.

Solucin: Tecnologas de Objetos Distribuidos

Objetos Distribuidos

Desafos:
Transparencia para el cliente del objeto distribuido.
Transparencia para el programador del objeto.
Extender el concepto de referencia a un entorno distribuido.
Definir un protocolo de comunicacin.
...

Experiencia previa:
Llamadas a procedimientos remotos: RPC.

Plataforma ms sencilla:
RMI
Ejecucin en un entorno controlado (JVM) e interaccin entre
objetos del mismo lenguaje.
4

RMI
Tecnologa para la programacin con Objetos Distribuidos en
Java.
Motivacin:
Que objetos residentes en mquinas virtuales distintas
puedan colaborar.
Solucin:
No intrusiva: no se modifica el lenguaje Java.
Basada en interfaces, en el patrn Proxy y Broker.

Interface Remota

Un objeto distribuido es accesible a travs de una Interface Remota.


Mtodos que pueden ser llamados de forma distribuida.

Es una interface Java con las siguientes restricciones:


Debe extender la interface marca java.rmi.Remote.
Todas las operaciones deben lanzar al menos la excepcin
java.rmi.RemoteException
import java.rmi.*;!

!
public interface Contador extends Remote {!
!!
!public void inc() throws RemoteException;!
!!
!public void dec() throws RemoteException;!
!!
!public void set(int valor) throws RemoteException;!!
!public int get() throws RemoteException;!
}

Clase Implementacin
Clase que implementa la interface remota.
Ninguna restriccin de implementacin.
!
public class ContadorImpl implements Contador {!
!!
!private int valor = 0;!
!!
!public void inc () { valor ++; }!
!!
!public void dec () { valor --; }!
!!
!public void set (int valor) { this.valor =
valor; }!
!!
!public int get() { return valor; }!
}!

Activacin de un Objeto
Distribuido

JVM:
Acta de registro de los objetos distribuidos que se ejecutan en la
mquina virtual.
Colabora con otras JVM para la comunicacin
Identifica las llamadas a los objetos.
...
Patrn Broker.

Para que un objeto distribuido pueda recibir llamadas remotas es


necesario activarlo:
UnicastRemoteObject.exportObject(obj);

Referencias Remotas

Una referencia remota es una referencia Java que permite acceder al


objeto distribuido:
Una referencia siempre apunta a un objeto en la JVM.
Una referencia remota apunta a un objeto proxy.

Proxy (Stub):
Clase que implementa la interface remota.
Implementa los mtodos delegando en el objeto distribuido.
Transparencia para el cliente.

Delegacin: protocolo JRMP.


El proxy codifica los parmetros de la llamada.
Indica a la JVM que quiere enviar un mensaje a un objeto distribuido (conoce
su direccin de transporte e identidad).
Espera la respuesta y devuelve el valor de la llamada.
9

Referencias Remotas
Recepcin de peticiones:
La JVM destino recibe una peticin de acceso a un objeto
distribuido.
Identifica el objeto y delega el procesamiento en su objeto Skeleton
La JVM destino devuelve la respuesta a la JVM peticionaria.

10

Referencias Remotas
Compilador RMI:
Genera automticamente la clase stub y skeleton asociada a la
implementacin de un objeto remoto.
> rmic ContadorImpl
Trabaja con la clase compilada (.class).
Modos de obtener la referencia remota (stub):
Utilizar un registro conocido por todos los procesos:
Registro RMI
El servidor almacena la referencia en el registro con un nombre
descriptivo.
El cliente recupera la referencia utilizando el nombre.

Otras alternativas:
Valor de retorno o parmetro de una llamada remota.
11

Registro RMI

Aplicacin Java que acta como registro de referencias.

Utilizado para registrar los objetos iniciales de una aplicacin.

Accedemos a un registro utilizando la clase:

java.rmi.registry.Naming
Mtodos de clase para:

Consultar: Contador c = (Contador) Naming.lookup(contador);


Registrar: Naming.rebind(contador, cImpl);
Listar registro: String[] referencias = Naming.list(//localhost);

Lanzar el registro:

> rmiregistry

Restricciones:

Slo pueden modificar el registro los procesos de la misma mquina.


El registro no debe poder acceder a los .class de los objetos remotos.

URL RMI:

[rmi:][//host/]nombre rmi://dis.um.es/contador, //dis.um.es/contador


12

Paso de Parmetros
Distinta semntica para el paso de parmetros y
valores de retorno:
Los tipos primitivos se pasan por valor.
La referencia a un objeto distribuido se pasa por
referencia:
Se enva el stub del objeto.

Los objetos normales serializables se pasan por valor:


Se serializa el objeto y se enva una copia
No hay semntica de rplica.

El resto de objetos no serializables no pueden pasarse


como parmetros.
13

Descarga Dinmica de
Cdigo
Problema:
El cliente accede al OD utilizando una copia del stub
(referencia) que depende de la clase implementacin.
Las clases stub no conviene distribuirlas.
Solucin:
Descargar las clases stub dinmicamente:
Cuando va instanciarse el proxy de la referencia remota.

Consecuencias:
Hay que controlar el cdigo descargado instalar un
SecurityManager
Disponemos de RMISecurityManager.

Los servidores de objetos deben dejar accesibles sus clases


stub utilizando un servidor web o FTP (URL).
14

Visin General
Objeto
Implementacin

Registro
ejemplo

Registra el objeto

Servidor
skeleton

Obtiene la referencia
(stub)

Cliente
JVM
Descarga la clase stub

RMI
15

JVM
stub

Proceso de Desarrollo
1. Definir la interface remota
2. Programar la clase implementacin
3. Compilar la clase implementacin
4. Ejecutar del compilador de stubs con la clase compilada:
rmic
5. Arrancar el registro RMI en el servidor: rmiregistry
6. Ejecutar la aplicacin servidor.
7. Ejecutar la aplicacin cliente.
16

Despliegue
Servidor:
Interface remota.
Clase implementacin.
Programa servidor.
Clase skeleton.
Clase stub (accesible a travs de URL)

Cliente:
Interface remoto.
Programa cliente.
17

Limitaciones RMI antes de


Java 2

Las referencias no son persistentes:


Si cae el servidor todas las referencias distribuidas dejan de ser
vlidas.

Todos los objetos remotos deben estar instanciados en el servidor:


Disminuye el rendimiento cuando se mantienen muchos objetos.

La comunicacin RMI no es segura.

Estos problemas se han solucionado en Java 2 ...


Pero, es preferible utilizar CORBA que el modelo avanzado
RMI.

18