在线文档教程
Erlang 20

7. CosNaming服务 | 7. CosNaming Service

7 CosNaming服务

7.1 CosNaming服务概述

CosNaming服务是一项服务,旨在帮助用户和程序员通过人类可读的名称而非参考来识别对象。通过将名称绑定到命名上下文(另一个对象),形成上下文引用。这在导航对象空间时很有用。另外,按名称标识对象可以让您在未修改客户端代码的情况下演进和/或重新定位对象。

CosNaming服务有一些重要的概念:

  • 名称绑定 - 对象关联的名称。

  • 命名上下文 - 是一个包含一组名称绑定的对象,其中每个名称都是唯一的。不同的名字可以绑定到同一个对象。

  • 绑定名称-在给定的上下文中创建一个绑定的名称。

  • 解析名称-确定在给定上下文中与名称关联的对象。

名称总是在上下文中解析,没有绝对名称存在。由于上下文与其他任何对象相似,因此它也可以绑定到命名上下文中的名称。这将产生一个命名图(带有注释和标记边的有向图)。该图允许更复杂的名称引用对象。给定一个上下文,你可以使用一个序列来引用一个对象。这个序列被以下称为名称和序列中的单个元素名称组件。除姓氏组件之外的所有组件都绑定到命名上下文。

图1中的图说明了命名服务如何在对象,NamingContexts和NameBindings之间提供上下文关系以创建对象本地,因为对象本身没有名称。

图7.1:图1:使用命名服务的上下文对象关系。

命名上下文为对象提供上下文引用和命名的目录(一个对象可能看起来有多个名称)。

在图1中,右侧的对象可以称为来自一个上下文的alpha或来自另一个上下文的gamma。

命名服务具有初始命名上下文,该命名上下文在图中显示为命名图中最顶端的对象。它有两个名字betaepsilon,这必将对其他命名上下文。最初的命名上下文是用于在多个程序之间共享公共名称空间的众所周知的位置。您可以遍历命名图,直到找到一个名称,该名称绑定到一个不是命名上下文的对象。

我们建议阅读第12章CORBA基础和编程,以获取有关命名服务的详细信息。

7.2命名服务的基本用途---案例

命名服务的基本用例是:

  • 获取对命名服务的初始引用。

  • 创建命名上下文。

  • 绑定和解除绑定名称到对象。

  • 将名称解析为对象。

  • 列出命名上下文的绑定。

  • 破坏命名上下文。

获取对命名服务的初始引用

为了使用命名服务,您必须获取对它的初始引用。这项工作是通过以下方式完成的:

NS = corba:resolve_initial_references("NameService").

NS在其他用例中指的是这个最初的引用。

创建命名上下文

有两个函数用于创建命名上下文。第一个函数只创建命名上下文对象,它是:

NC = 'CosNaming_NamingContext':new_context(NS).

另一个函数创建命名上下文并将其绑定到已经存在的命名上下文%28中的名称--本例中的初始上下文%29:

NC = 'CosNaming_NamingContext':bind_new_context(NS, lname:new(["new"])).

绑定和解除绑定对象的名称

以下步骤说明如何将对象引用绑定到/从名称中绑定/解除绑定。对于下面的示例,假定路径中的NamingContexts已经绑定到名称/workgroup/services,并且对服务上下文的引用位于变量中Sc

  • 使用命名库函数来创建名称Name = lname:new(“object”)。

  • 使用CosNaming :: NamingContext :: bind()将名称绑定到对象

'CosNaming_NamingContext':绑定(Sc,Name,Object)。

  • 使用CosNaming :: NamingContext :: unbind()从对象'CosNaming_NamingContext'中删除NameBinding:unbind(Sc,Name)。NoteObjects可以具有多个名称,以指示指向同一对象的不同路径。将名称解析为对象以下步骤显示如何检索上述服务上下文(/ workgroup / services)的对象引用。

  • 使用命名库函数创建名称路径:

Name = lname:new(“workgroup”,“services”)。

  • 使用CosNaming :: NamingContext :: resolve()来将名称解析为对象Sc ='CosNaming_NamingContext':resolve(NS,Name)。另一种方法是使用:Sc = corba:string_to_object(“corbaname:rir:/ NameService#workgroup / services /”)。该corbaname架构在互操作命名服务在一个的NamingContext section.Listing绑定进一步描述

  • 使用CosNming::NamingContext::List%28%29列出上下文中的所有绑定

以下代码从上下文中检索并列出最多10个绑定。

{BList,BIterator} ='CosNaming_NamingContext':list(Sc,10)。list:foreach(fun({{Id,Kind},BindingType}) - > case nobject的BindingType - > io:format(“id:%s,kind:%s,type:object〜n”,Id,Kind) ; - > io:format(“id:%s,kind:%s,type:ncontext〜n”,Id,Kind)end end,Blist)。

通常,BindingIterator在列表中有大量对象的情况下很有用,因为程序员可以更容易地遍历它。在Erlang中它不是必需的,因为列表很容易在语言中处理。

警告

请记住,BindingIterator(示例中的BIterator)是一个对象,因此必须将其删除,否则将发生悬挂进程。用CosNaming::BindingIterator::destroy()它来删除它。

'CosNaming_NamingContext':destroy(BIterator).

破坏命名上下文

命名上下文是持久的,必须明确删除。(如果域中的所有Orber节点都停止,它们也会被删除)。

  • 使用CosNaming :: NamingContext :: destroy()删除NamingContext的'CosNaming_NamingContext':destroy(Sc)。7.3可互操作的命名服务OMG指定了URL方案,它表示一个CORBA对象和一个绑定在NamingContext中的CORBA对象,用于解析来自其他ORB的引用。截至今天,有三种方案被定义:

  • IOR

  • corbaloc

  • corbaname

IOR

字符串化的IOR是有效的URL格式,但人类难以通过非电子手段处理。该URL格式不依赖于特定的名称服务,因此它是健壮的,并且将客户端与用于引用该对象的封装的传输信息和对象密钥隔离。

corbaloc

这个方案的符号类似于更为人熟知的URL HTTP,完整的corbalocBNF是:

<corbaloc> = "corbaloc:"<obj_addr_list>["/"<key_string>] <obj_addr_list> = [<obj_addr>","]*<obj_addr> <obj_addr> = <prot_addr> | <future_prot_addr> <prot_addr> = <rir_prot_addr> | <iiop_prot_addr> <rir_prot_addr> = <rir_prot_token>":" <rir_prot_token> = rir <future_prot_addr> = <future_prot_id><future_prot_addr> <future_prot_id> = <future_prot_token>":" <iiop_prot_addr> = <iiop_id><iiop_addr> <iiop_id> = <iiop_default> | <iiop_prot_token>":" <iiop_default> = ":" <iiop_prot_token> = "iiop" <iiop_addr> = <version><host>[":"<port>] <host> = <DNS-style Host Name> | <ip_v4_address> | "["<ip_v6_address>"]" <version> = <major>"."<minor>"@" | empty_string <port> = number <major> = number <minor> = number <DNS-style Host Name> = string <ip_v4_address> = string <ip_v6_address> = string <key_string> = for example NameService

corbaloc计划由三部分组成:

  • 协议 - 截至今天iioprir得到支持。使用rir意味着我们将在本地解析给定的密钥,即与使用相同corba:resolve_initial_references("NameService").

  • IIOP地址 - 该地址可分为版本,主机和端口。 如果版本或端口被忽略,它们将分别设置为默认值1.0和2809。

  • KeyString - 一个对象键,例如“NameService”。如果没有提供密钥,将使用默认值“NameService”。

可以将corbaloc与corba:string_to_object(“corbaloc :: 1.0@erlang.org:4001 / NameService”)一起使用,或将其设置为配置变量orbInitilRef或orbDefaultInitilRef并调用corba:resolve_initial_references(“NameService”)。 有关更多信息,请参阅Orber安装章节。 corbaloc也可以和corbaname一起使用,以获得对名称服务的轻松访问。

目前,OMG定义了一组保留键和下面列出的对象的类型,它们应该关联。Orber中的NameService钥匙可能不会更改。如果你想添加一个保留密钥作为初始服务,只需使用:

1> Factory = cosNotificationApp:start_global_factory(). 2> corba:add_initial_service("NotificationService", Factory).

然后,任何其他支持互操作命名服务的ORB都可以轻松地解析此对象,方法是:

3> NF = corba:string_to_object("corbaloc::1.0@erlang.org:4001/NotificationService").

字符串名称 对象类型
RootPOAPortableServer::POA
POACurrentPortableServer::Current
InterfaceRepositoryCORBA::Repository
NameServiceCosNaming::NamingContext
TradingServiceCosTrading::Lookup
SecurityCurrentSecurityLevel1::Current/SecurityLevel2::Current
TransactionCurrentCosTransaction::Current
DynAnyFactoryDynamicAny::DynAnyFactory
ORBPolicyManagerCORBA::PolicyManager
PolicyCurrentCORBA::PolicyCurrent
NotificationServiceCosNotifyChannelAdmin::EventChannelFactory
TypedNotificationServiceCosTypedNotifyChannelAdmin::TypedEventChannelFactory
CodecFactoryIOP::CodecFactory
PICurrentPortableInterceptors::Current

corbaname

corbaname URL方案是corbaloc方案的扩展,完整的corbaname BNF是:

<corbaname> = "corbaname:"<obj_addr_list>["/"<key_string>]["#"<string_name>] <obj_addr_list> = as described above. <key_string> = as described above.

string_name并置到corbaloc字符串,标识一个命名上下文结合。名称组件由两部分组成,即idkind,它表示如下:

字符串名称名称序列评论
“ID1 /./ id3.kind3”{ “ID1”, “”},{ “”, “”},{ “ID3”, “kind3”}第一个组件没有定义类型,而第二个组件的这两个域都是空的。
“ID1 // id3.kind3”错误不允许,必须插入'。' 在。。之间 '//'。
“id1.kind1 /。”{ “ID1”, “kind1”},{ “”, “”}第一个组件的字段都被设置,而第二个组件的两个字段都是空的。
“id1.kind1 / ID2。”错误一个尾随' . 'Id 不允许。
“I \ / D1 / I \ .D2”{ “I / D1”, “”},{ “i.d2”, “”}自'。'以来 和'/'用于分隔组件,这些令牌必须转义才能正确转换。

在创建字符串化名称之后,我们可以使用:

NameStr = "org.erlang", NS = corba:resolve_initial_references("NameService"), Obj = 'CosNaming_NamingContextExt':resolve_str(NS, NameStr),

或使用以下方法连接名称字符串:

NameStr = "Swedish/Soccer/Champions", Address = "corbaname:iiop:1.0@www.aik.se:2000/NameService", NS = corba:resolve_initial_references("NameService"), URLStr = 'CosNaming_NamingContextExt':to_url(NS, Address, NameStr), Obj = corba:string_to_object(URLStr),

使用第一个备选方案,配置变量orbInitilRef和orbDefaultInitilRef将确定哪些其他ORB或本地名称服务Orber将尝试解析给定的字符串。 第二种选择允许我们覆盖配置变量的任何设置。

该函数to_url/3将执行符合IETF / RFC 2396的任何必要的转义符。US-ASCII字母数字字符并且"," | "/" | ":" | "?" | "@" | "&" | "=" | "+" | "$" | ";" | "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"不会被转义。