JAVA RMI
The Java Remote Method Invocation

ELO330 – Programación de Sistemas

Cesar Vásquez I.

9821040-7

¿Qué es RPC?

Remote Procedure Calling

RPC es la base de RMI, y de todos los protocolos basados en procesamiento remoto (CORBA, IDL, DCOM, etc)

Definicion:

"RPC es la transferencia sincrónica de datos y control entre dos partes de un programa distribuido a través de espacios de direcciones disjuntas."

O Bien:

“Procesar de manera remota algún segmento de código necesario localmente, utilizando una CPU, Memoria, Stack, etc, remotos, sin salir del procesamiento local.”

Dificultades de RPC

Al trabajar con RPC (y por consiguiente, con RMI) se deben tener en cuenta los siguientes problemas:

Marshalling y Unmarshalling: Estandarizar el orden de los datos

Inestabilidad de la Red: Como retornar a la programación

Seguridad: No cualquiera pueda interrumpir mi flujo de procesamiento.

Representación de Datos: Por Ejemplo, UTF8 v/s ASCII

Distribución de Hardware: Distinta zona de memoria, stack, clock de la CPU, etc.

¿Que es RMI?

Paquete de JAVA para manejar objetos de manera remota y transparente para el usuario local.

Características:

Uso de STUBs y SKELETONs

Uso de Interfaces

Presencia de un Registro Central: RMI Registry

Uso de Políticas de Seguridad.

Uso de STUBs y SKELETONs

Uso de Interfaces

Es la única forma de comunicarse que tienen el Servidor y el Cliente.

El Usuario interactúa con instancias de la Clase remota a través de la Interface, no directamente con la clase remota:

public interface Calculo extends Remote {

int ejecutarProceso(Proceso t) throws RemoteException;

}

Al crear un objeto remoto se debe “castear” la interface. En este caso, calculoSumatoria Implementa a Proceso.

Proceso p = (Proceso) new calculoSumatoria( );

RMI Registry

Para el correcto funcionamiento de RMI, debe existir alguien que registre los servidores que manejen objetos remotos.

Es un herramienta de JAVA.

Registra el par: Servidor/Objeto, para luego atender consultas de los clientes que busquen un determinado objeto.

Funcionamiento:

String nombre = "//200.1.27.172:12345/MotorCalculo";

Calculo motor = (Calculo) new MotorCalculo();

Naming.rebind(nombre, motor);

String nombre = "rmi://200.1.27.172:12345/MotorCalculo";

Calculo comp = (Calculo) Naming.lookup(nombre);

Servidor

Cliente

Políticas de Seguridad.

Herramienta: policytool

Archivo: java.policy (para este ejemplo)

Politica de Seguridad:

grant

{

permission java.net.SocketPermission "*:1024-65535", "accept, connect, listen, resolve";

permission java.net.SocketPermission "*:80", "connect";

permission java.io.FilePermission "<<ALL FILES>>", "read";

};

Otras Alternativas

CORBA (Common Object Request Broker Arquitecture)

CORBA es un estándar capaz de comunicar diferentes lenguajes.

El corazón de CORBA, se llama ORB ("Object Request Broker“) y se encarga de realizar la comunicación entre los sistemas heterogéneos.

Se encarga de traducir los objetos de cada, lenguaje en objetos estándar.

Las empresas poseen sus propios ORB, algunos ejemplos son:

Visibroker de Borland.

Component Broker de IBM.

Java IDL / ORB de Sun.

Otras Alternativas…

IDL (Interface Definition Language)

Es la versión JAVA de CORBA

Actualmente esta disponible en todas las versiones de JDK

Se asemeja a RMI, pero convierte los objetos en objetos estándar, para trabajar con cualquier sistema CORBA.

Otras Alternativas…

DCOM (Distributed Component Object Model)

También basado en CORBA.

Nace a partir de Component Object Model (COM).

Pero obviamente permite la comunicación distribuida de los componentes.

Desarrollado por una compañía llamada Microsoft. Y aparece por primera vez 1995 con NT4

Sin embargo, a diferencia de CORBA, quien puede correr en cualquier sistema operativo, DCOM esta implementado solo para Windows... ¬_¬

RMI v/s JAVA

Similitudes

Una referencia a un objeto, puede ser pasada como argumento o retornado como resultado de cualquier invocación (local o remoto).

Un objeto remoto puede ser invocado sobre cualquier set de interfaces remotas soportadas por la implementación, usando la sintaxis de "castear", vale decir:

InterfaceRemota irem = (InterfaceRemota) new ClaseRemota();

El operador instanceof puede ser utilizado para testear la interface remota soportada por el objeto remoto.

Diferencias

Los clientes de objetos remotos interactúan con interfaces remotas, NUNCA con la implementación de esas interfaces.

Argumentos no-remotos hacia, y resultados desde, una invocación remota a un método son pasados por copia en vez de por referencia. Esto se debe a que las referencias a objetos son útiles solo dentro de una maquina virtual individual.

En RMI, el cliente debe manejar una mayor cantidad de Excepciones, debido a que aumentan los tipos de fallas al invocar objetos remotos que cuando se trabaja de manera local (seguridad, red, rmiregistry, etc)

RMI v/s OTHERS

Algunas de las diferencias mas relevantes:

La diferencia principal con respecto a las otras tecnologías. Es que RMI, esta acotada solo a la presencia de JAVA, mientras que las otras, son estándares Multiplataforma y Multilenguaje.

Además, CORBA no siempre provee mecanismos de recolección de basura.

DCOM, por otra parte, esta acotado solo a ambientes Windows.

IDL solo soporta paso por referencia, mientras que RMI soporta paso por valor y por referencia.

Conclusiones

RMI es una muy buena alternativa para resolver el problema de aplicaciones Cliente/Servidor.

Presenta una mayor simplicidad que otros sistemas.

Sin embargo, esta acotada al soporte de JAVA.

Una alternativa muy buena frente al problema de los “Legacy Systems” es IDL.

Frente al problema de heterogeneidad, lo mejor es instaurar IDL, junto con un sistema CORBA.

RMI, tampoco se recomienda en sistemas con tasa de crecimiento muy altas, no se desenvuelve bien frente a sistemas muy complicados.

¿ Preguntas ?

Pueden hacer sus preguntas hasta acá.

A continuación se procederá a mostrar un ejemplo...

Ejemplo

Problema:

El problema consiste en calcular la suma de todos los números enteros desde 1 hasta un numero pasado como parámetro, para ello se utiliza una formula trivial.

La tarea debe ser realizada remotamente, por un servidor, que atenderá las consultas, realizará el calculo, y luego devolverá la solución.

Además, debe tener un registro de todas las operaciones realizadas, para responder inmediatamente, sin calcular, cuando se realice una consulta repetida.

Solución 1: Servidor Multihilos

Funcionamiento:

El servidor parte y crea un objeto del tipo Tabla el cual se encargará de guardar los cálculos realizados.

Luego queda escuchando conexiones en un determinado puerto.

Cuando llega una conexión, se crea un objeto Hilos, que implementa la interface Runnable, se pasa la referencia al objeto Tabla y se echa a correr el Thread.

Luego se escucha la petición del cliente, se busca en la tabla (por si ya fue calculado).

Se procesa (con un método de Tabla).

Se guarda el resultado en un atributo de Tabla.

Finalmente, se devuelve la respuesta al cliente.

Solución 1: Servidor Multihilos

Solución 2: Servidor RMI

Funcionamiento:

El servidor (MotorCalculo) se registra en RMIRegistry guardando su dirección.

El cliente que necesite hacer un calculo, consulta al RMIRegistry, en busca del objeto deseado. Si existe, le es devuelta una instancia de MotorCalculo.

Luego crea un objeto:

Proceso t = (Proceso) calculoSumatoria(int n);

Con estas dos instancias, se ejecuta el metodo de la clase MotorCalculo:

int ejecutarProceso(Proceso t);

El servidor recibe un objeto Proceso, que en realidad es una instancia de calculoSumatoria y comienza a ejecutar los métodos de calculoSumatoria en el servidor, pese a que es una clase en el cliente!!!

Una vez que el calculo es realizado, el servidor devuelve un entero como resultado del método ejecutarProceso(Proceso t).

Solución 2: Servidor RMI

Solución 2: Servidor RMI

La implementación del sistema se hace por medio de servidores web que mantienen las clases remotas, para que así se obtenga TOTAL INDEPENDENCIA entre el servidor y el cliente.

JAVA RMI The Java Remote Method Invocation

cvasquez

2005-11-16T11:59:42