Download Tema 2: Introducción a CORBA

Document related concepts
no text concepts found
Transcript
Tema 2: Introducción a CORBA
¿ Qué es CORBA ? (1)
n
n
Permite invocar métodos de objetos remotos sin que
importe el lenguaje en el que estén escritos el
llamador y el llamado, ni las plataformas (s.o. y hw.)
y redes de comunicación intermedias
Incluye un buen número de servicios
n
n
n
n
n
n
n
Nombres
Trading
Seguridad
Transacciones
Persistencia
Notificaciones
Etc.
¿ Qué es CORBA ? (2)
n
Está estandarizado por el OMG (Object Management
Group)
n
n
n
n
n
El mayor consorcio de la industria del software
Sólo emite especificaciones (no existe implementación de
referencia)
Las especificaciones se desarrollan por consenso y son
públicas y gratuitas
Existen muchos fabricantes que implementan las
especificaciones más importantes para las plataformas más
usuales
También estandariza UML (Unified Modeling Language)
¿ Qué es CORBA ? (y 3)
n
Ventajas (con respecto a otras tecnologías similares)
n
Software COTS (Commercial Off The Shelf)
n
n
n
n
n
Estandarizado, múltiples implementaciones (no se depende de
un fabricante)
Las especificaciones se adoptan por consenso
Buena infraestructura para construir aplicaciones distribuidas
Permite integrar aplicaciones heterogéneas
Desventajas
n
n
No es la tecnología más sencilla de utilizar ...
Las especificaciones tardan en desarrollarse, y en
consecuencia las implementaciones tardan en salir al
mercado
La arquitectura de gestión de objetos (OMA)
Interfaces de
aplicación
Interfaces del
dominio
Facilidades
comunes
Object Request Broker (ORB)
Servicios
ORB
n
n
Permite realizar invocaciones de métodos de objetos
remotos en un entorno heterogéneo
El documento estándar se llama CORBA (Common
Object Request Broker Architecture)
n
n
n
En la práctica, el nombre CORBA realmente se aplica para
referirse al conjunto de especificaciones
Las especificaciones de interfaces remotos se hacen
en IDL (Interface Definition Language)
Se han estandarizado los mappings de IDL a los
lenguajes más comunes (C, C++, Java, COBOL,
Smalltalk, Ada, etc.)
Servicios
n
Interfaces de servicios útiles para aplicaciones de
cualquier dominio
n
n
n
n
n
n
n
n
Nombres
Trading
Seguridad
Transacciones
Persistencia
Eventos
Notificaciones
Etc.
Facilidades comunes
n
Interfaces de servicios útiles para muchas
aplicaciones, pero no tan fundamentales como los
“servicios CORBA”
n
n
Internacionalización y Tiempo
Agentes móbiles
Interfaces del dominio
n
Interfaces útiles para dominios específicos
n
n
n
n
n
n
Negocios
Finanzas
Manufacturación
Salud
Telecomunicaciones
Transporte
Interfaces de aplicación
n
n
Interfaces desarrollados específicamente para una
aplicación
Lógicamente, no están estandarizados por el OMG,
pero si se repiten en muchas aplicaciones diferentes,
se convertirán en candidatos para estandarización
(servicios, facilidades comunes o interfaces del
dominio)
Componentes de un ORB
Aplicación cliente
DII
Stubs
IDL
estáticos
Aplicación servidora
Interfaz
ORB
Skeletons
IDL
estáticos
DSI
Adaptador
de Objetos
Núcleo ORB
Interfaz igual para
todos los ORBs
Un stub y un skeleton
específico para cada objeto
Puede haber múltiples
adaptadores de objetos
Interfaz privado del ORB
Clock.idl
/*
* Clock example.
*/
module es { module udc { module fbellas {
module corba { module clock { module idl {
struct TimeOfDay {
short hour; // 0-23
short minute; // 0-59
short second; // 0-59
};
interface Clock {
TimeOfDay getTimeOfDay();
};
}; }; }; }; }; };
El compilador de IDL
Clock.idl
Compilador
IDL-a-Java
Compilador
IDL-a-C++
Ficheros
.java
Ficheros
.cpp
Stubs y skeletons
n
Stubs IDL estáticos o SII (Static Invocation Interface)
n
n
n
n
n
Las operaciones locales que usan los clientes como sustitutas de las
remotas
Generadas por el compilador de IDL
Envían y reciben mensajes (haciendo “marshalling” /
“unmarshalling”).
En lenguajes OO se genera una clase “proxy” por cada interfaz
remoto (patrón de diseño “Proxy”)
Skeletons IDL estáticos o SSI (Static Skeleton Interface)
n
n
n
n
Las operaciones en el servidor que invocan las correspondientes
implementaciones proporcionadas por el programador
Generadas por el compilador de IDL
Reciben y envían mensajes (haciendo “unmarshalling” /
“marshalling”)
En lenguajes OO se genera una clase “skeleton” por cada interfaz
remoto
Algunos conceptos
n
Objeto CORBA
n
n
Referencia a un objeto CORBA
n
n
n
Entidad virtual sobre la que se pueden realizar invocaciones
remotas
Estructura de datos (puntero) que identifica a un objeto
CORBA
Son opacas
Servant
n
Entidad del lenguaje de programación que implementa uno
o más objetos CORBA. En lenguajes OO, un servant es una
instancia de una clase que implementa las operaciones del
interfaz remoto
Adaptador de objetos
n
n
n
En el servidor: recibe una petición y la dirige al
servant correspondiente
Corresponde al patrón de diseño “Adapter”
Hasta CORBA 2.1 (inclusive), la especificación CORBA
estandarizaba el BOA (Basic Object Adapter)
n
n
n
Especificación ambigua y poco potente
Los fabricantes añadieron sus propias extensiones =>
problemas de portabilidad importantes
A partir de CORBA 2.2 (inclusive), la especifiación
CORBA estandarizó el POA (Portable Object Adapter)
n
n
Potente, pero complejo ...
El BOA ya no forma parte de CORBA
Interfaz del ORB, DII y DSI
n
Interfaz del ORB
n
n
Dynamic Invocation Interface (DII)
n
n
Proporciona operaciones para inicializarlo, convertir
referencias a objetos remotos a cadenas de caracteres y
viceversa, etc.
Permite realizar invocaciones de métodos de objetos
remotos sin utilizar los stubs correspondientes
Dynamic Skeleton Interface (DSI)
n
Permite recibir invocaciones de métodos de objetos remotos
sin disponer de los skeletons correspondientes
Repositorios de interfaces e implementaciones
n
Repositorio de interfaces
n
n
n
Repositorio que contiene descripciones de las definiciones de
tipos en IDL
El programador dispone de un API para consultar el
repositorio
Repositorio de implementaciones
n
Mantiene un registro de servidores de manera que puede
proporcionar características como: arranque automático de
servidores, balanceo de carga, etc.
Interoperabilidad
n
Interoperabilidad entre distintos ORBs de distintos fabricantes
n
GIOP (General Inter-ORB Protocol)
n
n
IIOP (Internet Inter-ORB Protocol)
n
n
Formato estándar de una referencia a un objeto remoto (es opaco para
el programador)
ESIOPs (Environment-Specific Inter-ORB Protocols)
n
n
n
GIOP sobre TCP/IP
IOR (Interoperable Object Reference)
n
n
Protocolo abstracto que especifica el formato de transferencia de tipos
IDL y un conjunto de formatos de mensajes para permitir que ORBs de
distintos fabricantes pueden interoperar sobre un protocolo de
transporte orientado a la conexión
No siguen GIOP (porque hay una infraestructura subyacente que
quieren aprovechar)
DCE CIOP (DCE Common Inter-ORB Protocol)
También está estandarizada la interoperabilidad COM/DCOM
Un sencillo ejemplo con CORBA/Java
Definición de un interfaz remoto
/*
* Clock example.
*/
module es { module udc { module fbellas {
module corba { module clock { module idl {
struct TimeOfDay {
short hour; // 0-23
short minute; // 0-59
short second; // 0-59
};
interface Clock {
TimeOfDay getTimeOfDay();
};
}; }; }; }; }; };
Compilación del interfaz IDL
Clock.idl
Compilador
IDL-a-Java
Ficheros
.java
-
Clock.java
ClockHelper.java
TimeOfDay.java
La clase proxy que
implementa Clock
- ClockPOA.java
- etc.
Servidor – Implementación del objeto remoto
package es.udc.fbellas.corba.clock.server;
import java.util.Calendar;
import es.udc.fbellas.corba.clock.idl.TimeOfDay;
import es.udc.fbellas.corba.clock.idl.ClockPOA;
class ClockImpl extends ClockPOA {
public TimeOfDay getTimeOfDay() {
short hour =
(short) Calendar.getInstance().get(Calendar.HOUR);
short minute =
(short) Calendar.getInstance().get(Calendar.MINUTE);
short second =
(short) Calendar.getInstance().get(Calendar.SECOND);
return new TimeOfDay(hour, minute, second);
}
}
Servidor – main (1)
package es.udc.fbellas.corba.clock.server;
import
import
import
import
import
import
org.omg.CORBA.ORB;
org.omg.PortableServer.POA;
org.omg.PortableServer.POAHelper;
org.omg.PortableServer.POAManager;
java.io.PrintWriter;
java.io.FileOutputStream;
import es.udc.fbellas.corba.clock.idl.Clock;
class Server {
public static void main(String args[]) {
ORB orb = null;
Servidor – main (2)
try {
/* Initialize ORB. */
orb = ORB.init(args, null);
/* Get a reference to the Root POA. */
org.omg.CORBA.Object rootPOAObject =
orb.resolve_initial_references("RootPOA");
POA rootPOA = POAHelper.narrow(rootPOAObject);
/* Activate the Root POA's manager. */
POAManager rootPOAManager = rootPOA.the_POAManager();
rootPOAManager.activate();
/*
* Create servant, register it on the Root POA and
* obtain a reference to it.
*/
ClockImpl clockImpl = new ClockImpl();
Clock clock = clockImpl._this(orb);
Servidor – main (3)
/* Write the reference in file "Clock.ref". */
String stringifiedReference =
orb.object_to_string(clock);
FileOutputStream fileOutputStream = null;
PrintWriter printWriter = null;
try {
fileOutputStream =
new FileOutputStream("Clock.ref");
printWriter = new PrintWriter(fileOutputStream);
printWriter.println(stringifiedReference);
} finally {
if (printWriter != null) {
printWriter.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
Servidor – main (y 4)
/* Allow the ORB to start processing requests. */
System.out.println("Server running");
orb.run();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (orb != null) {
orb.destroy();
}
} catch (org.omg.CORBA.SystemException e) {
e.printStackTrace();
}
}
} // main
} // class
Cliente (1)
package es.udc.fbellas.corba.clock.client;
import org.omg.CORBA.ORB;
import java.io.BufferedReader;
import java.io.FileReader;
import es.udc.fbellas.corba.clock.idl.Clock;
import es.udc.fbellas.corba.clock.idl.ClockHelper;
import es.udc.fbellas.corba.clock.idl.TimeOfDay;
class Client {
public static void main(String args[]) {
ORB orb = null;
try {
/* Initialize ORB. */
orb = ORB.init(args, null);
Cliente (2)
/* Read stringified reference from "Clock.ref". */
FileReader fileReader = null;
BufferedReader bufferedReader = null;
String stringifiedReference;
try {
fileReader = new FileReader("Clock.ref");
bufferedReader = new BufferedReader(fileReader);
stringifiedReference = bufferedReader.readLine();
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
}
Cliente (3)
/*
* Convert stringified reference into a Clock object
* reference.
*/
org.omg.CORBA.Object clockObject =
orb.string_to_object(stringifiedReference);
if (clockObject == null) {
throw new Exception("stringified reference is nil");
}
Clock clock = ClockHelper.narrow(clockObject);
/* Obtain the time of day and print it. */
TimeOfDay timeOfDay = clock.getTimeOfDay();
System.out.println("Hour: " + timeOfDay.hour);
System.out.println("Minute: " + timeOfDay.minute);
System.out.println("Second: " + timeOfDay.second);
Cliente (y 4)
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (orb != null) {
orb.destroy();
}
} catch (org.omg.CORBA.SystemException e) {
e.printStackTrace();
}
}
} // main
} // class
Flujo de una invocación remota
n
Cliente
n
n
TimeOfDay timeOfDay = clock.getTimeOfDay();
Flujo de la invocación
n
n
n
n
El cliente invoca la operación sobre un proxy
La operación getTimeOfDay del proxy envía un mensaje
por la red utilizando el ORB
El ORB del servidor recibe el mensaje y se lo entrega al
gestor del POA (rootPOAManager) y éste al POA
(rootPOA)
El adaptador de objetos envía la invocación al servant
(clockImpl)
n
n
Se llama a una operación de ClockPOA, que realiza el
unmarshalling e invoca a la operación abstracta
getTimeOfDay, definida en ClockImpl.
Cuando el servant termina de ejecutar la operación, la
respuesta se envía al cliente
Ejecución del ejemplo Clock
* cd $CORBA_JAVA_EXAMPLES_HOME/Subsystems/Clock/Scripts
* Ejecutar ClockServer.sh
* Ejecutar ClockClient.sh
Implementaciones
n
Existe un buen número de implementaciones,
comerciales y gratuitas, del ORB de CORBA (para
distintos lenguajes y plataformas) y de los servicios
más comunes
n
n
n
n
n
http://www.cs.wustl.edu/~schmidt/corba-products.html
Iona (http://www.iona.com). Orbix
Inprise (http://www.inprise.com). Visibroker
Object Oriented Concepts (http://www.ooc.com). ORBacus
http://www.cs.wustl.edu/~schmidt/TAO.html. TAO