java开发corba初步(一)

来源:互联网 发布:查询数据库表空间名称 编辑:程序博客网 时间:2024/04/29 16:51

一、Corba的简介

CORBA(Common Object Request Broker Architecture)是为了实现分布式计算而引入的。也就是说Corba是一种分布式计算技术。为了详细说明Corba技术的特点,我们通过它与其他几种分布式计算技术的比较来说明。首先,它与RPC技术不同,RPC技术是面向过程的,而Corba技术是面向对象的,它实现的是解决远程对象之间的互操作问题。微软的DCOM技术虽然也是解决这一问题的,但是它是基于windows系统的,而Corba是实现跨平台的,即是有平台独立性的。虽然Java RMI也做到了平台无关性,但是java RMI只能用java实现,而Corba可以通过一种叫IDL的接口定义语言,做到与语言无关,也就是任何语言都能够制作CORBA组件。

通过以上说明我们也就可以总结出来了,CORBA是一种异构平台下与语言无关的对象互操作模型。

1.1Corba的体系结构

Corba上的服务用IDL描述,IDL将被映射为某种程序设计语言c++或者java,并且分成两部分,在客户端叫做IDL stub(桩),在服务器方叫做IDL Skeleton(骨架)。两者可以采用不同的语言。服务器方在Skeleton的基础上编写对象实现,而客户方要访问服务器方的方法,要通过客户桩,而双方要通过ORB总线通信。由于客户端和服务器端之间的通信不能直接进行,而是要通过orb代理,因此Corba是一种中间件技术。

1.2corba的概念的介绍

下面对Corba的几个概念进行介绍,方便大家对Corba有进一步的了解。

1.2.1 ORB

Corba体系结构的核心就是ORB,ORB使得客户应用程序能调用远端对象方法。具体来说,便是当客户端要调用远程对象上的方法时,首先要得到这个远程对象的引用,然后再像调用本地方法一样调用远程方法。当客户端发出一个调用时,orb会截取这个调用,由于客户端和服务器可能是在不同的网络,不同的平台,甚至是用不同的语言实现的,所以orb要讲调用的名字,参数编码成一种标准的格式,传到服务端,再解码,传到正确的对象上。服务器对象处理完成后,再有ORB用同样的方式将处理结果返回给客户。

1.2.2IDL

下面再介绍一下接口定义语言,如果说ORB使CORBA做到了平台无关,那么IDL使CORBA做到了语言无关。正如其名,IDL只定义接口,而并不定义具体的实现,类似于头文件,如果要用它来编写应用,那么需要将它映射到相应的程序设计语言上去,如JAVA或C++。由于IDL的语法很像JAVA和C++,因此,几乎所有的程序设计人员都能很快理解IDL我们通过一个小例子来简单理解一下IDL语言。

//grid.idl

modue  simpleDemo{

interface grid{

readonly attribute short height;

readonly attribute short width;

void set(in short row,in short col,in long value);

long get(in short row,in short col);

}

}

这个小例子主要定义了一个客户端可以访问或修改的二维数组。在IDL中,Module类似于java中的package,而inteface则相当于java中的interface。

1.2.3 stub(桩)code和skeleton(骨架)code

这两个是由IDL complier自动生成的,前者放在客户方,后者放在服务器方。如上方的例子grid.idl,编译后,stub code生成以下文件:grid.java,_gridStub.java,gridHelper.java,gridHolder.java,gridOperations.java。

其中_gridStub是存根类,它是远程对象在本地的一个代理。从业务划分角度来说,CORBA这些底层的东西不应该太多地污染到我们的应用,比如这个_gridStub类是我们不想看到的,我们只希望看到我们需要看到的grid。客户端从ORB中拿到的grid接口实现其实是一个_gridStub,客户端对grid接口中的方法进行调用时,其实是_gridStub将相应方法调用转发到服务端,将服务器的响应返回给客户,从而成功欺骗客户。

由于_gridStub类直接继承了ObjectImpl类,这使得它能够关联到ORB环境中,从而完成远程调用。

而skeleton code会生成以下文件:gridOperations.java,gridPOA.java,gridPOATie.java

之所以在stub code中有gridOperations.java文件,是因为call back机制会用到。这些文件的基本用途会在后面讲到。

1.2.4GIOP和IIOP

我们知道,客户端和服务器是通过ORB进行交互的,那么客户端方的ORB和服务器端方得ORB又是通过什么方式进行通信的呢?是通过一种协议:GIOP通信协议

GIOP的设计目标是:尽可能简单,开销最小,同时又具有最广泛的适应性和可扩展性,以适应不同的网络。

GIOP定义了以下方面:

1.通用数据表示定义。对所有IDL的数据类型的映射做了规定,实际上是IDL数据类型在传播时的编码方案。

2.客户端和服务端两个角色之间传输的消息格式。它们之间传输的消息类型主要有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 <octet> object_key;
string operation;
Principal requesting_principal;
};

Request Body按CDR规定的方式编码,它主要对方法规定的参数进行编码,如double example (in short m, inout Principal p);可表示成:

struct example_body{

short m;

Principal p;

}

3.GIOP  Transport Assumption

主要规定在任何面向连接的网络传输层上的一些操作规则。主要有Asymmetrical connection usage(非对称连接),Request multiplexing(请求复用),Overlapping requests(重叠请求),Connection management(连接管理)等。

另外,由于CORBA是面向对象的,因此要指定一套基于对象的机制。

GIOP是一种通用的协议,因此不能直接使用,在不同的网络上要有不同的实现。目前使用最广的是Internet上的GIOP,称为IIOP。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 <octet> object_key;
};
struct ProfileBody_1_1 {
Version iiop_version;
string host;
unsigned short port;
sequence <octet> object_key;
sequence <IOP::TaggedComponent> components;
};
};

1.2.5Dynamic Invocation Interface和Dynamic Skeleton Interface

动态调用接口和动态骨架接口是用来支持客户在不知道服务器对象接口的情况下也能调用服务对象。

1.2.6Object Adapter

对象适配器是ORB的一部分,它主要完成对象引用的生成,维护,对象定位等功能,Basic Object Adapter(BOA,基本对象适配器)实现了对象适配器的一些核心功能,而portable Object Adapter(POA,可以移植对象适配器)则为了解决对象实现在不同厂商的ORBs下也能使用的问题。最新的ORB产品一般都支持POA。

CORBA的基本知识就介绍到这里。下一节将通过实例程序学习了解jdk自带的orb。







原创粉丝点击