ORBit FAQ
1. CORBA
问题 回答
a.) 一个客户是怎样连接到一个服务器? 这是众所周知的关于 CORBA 的问题(更精确的说法是在任何分布式对象系统中均存在这个问题)。它通常以术语"bootstrapping"(引导)描述。一般的说, 可以从名字服务( Name Service)(或者 Trading Object Service) 获得对象的引用, 但是名字服务自身也是对象(有赖于 CORBA 清晰的设计)。既然名字服务自身也是对象,你如何得到对它的引用呢?
一个客户的标准的解决方法是,通过交换可互操作对象引用(Interoperable Object Reference 缩写是 IOR)找到对一个服务器的第一个对象引用。服务器进程通过使用 object_to_string()方法产生一个已创建对象的 IOR。生成的字符串,也叫字符串化对象引用,可通过任何媒介传输,象 email、HTTP、NFS、文件系统,甚至是在浮瓶中的便条 ;-) 。客户进程从媒介中读取 IOR 并通过string_to_object()把它转换回原来的二进制表示。在此之后客户拥有了一个对服务器的有效的引用,这样就可以用通常的方式调用(invoke 也译为激发)方法。
直到现在,各种不同的 ORB 未能提出解决这个重要的引导问题的标准方式。一个例子是 Visibroker 位置服务。 ORB 通过一个专有的_bind()方法在一个中心的服务中登记每个对象。通过网络广播来发现服务。这种机制的缺点是有关对象的信息存储在一个中心表中 。这个表需要在规律性的基础上的更改。这是必须的,因为恶意的对象不彻底的去除登记。如果广播的间隔太短,更改将导致在网络上有大量的噪音 。如果广播的间隔太长,表中将包括僵尸对象。这种专有的解决方案在许多主要的 CORBA 实现中存在。
理想的方法是 resolve_initial_references(),它被用于找到一个命名服务的引用。这样 ORB 不要求开发者写一些额外的代码就可以读取 IOR。 在过去每个 ORB 用自己的命令行参数把 IOR 到 ORB 的核心。(ORBit: ORBNamingIOR=IOR:.....)。 可互操作命名服务 (Interoperable Naming Service 缩写为 INS) 定义(ptc/99-12-03) 引进了标准的命令行参数 -ORBInitRef 来完成这项工作。
yourclientapp -ORBInitRef NameService=IOR_of_naming_service
唯一的窍门是把 argc 和 argv 传递给 ORB 的 ORB_init()调用,这样 ORB 的核心就能展开有关参数,下面的调用之后
nsobj = resolve_initial_references("NameService");
返回想要的对象引用。INS 规范定义是除 IOR 之外的另一个可被人阅读的对象引用。
corbaloc:iiop://IIOPVersion@hostname:port/ObjectKey
corbaloc 通过提供可被人阅读的地址,给出了一个客户指向一个服务器对象的另一种可能的方式。提出另一个的方案是 corbaname,它查阅在主机上的命名服务,用 hostname 指定。
corbaname://hostname#a/b/obj
a/b/obj 指定一个名字,例如一个 NameComponents 的序列, 它用于解析一个对象引用。这种机制将极大的增进整个引导过程并最终解决问题,这在过去曾经是最闹心的重要问题。可被人阅读的对象引用 corbaloc 也有一些毛病。他们认为 INS 规范减轻了拥有晦涩的 IOR 的事实。指定协议的细节,象端口号或协议版本号,在用于传输的协议被交换时将导致引用变得无效。对象的 URL 必须被扩展来支持新协议的信息,而 IOR 是一个数字的序列,永远保持不变。
ORBit 的 CVS HEAD 版本部分的实现了 INS 规范(参见 NameService)。
Michi Henning 对这个问题的更详细的描述在 here。
b.) 我如何在 IDL 中指定缺省的参数? IDL 不允许指定缺省参数。有两个主要原因。首先, IDL 对所有的可得到的 COBRA 映射的语言提出最小的一般性限制。许多语言不支持缺省参数的概念,在映射时支持这个特征时就有困难。 其次,缺省的参数不是真正必须的。 一个接口的设计者可以轻易的把这样的功能分割成两个或更多的独立的方法(注意:重载也由于同样的原因而不被支持,所以方法必须有不同的名字)。
问题 回答
a.) 一个客户是怎样连接到一个服务器? 这是众所周知的关于 CORBA 的问题(更精确的说法是在任何分布式对象系统中均存在这个问题)。它通常以术语"bootstrapping"(引导)描述。一般的说, 可以从名字服务( Name Service)(或者 Trading Object Service) 获得对象的引用, 但是名字服务自身也是对象(有赖于 CORBA 清晰的设计)。既然名字服务自身也是对象,你如何得到对它的引用呢?
一个客户的标准的解决方法是,通过交换可互操作对象引用(Interoperable Object Reference 缩写是 IOR)找到对一个服务器的第一个对象引用。服务器进程通过使用 object_to_string()方法产生一个已创建对象的 IOR。生成的字符串,也叫字符串化对象引用,可通过任何媒介传输,象 email、HTTP、NFS、文件系统,甚至是在浮瓶中的便条 ;-) 。客户进程从媒介中读取 IOR 并通过string_to_object()把它转换回原来的二进制表示。在此之后客户拥有了一个对服务器的有效的引用,这样就可以用通常的方式调用(invoke 也译为激发)方法。
直到现在,各种不同的 ORB 未能提出解决这个重要的引导问题的标准方式。一个例子是 Visibroker 位置服务。 ORB 通过一个专有的_bind()方法在一个中心的服务中登记每个对象。通过网络广播来发现服务。这种机制的缺点是有关对象的信息存储在一个中心表中 。这个表需要在规律性的基础上的更改。这是必须的,因为恶意的对象不彻底的去除登记。如果广播的间隔太短,更改将导致在网络上有大量的噪音 。如果广播的间隔太长,表中将包括僵尸对象。这种专有的解决方案在许多主要的 CORBA 实现中存在。
理想的方法是 resolve_initial_references(),它被用于找到一个命名服务的引用。这样 ORB 不要求开发者写一些额外的代码就可以读取 IOR。 在过去每个 ORB 用自己的命令行参数把 IOR 到 ORB 的核心。(ORBit: ORBNamingIOR=IOR:.....)。 可互操作命名服务 (Interoperable Naming Service 缩写为 INS) 定义(ptc/99-12-03) 引进了标准的命令行参数 -ORBInitRef 来完成这项工作。
yourclientapp -ORBInitRef NameService=IOR_of_naming_service
唯一的窍门是把 argc 和 argv 传递给 ORB 的 ORB_init()调用,这样 ORB 的核心就能展开有关参数,下面的调用之后
nsobj = resolve_initial_references("NameService");
返回想要的对象引用。INS 规范定义是除 IOR 之外的另一个可被人阅读的对象引用。
corbaloc:iiop://IIOPVersion@hostname:port/ObjectKey
corbaloc 通过提供可被人阅读的地址,给出了一个客户指向一个服务器对象的另一种可能的方式。提出另一个的方案是 corbaname,它查阅在主机上的命名服务,用 hostname 指定。
corbaname://hostname#a/b/obj
a/b/obj 指定一个名字,例如一个 NameComponents 的序列, 它用于解析一个对象引用。这种机制将极大的增进整个引导过程并最终解决问题,这在过去曾经是最闹心的重要问题。可被人阅读的对象引用 corbaloc 也有一些毛病。他们认为 INS 规范减轻了拥有晦涩的 IOR 的事实。指定协议的细节,象端口号或协议版本号,在用于传输的协议被交换时将导致引用变得无效。对象的 URL 必须被扩展来支持新协议的信息,而 IOR 是一个数字的序列,永远保持不变。
ORBit 的 CVS HEAD 版本部分的实现了 INS 规范(参见 NameService)。
Michi Henning 对这个问题的更详细的描述在 here。
b.) 我如何在 IDL 中指定缺省的参数? IDL 不允许指定缺省参数。有两个主要原因。首先, IDL 对所有的可得到的 COBRA 映射的语言提出最小的一般性限制。许多语言不支持缺省参数的概念,在映射时支持这个特征时就有困难。 其次,缺省的参数不是真正必须的。 一个接口的设计者可以轻易的把这样的功能分割成两个或更多的独立的方法(注意:重载也由于同样的原因而不被支持,所以方法必须有不同的名字)。
顶(0)
踩(0)
下一篇:Apusic负载均衡器
- 最新评论