Java RMI - Introducción

RMI significa Remote Method Invocation. Es un mecanismo que permite que un objeto que reside en un sistema (JVM) acceda / invoque un objeto que se ejecuta en otra JVM.

RMI se utiliza para crear aplicaciones distribuidas; proporciona comunicación remota entre programas Java. Se proporciona en el paquete.java.rmi.

Arquitectura de una aplicación RMI

En una aplicación RMI, escribimos dos programas, un server program (reside en el servidor) y un client program (reside en el cliente).

  • Dentro del programa del servidor, se crea un objeto remoto y la referencia de ese objeto está disponible para el cliente (usando el registro).

  • El programa cliente solicita los objetos remotos en el servidor e intenta invocar sus métodos.

El siguiente diagrama muestra la arquitectura de una aplicación RMI.

Analicemos ahora los componentes de esta arquitectura.

  • Transport Layer- Esta capa conecta al cliente y al servidor. Gestiona la conexión existente y también establece nuevas conexiones.

  • Stub- Un stub es una representación (proxy) del objeto remoto en el cliente. Reside en el sistema del cliente; actúa como puerta de enlace para el programa cliente.

  • Skeleton - Este es el objeto que reside en el lado del servidor. stub se comunica con este esqueleto para pasar la solicitud al objeto remoto.

  • RRL(Remote Reference Layer) - Es la capa que gestiona las referencias que hace el cliente al objeto remoto.

Funcionamiento de una aplicación RMI

Los siguientes puntos resumen cómo funciona una aplicación RMI:

  • Cuando el cliente realiza una llamada al objeto remoto, el stub lo recibe y finalmente pasa esta solicitud al RRL.

  • Cuando el RRL del lado del cliente recibe la solicitud, invoca un método llamado invoke() del objeto remoteRef. Pasa la solicitud al RRL en el lado del servidor.

  • El RRL en el lado del servidor pasa la solicitud al Skeleton (proxy en el servidor) que finalmente invoca el objeto requerido en el servidor.

  • El resultado se devuelve al cliente.

Marshalling y Unmarshalling

Siempre que un cliente invoca un método que acepta parámetros en un objeto remoto, los parámetros se agrupan en un mensaje antes de enviarse a través de la red. Estos parámetros pueden ser de tipo primitivo u objetos. En el caso del tipo primitivo, los parámetros se juntan y se le adjunta un encabezado. En caso de que los parámetros sean objetos, entonces se serializan. Este proceso se conoce comomarshalling.

En el lado del servidor, los parámetros empaquetados se desagregan y luego se invoca el método requerido. Este proceso se conoce comounmarshalling.

Registro RMI

El registro RMI es un espacio de nombres en el que se colocan todos los objetos del servidor. Cada vez que el servidor crea un objeto, registra este objeto con el registro RMI (usandobind() o reBind()métodos). Estos se registran con un nombre único conocido comobind name.

Para invocar un objeto remoto, el cliente necesita una referencia de ese objeto. En ese momento, el cliente obtiene el objeto del registro usando su nombre de enlace (usandolookup() método).

La siguiente ilustración explica todo el proceso:

Objetivos de RMI

Los siguientes son los objetivos de RMI:

  • Minimizar la complejidad de la aplicación.
  • Para preservar la seguridad del tipo.
  • Recolección de basura distribuida.
  • Minimice la diferencia entre trabajar con objetos locales y remotos.