Está en la página 1de 31

PROGRAMACIN

DISTRIBUIDA
RMI (Remote Method Invocation) es un
mecanismo que permite realizar llamadas
a mtodos de objetos remotos situados en
distintas (o la misma) mquinas virtuales
de Java, compartiendo as recursos y
carga de procesamiento a travs de varios
sistemas.
Objetivos RMI
Proporcionar un middelware para el desarrollo de aplicaciones
distribuida manteniendo un estilo Java puro y ortodoxo:
Facilita la interaccin de objetos instanciados en diferente
JVM
Proporciona diferentes modelos de persistencia de objetos
distribuidos (objetos vivos, objetos persistentes, objetos con
activacin dbil) para conseguir la escalabilidad de las
aplicaciones.
Introduce los niveles de seguridad necesarios para garantizar
la integridad de las aplicaciones distribuidas.
Ventaja:
Permite distribuir una aplicacin de forma muy
transparente, es decir, sin que el programador tenga que
modificar apenas el cdigo.
Las invocaciones remotas son ms eficientes que las
peticiones va http que se usan con los CGIs o los
Servlets.
Desventaja
El paso de parmetros por valor implica tiempo para
hacer la serializacin, enviar los objetos serializados a
travs de la red y luego volver a recomponer los objetos
en el destino.
La idea que sustenta RMI es un ideal recurrente en
tecnologas de Orientacin a Objetos:
hacer que un objeto invoque a otro objeto remoto con
independencia de la JVM o el servidor en el que se
encuentra, como si fuera un objeto local. Transparencia
respecto a la mquina.
Hay dos posibilidades:
El objeto servidor no est escrito en Java.
Necesitamos algn sistema para que los objetos puedan hablar
entre s sin importar el lenguaje de codificacin. (CORBA)
El objeto est en Java.
Entonces usamos RMI, que es una tecnologa ms sencilla que
CORBA. Antes de la versin 1.3 RMI slo poda usar JRMP (Java
Remote Method Protocol). Paro a partir de la versin 1.3 podemos
usar adems IIOP (Internet Inter-ORB) de OMG.
Capa de Aplicacin:
Implementacin real de las aplicaciones cliente y
servidor.
Llamadas a alto nivel para acceder y exportar objetos
remotos.
Se declaran mtodos en una interfaz que herede de
java.rmi.Remote.
Una vez que los mtodos han sido implementados, el
objeto debe ser exportado.
De forma implcita: si el objeto hereda de la clase
UnicastRemoteObject (paquete java.rmi.server)
De forma explcita: con una llamada al mtodo
exportObject () del mismo paquete.
Capa proxy, o capa Stub Skeleton:
Esta capa es la que interacta directamente con
la capa de aplicacin. Todas las llamadas a
objetos remotos y acciones junto con sus
parmetros y retorno de objetos tienen lugar en
esta capa.
Capa proxy, o capa Stub Skeleton:
El objeto stub encapsula al objeto remoto, es algo
as como el "mensajero" del objeto remoto.
El stub recibe la llamada al objeto remoto
Enva (marshalling) los parmetros codificados en
un bloque de bytes al objeto remoto.
Este mtodo realiza su servicio (hace un clculo,
devuelve un resultado, etc.).
El resultado codificado (o la excepcin) lo recibe
el stub.
Capa de referencia remota:
Responsable del manejo de la parte semntica de
las invocaciones remotas. Tambin es
responsable de la gestin de la replicacin de
objetos y realizacin de tareas especficas de la
implementacin con los objetos remotos, como el
establecimiento de las persistencias semnticas y
estrategias adecuadas para la recuperacin de
conexiones perdidas.
Capa de Transporte:
Es la responsable de realizar las conexiones
necesarias y manejo del transporte de los datos
de una mquina a otra. El protocolo de transporte
subyacente para RMI es JRMP (Java Remote
Method Protocol), que solamente es
comprendido por programas Java.
Toda aplicacin RMI normalmente se
descompone en 2 partes:
Un servidor, que crea algunos objetos remotos,
crea referencias para hacerlos accesibles, y
espera a que el cliente los invoque.
Un cliente, que obtiene una referencia a objetos
remotos en el servidor, y los invoca.
Se deben seguir los siguientes pasos:
Disear e implementar los componentes de la
aplicacin distribuida.
Compilar los fuentes y generar Stubs.
Hacer las clases accesibles a la red.
Arrancar la aplicacin.
Disear e implementar los
componentes de la aplicacin
distribuida.
Se decide la arquitectura de la aplicacin y se
determina qu componentes son objetos locales y
cuales deberan ser accesibles remotamente.
Este paso incluye.
Definir las interfaces remotas.
Implementar los objetos remotos.
Implementar los clientes.
Compilar los fuentes y Generar Stubs.
Se utiliza el compilador javac para compilar los
ficheros fuentes de Java que contienen las
implementaciones de las interfaces remotas, las
clases del servidor y del cliente.
Se utiliza el compilador rmic para crear los Stubs de
los objetos remotos. RMI utiliza una clase Stub del
objeto remoto como un proxy en el cliente para que
los clientes puedan comunicarse con un objeto remoto
particular.
Hacer accesibles las clases en la red.
En este paso, se tiene que hacer que todo (los
ficheros de clases Java asociados con las
interfaces remotas, los Stubs y otras clases que
se necesiten descargar en los clientes) sean
accesibles a travs de un servidor web.
Arrancar la aplicacin.
Arrancar la aplicacin incluye ejecutar el registro
de objetos remotos de RMI, el servidor y el
cliente.
Definir la interfaz remota.
La interfaz debe ser pblica.
Debe heredar de la interfaz java.rmi.Remote, para
indicar que puede llamarse desde cualquier
Mquina Virtual Java.
Cada mtodo remoto debe lanzar la excepcin
java.rmi.RemoteException, adems de las
excepciones que pueda manejar.
Un ejemplo de interfaz remoto:

public interface InterfazRemota extends
java.rmi.Remote {

public void metodo1 () throws java.rmi.RemoteException;
public void metodo2 () throws java.rmi.RemoteException;

}
Implementar la interfaz remota.

public class ClaseRemota extends java.rmi.server.UnicastRemoteObject implements InterfazRemota {
public ClaseRemota () throws java.rmi.RemoteException {
}
public void metodo1 () throws java.rmi.RemoteException {
System.out.println (Este es el mtodo 1.);
}
public void metodo2 () throws java.rmi.RemoteException {
System.out.println (Este es el mtodo 2.);
}
public void metodo3 () {
System.out.println (Este mtodo no puede llamarse remotamente.);
}
public static void main(String[] args) {
try {
InterfazRemota ir = new ClaseRemota();
java.rmi.Naming.rebind("//"
+java.net.InetAddress.getLocalHost().getHostAddress() + :" +
args[0] + "/rmi", ir);
}
catch (Exception e) {
}
}
}
Compilar y ejecutar el servidor.
Compilar y ejecutar el servidor.
Definir la clase para obtener los objetos
remotos necesarios.

public class ClienteRMI {
public static void main(String[] args) {
try {
InterfazRemota ir = (InterfazRemota) java.rmi.Naming.lookup("//" +
args[0] + :" + args[1] + "/rmi");
//Se invoca al mtodo 1 y al mtodo 2)
ir.metodo1();
ir.metodo2 ();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Compilar y ejecutar el cliente.
Compilar y ejecutar el cliente.
Compilar y ejecutar el cliente.
Ancho de banda en la comunicacin entre un
cliente y un servidor en ejecucin local.
Ancho de banda en la comunicacin entre un cliente y un servidor en
ejecucin remota como se puede observar, la utilizacin de RMI no presenta
los resultados que se obtienen con el resto de mecanismos (sockets y RPC).
Sin embargo, el rendimiento obtenido no es excesivamente malo,
con la ventaja de que la programacin con RMI es bastante sencilla y flexible

También podría gustarte