Corba互操作的命名服务


(来源:http://www.ccw.com.cn)

Corba的对象命名服务就是给对象实例提供一个名称,以便用户通过这些名称来获取对象的实例。对象命名服务是ORB上的对象找到其它对象的基本机制。名字是用来识别一个对象的可人工辨认的值,命名服务将这些名字映射到对象标记,名字-对象关联叫做名字联编。命名语言环境是一个名字空间,对象名字在这里是独一无二的。每个对象都有一个独一无二的参考标识符。可以有选择地将一个或多个名字与一个对象标记关联起来。相对于其命名语言环境始终定义一个名字。利用命名服务可以创建命名分层结构,客户可以搜寻不同的命名语言环境树,查找所要的对象。来自不同域的名字语言环境可以一起使用,为对象创建联合命名服务。CORBA命名分层结构不需要一个“统一”的根目录。一般情况下,用户可以规定对象的命名原则,表示对象所在的主机,功能等一系列的信息,这些信息主要包括如下三个方面的内容。
(1) Corba对象的句柄定义成如URL(统一资源定位)的形式,从而允许ORB(Object Request Broker)来调用基于Corba的服务或者远程ORB上的对象实例
(2) 任何一个厂商的ORB都可以通过配置客户端的ORB来初始化根命名服务的上下文对象(NamingContext)。
(3) 对于Corba对象的复合命名。定义一个标准的语法规则。这样服务器端和客户端就可以通过相同的格式来进行读写消息。
下面将分别讨论Corba命名服务的一些特点。
一.Corba对象的统一资源定位(URL):Corbaloc
在Internet上,你可以在浏览器中直接输入地址,即Url,就可以到你指定的网站区,这项技术在Corba中也得到了运用。
通常的做法是把一个Corba的服务器放在一台有指定域名地址和端口的机器上。Corba的服务器要为许多的Corba对象服务。一般我们需要在对象实例的URL地址后加上特定的对象健值(Object Key ID)或对象名字,这些对象的名字或健值就指明了我们所需要的特定的服务。如下所示:
Corbaloc:yourdomain.com/NameService
其中Corbaloc是Corba URL的关键字,用于对象实例和对象句柄的转换yourdomain.com是所在机器的域名地址或IP地址,/后面的NameService是对象健值.
1.对象的健值
对象的健值是接口对象仓库的一部分,主要用于表示客户端调用的特定对象实例。对象健值由ORB在生成对象句柄的过程中生成,并由特定的生成该对象健值的ORB来使用,因此Corba对于它的形式和内容没有做任何的标准化工作。
对象健值也不一定是一个单词,它也可以是一个字符串序列。在主域名或IP地址后面,紧跟/的都是对象健值。如:
Corbaloc:yourdomain.com/dev/sand/box/corba/nameservice
其对象健值为dev/sand/box/corba/nameservice
2.Corbaloc的完整格式和IIOP(Internet Inter-ORB protocal)
(1) Corbaloc URL的完整格式
Corbaloc URL的完整格式如下:
Corbaloc:IIOP:1.2@yourdomain.com:2809/pub/nameservice
即Corbaloc后面的是协议的类型(IIOP是默认的协议类型,可以省略),另一种协议是RIR(Resolove Initial References).1.2是该协议的版本号。由于每一个协议都定义了特定的消息格式,从而来查询目标对象,因此具体的地址信息包括了特定的协议类型,该协议的版本号,域名地址和端口号。IONA(Internet Association Naming Authority)注册的默认端口号是2809,在上例中的地址为:

IIOP:1.2@yourdomain.com:2809,再后面的是对象健值。

(2)Cobarloc和RIR协议
除了IIOP协议,还有一个RIR协议,通过RIR,可以用URL来访问ORB的服务把字符串Corbaloc:rir@yourdomain.org/nameservice传给string_to_object后,返回与之相对应的对象句柄,在Corbaloc:rir中调用的对象健值,可以是任何一个在resolve_initial_references中定义的健值。
3.编码以及Corbaloc的使用
每一个ORB都有一个标准的接口,用来把类似URL的字符串,通过string_to_object转化为对象句柄。同时返回给一个session的句柄给客户端,这个session的句柄和你所需要的NameService,TradeService或任何对象健值实现一一的映射。
再服务器端,可以使用两种方法实现对客户端的响应。
(1) 通常一个Corba命名或事务的对象实例会接受客户端的请求,然后把处理的结果返回给客户,服务器端的程序只要运行在特定端口的网关机器上,接受用户的请求即可。
(2) 或者为了减轻网关的负担,可以在你的网关上安装一个小的代理软件,不所有来自客户端的请求通过Locate_forward来重定向到一个比较稳定的服务器上来处理,在把处理好的结果返回给客户,网关起到了一个Proxy的作用。
二.对象URL的命名(CorbaName)
CorbaName运行在Corbaloc之上,用来解析远程命名服务。如下所示:

CorbaName::yourdomain.org/pub/catalog#year2000/Menswear/outdoors.obj

在#之前,除了CorbaName这个表识符,其它的就是Corbaloc的URL,#之后的就是对象命名的字符串。
把URL的字符串传给string_to_object函数,ORB把Corbaloc部分解析为主机命名服务的命名上下文(NamingContext)的一个实例。例如,客户端的ORB来解析名字上下文pub/catalog实例上的Menswear/outdoors.obj字符串,这些名字实例驻留在域名为yourdomain.org的Corba服务器上。
三.配置初始的服务和对象的句柄
在客户端的程序启动时要对根命名的上下文做一些配置。例如,把所有用户的ORB指向同一个根;组织和分配服务器上所有的名字空间,是所有的用户都可以相互交换对象的信息,而不同的用户也可以组织和分配他们自己的根名字空间和名字空间。客户端的程序可以通过list_initial_services来查询已经初始化好的服务。INS(Interoperable Name Service)对也命名服务器中的初始化对象句柄的设置提供了如下的三种方式。
1. 管理设置
把一个在该ORB上的服务,配置成为一个返回远程对象的句柄
2. ORBInitRef
启动ORB时,传递给系统如下的参数,来设置服务的对象句柄,如下所示:
-ORBInitRef <object_ID>=<object URL>
其中Object Idk可以是一个已经初始化好的服务,也可以是一个Object ID,即在ORB还没有写进去之前来初始化一个新的服务号。
Object URL可以是任何的Corba::ORB::string_to_object所支持的URL,如
-ORBInitRef NameService=IOR::0023021ABCS1
也可以用字符形式的Corba IOR来配置命名服务,如 
-ORBInitRef NotificationService=Corbaloc::Tele/NotificationService
3. ORBDefaultInitRef
用ORBDefaultInitRef可以定义默认的URL形式的对象句柄的位置。如下所示:
-ORBDefaultInitRef corbaloc::yourdomain.com
ORG启动时会调用resolve_initial_references("NotificationService"),然后生成如下的完整的URL,如下所示:
Corbaloc::yourdomain.com/NotificationService
然后把这个完整的URL传给string_to_object,获取服务的session句柄,这样就可以和服务器端进行通信了。
四.总结
通过对象命名服务,可以简化ORB客户端和服务器端的通信,提高通信的质量和效率。对提高Corba在Internet在应用起了很大的作用。