CORBA体系结构的核心就是ORB。可以这样简单理解:ORB就是使得客户应用程序能调用远端对象方法的一种机制。
具体来说就是:当客户程序要调用远程对象上的方法时,首先要得到这个远程对象的引用,之后就可以像调用本地方法一样调用远程对象的方法。当发出一个调用时,实际上ORB会截取这个调用(通过客户Stub完成,“提高”篇中会详细解释),因为客户和服务器可能在不同的网络、不同的操作系统上甚至用不同的语言实现,ORB还要负责将调用的名字、参数等编码成标准的方式(称Marshaling)通过网络传输到服务器方(实际上在同一台机器上也如此),并通过将参数Unmarshaling的过程,传到正确的对象上(这整个过程叫重定向,Redirecting),服务器对象完成处理后,ORB通过同样的Marshaling/Unmarshaling方式将结果返回给客户。
因此,ORB是一种功能,它具备以下能力:
1.对象定位(根据对象引用定位对象的实现)
2.对象定位后,确信Server能接受请求
3.将客户方请求通过Marshaling/Unmarshing方式重定向到服务器对象上
4.如果需要,将结果以同样的方式返回。
IDL,接口定义语言,是CORBA体系中的另一个重要概念。如果说ORB使CORBA做到平台无关,那么IDL, 则使CORBA做到语言无关。
正像其名字中显示的那样,IDL仅仅定义接口,而不定义实现,类似于C中的头文件。实际上它不是真正的编程语言。要用它编写应用,需要将它映射它相应的程序设计语言上去,如映射到C++或JAVA上去。映射后的代码叫Client Stub Code和 Server Skeleton Code。
IDL的好处是使高层设计人员不必考虑实现细节而只需关心功能描述。IDL可以说是描述性语言。设计IDL的过程也是设计对象模型的过程。它是编写CORBA应用的第一步,在整个软件设计过程中至关重要。
IDL的语法很像C++,当然也像Java。很难想像一个程序设计人员是不懂C或Java的,所以,几乎所有的程序设计人员都能迅速理解IDL。而这正是IDL设计者所希望的。
下面是一个IDL定义的简单例子:
// grid.idl
// IDL definition of a 2-D grid:
module simpleDemo{
interface grid {
readonly attribute short height; // height of the grid
readonly attribute short width; // width of the grid
// IDL operations
// set the element [row,col] of the grid, to value:
void set(in short row, in short col, in long value);
// return element [row,col] of the grid:
long get(in short row, in short col);
};
};
This IDL defines an interface for a grid
CORBA object that maintains a grid or 2-D array of data values, which a client can access or modify remotely.
Module类似于Java中包(Package)的概念,实际上module simpleDemo映射到JAVA正是package simpleDemo。而Interface类似于C++中的类(classs)声明,或是Java中的Interface 定义。
附录中列出了IDL的全部语法。
Stub code 和Skeleton Code 是由IDL Complier自动生成的,前者放在客户方,后者放在服务器方。不同厂商的IDL complier生成的Stub 和Skeleton会略有区别,但影响不大。
如上面的grid.idl, 编译后,Stub Code包含以下文件:
grid.java
_gridStub.java
gridHelper.java
gridHolder.java
gridOperations.java
Skeleton Code则包含以下文件:
gridOperations.java
gridPOA.java
gridPOATie.java
(在Stud Code 也包含gridOperations.java, 是因为在使用Call back机制时会用到。)
我们知道,客户和服务器是通过ORB交互的,那么,客户方的ORB和服务器方的ORB又是通过什么方式通信呢?通过GIOP(General Inter-ORB Protocol)。也就是说,GIOP是一种通信协议,它规定了两个实体:客户和服务器ORBs间的通信机制。
图 ORBs通信机制
GIOP在设计时遵循以下目标:
Ø Widest possible availability
Ø Simplicity
Ø Scalability
Ø Low cost
Ø Generality
Ø Architectural neutrality
也是说,GIOP设计的尽可能简单,开销最小,同时又具有最广泛的适应性和可扩展性,以适应不同的网络。
GIOP定义了以下几个方面:
1.The Common Data Representation (CDR) definition.
通用数据表示定义。它实际上是IDL数据类型在网上传输时的编码方案。它对所有IDL数据类型的映射都作了规定。
2.GIOP Message Formats.
它规定了Client和Server两个角色之间要传输的消息格式。主要包括Request和Reply两种消息。
一个Request 消息有以下几部分组成:
A GIOP message header
A Request Header
The Request Body
相应的,一个Reply消息则包括
A GIOP message header
A Reply Header
The Reply Body
GIOP1.1规定 GIOP message header格式如下:
// GIOP 1.1
struct MessageHeader_1_1 {
char magic [4];
Version GIOP_version;
octet flags; // GIOP 1.1 change
octet message_type;
unsigned long message_size;
};
Request Header格式如下:
// GIOP 1.1
struct RequestHeader_1_1 {
IOP::ServiceContextList service_context;
unsigned long request_id;
boolean response_expected;
octet reserved[3]; // Added in GIOP 1.1
sequence
string operation;
Principal requesting_principal;
};
Request Body则按CDR规定的方式编码,它主要对方法调用的参数进行编码, 如方法:
double example (in short m, inout Principal p);
可表示成:
struct example_body {
short m; // leftmost in or inout parameter
Principal p; // ... to the rightmost
};
3.GIOP Transport Assumptions:
主要规定在任何面向连接的网络传输层上的一些操作规则。如:Asymmetrical connection usage,Request multiplexing,Overlapping requests,Connection management等。
另外,因为CORBA是基于对象的,GIOP还需定义一套Object Location的机制。
GIOP因为是一种通用协议,所以不能直接使用。在不同的网络上需要有不同的实现。目前使用最广的便是Internet上的GIOP,称为IIOP(Internet Inter-ORB Protocol)。IIOP基于TCP/IP协议。IIOP消息格式定义如下:
module IIOP { // IDL extended for version 1.1
struct Version {
octet major;
octet minor;
};
struct ProfileBody_1_0 { // renamed from ProfileBody
Version iiop_version;
string host;
unsigned short port;
sequence
};
struct ProfileBody_1_1 {
Version iiop_version;
string host;
unsigned short port;
sequence
sequence
};
};
动态调用接口(DII)和动态骨架接口(DSI)是用来支持客户在不知道服务器对象的接口的情况下也能调用服务器对象。
对象适配器是ORB的一部分。它主要完成对象引用的生成、维护,对象定位等功能。对象适配器有各种各样。Basic Object Adapter(BOA, 基本对象适配器)实现了对象适配器的一些核心功能。而Portable Object Adapter(POA)
还有其他一些专有领域的对象适配器如Database Object Adapter等。