Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Middleware
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
CORBA (Common Object Request Broker Architecture)
• Herencia de interfaces
• Polimorfismo
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
CORBA CDR
Longitud de la cadena
“Smith”
Longitud de la cadena
“London”
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
CORBA
Las aplicaciones se construyen mediante implementación de interfaces definidas
en el Lenguaje de Definición de Interfaces (IDL) CORBA.
Servicios
• Servicio de Nombres (naming)
• Los servicios de Eventos y Notificación.
• Persistencia
• Transacción y Concurrencia.
• El servicio de seguridad
• Negociación (trading)
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
client server
implementation interface
repository repository object skeleton
adapter
Arquitectura de CORBA
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Adaptador de objeto:
• Crea referencias a objetos remotos para los objetos CORBA.
• Despacha cada invocación remota a través de un skeleton hacia el servidor
apropiado.
• Activa objetos.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Resguardo/proxy del cliente: Se encuentra en el lenguaje del cliente.
Empaqueta los argumentos de los mensajes de invocación y
desempaqueta las excepciones y los resultados de las respuestas.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
El proceso de desarrollo se divide:
• Definir la interfaz remota (.idl)
• Compilar la interfaz remota
• Implementar el servidor
• Implementar el cliente
• Empezar las aplicaciones
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
El IDL define el contrato entre el cliente y el servidor, y especifica las
operaciones y atributos disponibles.
• Declarar el Módulo CORBA IDL
module HelloApp {
// Add subsequent lines of code here.
};
• Declarar la interfaz
module HelloApp {
interface Hello // Add
{ // these
// four
}; // lines.
};
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
• Declarar las operaciones
module HelloApp {
interface Hello
{
string sayHello(); // Add this line.
};
};
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
• Crea:
_XXXStub: Funcionalidad CORBA básica para el cliente, implementa la
interfaz Hello.java
XXX.java: La versión java de la interfaz IDL.
XXXHelper: Funcionalidad auxiliar. Contiene el método narrow() requerido
para cast, lee y escribe tipos de datos a streams CORBA
XXHolder: Provee operaciones para argumentos de salida y entrada.
Contiene la referencia a un objeto que implementa la interfaz Hello
XXXOperations: Realiza llamadas optimizadas (s) Contiene SayHello() y
Shutdown()
XXXPOA: Skeleton, provee la funcionalidad básica CORBA para el servidor
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Parte básica (Aplicación del Cliente)
• Importar paquetes requeridos
import HelloApp.*; // The package containing our stubs.
import org.omg.CosNaming.*; // HelloClient will use the naming service.
import org.omg.CORBA.*; // All CORBA applications need these classes.
• Declarando la clase del cliente
public class HelloClient {
// Add the main method here in the next step.
}
• Definiendo el método principal
public static void main(String args[]) {
// Put the try-catch block here in the next step.
}
• Manejo de excepciones CORBA
try {
// Add the rest of the HelloClient code here.
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Buscando el Servidor “Hello”
• Obtener el contexto inicial
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
• Convertir la referencia del objeto
NamingContext ncRef = NamingContextHelper.narrow(objRef);
• Buscando el servicio
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
Invocando la operación sayHello
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Parte básica (Aplicación del servidor)
• Importar paquetes requeridos
import HelloApp.*; // The package containing our stubs.
import org.omg.CosNaming.*; // HelloClient will use the naming // service.
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*; // All CORBA applications need these // classes.
• Declarando la clases del servidor
public class HelloServer{
// Add the main method here in the next step.
}
• Definiendo el método principal
public static void main(String args[]) {
// Put the try-catch block here in the next step.
}
• Manejo de excepciones CORBA
try {
// Add the rest of the HelloClient code here.
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Manejando el Servant del objeto
• Instanciando el objeto Servant
HelloServant helloRef = new HelloServant();
• Definiendo la clase Servant
class HelloServant extends _HelloImplBase {
// Add the sayHello method here in the next step.
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Trabajando con COS Naming
• Obtener el contexto inicial
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
• Convertir la referencia al objeto
NamingContext ncRef = NamingContextHelper.narrow(objRef);
• Registrar el Servant con el Servidor de Nombres
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, helloRef);
Esperar por la invocación
java.lang.Object sync = new java.lang.Object();
synchronized(sync) {
sync.wait();
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - CORBA
Compilando el cliente
javac HelloClient.java HelloApp\*.java
Compilando el servidor
javac HelloServer.java
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
RMI es una extensión de la invocación a métodos locales, que permiten que
un objeto que vive en un proceso invoque los métodos de un objeto que
reside en otro proceso.
En una invocación de método remoto están involucrados varios objetos y
módulos separados.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
RMI (Remote Method Invocation)
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Objetivos de RMI
Transparencia. Permitir la invocación de métodos de objetos remotos que se ejecutan en otras
JVM como procesos separados, con independencia de que estos objetos estén en la misma
máquina o en máquinas diferentes.
Orientado a objetos. Integrar el modelo de objetos distribuidos en el lenguaje Java de manera
natural y preservando, siempre que sea posible, la semántica de objetos de Java.
Simple. Aplicar a la programación distribuida los mismos criterios de simplicidad de la
programación Java estándar.
Seguridad. Usar un modelo de seguridad basado en los gestores de seguridad y cargadores de
clases locales.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Objetivos de RMI
Portabilidad. Hacer que cualquier sistema distribuido RMI sea portable a cualquier
plataforma donde haya una JVM.
Escalabilidad. Mantener la misma arquitectura con independencia del tamaño de la
aplicación distribuida.
Robustez. Proporcionar una jerarquía de gestión de excepciones remotas para detectar y
gestionar los errores generados en el servidor.
Eficiencia. Permitir la activación, desactivación y reactivación, así como la liberación
automática de objetos remotos no referenciados, lo que mejoraría la gestión de recursos
del servidor.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Streams
Primitivos:
Hablan con los dispositivos directamente leyendo o escribiendo los bytes
tal como llegan de manera secuencial
FileOutputStream, FileInputStream
Intermedios:
Su función es la de envolver un stream existente. Los streams
intermedios pueden manejar datos más complejos que simples bytes,
pero se tienen que convertir en bytes cuando escriban en el dispositivo.
ObjectOutputStream, ObjectInputStream
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
client server
remote
object A proxy for B skeleton
object B
Request & dispatcher
for B’s class
Reply
Arquitectura RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Módulo de comunicación: semántica de invocación.
Módulo de referencia remota: Responsable de traducir las referencias entre
objetos locales y remotos, y de crear referencias a objetos remotos.
Proxy: Invocación al método remoto transparente para los clientes, se comporta
como un objeto local para el que invoca; pero en lugar de ejecutar la invocación,
dirige el mensaje al objeto remoto (serialización de parámetros).
Skeleton: La clase de un objeto remoto tiene un skeleton, que implementa los
métodos de una interfaz remota.
Distribuidor: Cada servidor tiene un distribuidor y un skeleton para cada clase que
representa a un objeto remoto. (idMetodo)
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
1. El servidor se registra (bind) en el registry con un nombre. Máquina
Genera unremota
hilo para
2. El cliente localiza (lookup) la referencia del servidor en el permanecer bind
disponible
Servidor RMI
registry por su nombre. Registro
Skeleton
3. El cliente crea un stub que hace referencia al skeleton Referencia al método y un flujo de
4. El cliente invoca el stub de forma local. bytes que resulta de serializar los
parámetros y creaLookup
un socket
5. El stub transfiere la invocación al skeleton con un mensaje .
6. El skeleton invocamente localmente el método del servidor. Máquina local
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Mayor número de excepciones que en métodos locales
Errores en la comunicación entre los procesos (fallos de
acceso, fallos de conexión)
Problemas asociados a la invocación de métodos remotos (no
encontrar el objeto, el resguardo o el esqueleto)
Los métodos deben especificar la excepción
RemoteException.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Arquitectura RMI
http://aviloria.blogspot.com.co/
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
• InterfaceRemota: Con todos los métodos
• ObjetoRemoto: Clase con la implementación de los métodos de InterfaceRemota
• ObjetoRemoto_Stub: Implementa InterfaceRemota, cada método hace una llamada a
través de la red
Proceso:
Desarrollar la aplicación cliente.
Desarrollar la aplicación servidor.
Compilar y ejecutar la aplicación.
Se ejecuta el RMI Registry en el procesador remoto.
Se ejecuta el servidor en el procesador remoto.
Se ejecuta el cliente en el procesador local
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Código:
1. Definir las funciones de la clase remota con los métodos, como una
interfaz escrita Java.
• Hereda de la interfaz remote
• Debe lanzar una RemoteException
2. Escribir las clases de implementación y servidor.
3. Escribir un programa cliente que usa los servicios remotos
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
1. Definir las funciones de la clase remota como una interfaz escrita Java.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
package examples.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
2. Escribir las clases de implementación y servidor.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
IMPLEMENTACIÓN DE LA INTERFAZ REMOTA
package examples.hello;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Servidor
public static void main(String args[]) {
// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
HelloImpl obj = new HelloImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("//127.0.0.1:1099/HelloServer", obj);
System.out.println("HelloServer bound in registry");
} catch (Exception e) {
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Implementar una interfaz remota.
Cuando una clase implementa una interfaz se crea un “contrato” entre
la clase y el compilador.
Es conveniente que extienda de la clase remota
java.rmi.server.UnicastRemoteObject, donde puede usar:
Ejecuta todo el tiempo
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Registrar el objeto remoto:
Para que un cliente pueda invocar un método en un objeto remoto, debe
primero obtener una referencia al objeto remoto.
RMI provee registro de objetos remotos en el cual se permite registrar
nombres en formato URL.
//host/objectname : Donde objectname es un string de un nombre simple.
RMI registry es servidor de nombres en el lado servidor.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Naming.rebind("//myhost/HelloServer", obj);
Naming.rebind("//myhost:1234/HelloServer", obj);
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Programa cliente que usa el servicio remoto.
El applet es un ejemplo de invocación remota del método sayHello
para coger una cadena que es mostrada en el cliente.
package examples.hello;
import java.applet.Applet;
import java.awt.Graphics;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloApplet extends Applet {
String message = "blank";
// "obj" es el identificador que se usará para hacer referencia al objeto remoto
que implementa el "Hello"
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Compilación:
Compilar los archivos fuentes
Usar rmic para generar el stub. El skeleton se hará de forma dinámica
Mover el archivo HTML al directorio (deployment).
Actualizar rutas para ejecución.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Para hacer que la página web que hace referencia al applet, el archivo
debe ser movido desde el directorio de desarrollo al directorio de código
base.
<HTML>
<title>Hello World</title>
<center> <h1>Hello World</h1> </center>
<applet codebase="myclasses/" code="examples.hello.HelloApplet" width=500 height=120>
</applet>
</HTML>
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Ejecución:
Ejecutar el Servidor de nombres
Ejecutar el servidor
Ejecutar el cliente
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Servidor de nombres:
El RMI Registry es un servidor de nombres en el lado del servidor que
permite al cliente obtener referencias a un objeto remoto.
Usado solo para localizar el primer objeto remoto en una aplicación
para poder usar los métodos que ofrece.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC - RMI
Servidor:
Cuando se ejecuta el servidor la propiedad java.rmi.server.codebase debe ser
especificada, por lo tanto el stub puede ser dinámicamente bajada del registro al
cliente.
Además se debe especificar el archivo de políticas de acceso.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Modelos de RPC -RMI
Cliente:
Una vez registrado el servidor de nombres y el servidor, se puede
ejecutar el cliente.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
EJEMPLO 2
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Introducción
Implementación
• Diseño y compilación de la interfaz remota.
• Implementación de la interfaz remota en una clase y su compilación.
• Obtención de la(s) clase(s) Stub a partir de la interfaz remota.
• Desarrollo y Compilación de la Aplicación del Servidor.
• Desarrollo y Compilación de la Aplicación del Cliente.
Ejecución
• Registro de objetos remotos
• Iniciar el Servidor
• Establecer la política de seguridad
• Iniciar el Cliente.
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Diseño de la interfaz Remota
import java.rmi.*;
public interfaz <nombinterfazRemota> extends Remote {
// prototipos de los métodos remotos que deben lanzar la excepción RemoteException.
}
Compilación
javac <nombinterfazRemota>.java <nombinterfazRemota>.class
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Implementación de la interfaz remota
import java.rmi.*;
import java.rmi.server.*;
class <nombClase> extends UnicastRemoteObject implements IntSaludo {
// El constructor debe invocar al constructor de UnicastRemoteObject: super();
// Se deben implementar los métodos remotos de la interfaz.
}
Compilación
javac <nombClase>.java <nombClase>.class
En nuestro ejemplo: ClsSaludo.java
import java.rmi.*;
import java.rmi.server.*;
class ClsSaludo extends UnicastRemoteObject implements IntSaludo {
public ClsSaludo() throws RemoteException { super(); }
public String saludo(String soy) throws RemoteException { return “Hola “+soy; }
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Las clases Stub y Skeleton
Las clases Stub y Skeleton son obtenidas a partir de la clase anterior.
Compilador de Java RMI: rmic
rmic <nombClase> nombClase_Stub.class
nombClase_Skel.class
Crear un archivo .jar con las clases
jar cvf <archivoClass>.jar *.class <archivoClass>.jar
interfazRemota.class
nombClase.class
nombClase_Stub.class
nombClase_Skel.class
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Servidor
import java.rmi.*;
public class <apServidor> {
// Establecer el gestor de seguridad
System.setSecurityManager(new RMISecurityManager());
// Instancias de Objetos Remotos
// Registros de Objetos Remotos
try {
nombClase <objRemoto> = new nombClase();
Naming.rebind(“<url>\<nomObj>”, <objRemoto>);
} catch (Exception ex) {
System.err.println(“Error: " + ex.getMessage());
e.printStackTrace();
}
}
Compilación: javac <apServidor>.java <apServidor>.class
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Servidor
import java.rmi.*;
public class apServidor {
public static void main(String arg[]) {
// Establecer el gestor de seguridad
System.setSecurityManager(new RMISecurityManager());
// Instancias de Objetos Remotos, Registros de Objetos Remotos
try {
ClsSaludo objRemoto = new ClsSaludo();
Naming.rebind("//localhost/nomObj", objRemoto);
System.out.println("Objeto Registrado");
} catch (Exception ex) {
System.err.println("Error: " + ex.getMessage());
ex.printStackTrace();
}
}
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Cliente
import java.rmi.*;
public class <apCliente> {
// Obtener la referencia del objeto remoto y convertirla al tipo interfaz remota
// invocar métodos remotos
try {
obj = (<interfazRemota>) Naming.lookup(“<url>/<objRemoto>");
obj.metodoRemoto();
} catch (Exception e) {
System.out.println("Excepcion: " + e.getMessage());
e.printStackTrace();
}
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Implementación
Cliente
import java.rmi.*;
public class apCliente {
public static void main(String arg[]) {
// Obtener la referencia del objeto remoto y convertirla al tipo interfaz remota
// invocar métodos remotos
try {
IntSaludo obj = (IntSaludo) Naming.lookup("//localhost/nomObj");
System.out.println(obj.saludo(“Pablo"));
} catch (Exception e) {
System.out.println("Excepcion: " + e.getMessage());
e.printStackTrace();
}
}
}
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Ejecución
Iniciar rmiregistry (puerto por default 1099)
start rmiregistry
Iniciar el servidor. Si el directorio de trabajo es c:\saludoRMI:
• Especificar el archivo .jar que contiene las clases
• Establecer la política de seguridad
java -Djava.rmi.server.codebase=file:/c:\saludoRMI\<archivoClass>.jar
-Djava.security.policy=<java.policy> <apServidor>
• archivo para la política de seguridad
grant {
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.net.SocketPermission "*:80", "connect";
};
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Ejecución de nuestro ejemplo
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas
Bibliografía
Ingeniería de
Introducción a Sistemas Distribuidos
Sistemas