OSGI的远程服务

OSGI框架提供一个本地服务注册库用于bundle通过服务对象的形式通信,在注册库里,服务是一个对象,一个bundle注册,另外一个bundle获得并使用。一个分布式提供者可以使用bundle间的松散耦合,通过创建endpoint,来导出一个已注册的服务。反之亦然,分布式提供者可以创建一个代理对象来访问一个endpoint,然后注册这个代理为一个导入服务。一个框架同时包含多个分布式提供者,每个分布式提供者独立地导入和导出服务。

一个endpoint对于其他框架来说是一个通信访问机制。一个web Service,其他进程,一个队列或者一个目标主题,等。要求通过一些协议来通信。服务和endpoint之间的映射以及他们的通信特性总称为拓扑。一个常见的案例对于分布式提供者来说,就是体现在多个框架质检导入和导入服务。有效地分布服务库。

下图是远程服务的本地架构描述图:略

说明:本地服务隐含着虚拟机内置调用的语义。这些语义中有很大一部分不支持通信连接,或者要求通信连接的特别配置。这就是为什么要给bundle定义一个机制来传送他们之间的需求和假设。本节定义一定数量的服务属性,分布式服务提供者可以用来在遵守给定约束的情况下建立一个拓扑。

误区:

分布式的通用抽象已经被尝试过,并且通常这种尝试会失败。众所周知的误区包括:

  • 网络是可靠的
  • 潜伏期是0
  • 带宽是无限的
  • 网络是安全的
  • 拓扑不会改变
  • 只有一个管理者
  • 传输成本为0
  • 网络是对称均匀的

大多数误区体现的是非功能的问题,是应当由网络管理员来考虑的问题。他们的决策会反馈到拓扑上。例如:在有些情况下,有限带宽是可以接受的,数据中心的延迟率(潜伏期)是接近零的。然而,可靠性误区是很难搞定的,因为可靠性问题可能会侵入到代码中。如果一个通信通道丢失,应用程序代码必须做专门的处理来从失败中恢复。

可靠性方面也被OSGI服务所重视,因为服务是动态的,通信的失败可能导致导入的服务注销,bundle已经深知动态性,开发了一定数量的编程模型来简化写动态程序的复杂性。

远程服务属性

本节介绍bundle的一些属性,用这些属性可以给分布式服务提供者传送信息(按照远程服务规范)。属性列表如下,属性的应用常见后续说明:

 

属性名 类型 描述
remote.configs.supported 字符串 被分布式服务提供者注册的他的服务之一,表明支持的配置类型是远程配置
remote.intents.supported 字符串 被分布式服务提供者注册的他的服务之一,表明所实施的词汇意图
service.exported.configs 字符串 一个配置类型列表,用于导出服务,每个配置类型代表了一个或者多个endpoint的配置参数,分布式服务提供者针对他支持的每个配置类型,创建一个endpoint
service.exported.intents 字符串 一个意图列表,代表了分布式服务提供者意欲实现的分布式服务的意图。这个属性中列示的意图是为了保留一份存档,用于印证代码到功能的正确性。
service.exported.intents.extra 字符串 该属性必须在分布式服务提供者解释列示的意图之前与上个属性合并,因此他具有与前者相同的语义,但是这些属性应该是可以被配置的,这样的话,管理者就可以基于拓扑来选择意图,bundle也就可以使这个属性可配置。
service.exported.interfaces 字符串 设置该属性来标记服务要被导出,它定义了接口,实现该接口的服务将被导出,这个列表必须是ObjectClass服务属性中列出的类型的子集。一个单个型号表明所有在注册的接口(排除类)。强烈建议导出接口而不是类。
service.imported * 分布式服务提供者必须设置任意值,当他注册一个endpoint代理作为导入的服务,一个bundle可以使用这个属性来筛选导入的服务。
service.imported.configs 字符串 用于导入服务的配置信息,类似上面描述的service.exported.configs,这个配置类型相关的任何属性必须正确地映射到导入系统。例如:这个属性中的url必须指向一个有效的资源。如果这个属性值列出了多个配置类型,他们必须与导出的endpoint具有相同语义。
service.intents 字符串

服务实现的意图列表,这个属性有双重意思:

  • bundle使用该服务属性告知分布式服务提供者,这些意图已经被导出的服务对象实现
  • 分布式服务提供者使用该属性来传送下列合并的意图

         1.导出的服务

         2.导出的分布式服务提供者增加的意图

         3.导入的分布式服务提供者增加的意图

为了导出一个服务,分布式服务提供者必须扩大任何的合格的意图,这些意图来自被支持的endpoint。这也可能是所有已知合格意图的子集。

service.pid 字符串 被导出服务必须有个pid,这个pid用以唯一持久化识别服务,该属性使得分布式服务提供者关联持久化专有数据与一个服务注册。

注册一个服务用于导出

在下列条件满足的情况下,分布式服务提供者应当为一个导出的服务创建一个或多个endpoint:

  • 服务拥有服务属性:service.exported.intefaces。
  • 所有在service.exported.intents, service.exported.intents.extra and service.intents列示出的意图都在分布式服务提供者的词汇库中。
  • 没有相互排斥的意图。
  • 分布式服务提供者可以使用service.exported.configs中的配置类型来创建一个或多个endpoint。

endpoint至少实现所有的列示在service.exported.intents和 service.exported.intents.extra属性中的意图。

在service.exported.configs中列示的配置类型可以包含替代者和同义词。替代者为同一个服务描述不同的endpoint,同义词为同一个endpoint描述不同的配置类型。

一个分布式服务提供者应该为每个配置类型创建endpoint,这些配置类型是可替换的,同义词是被允许的。

如果没有配置类型,分布式服务提供者应当采用缺省的配置类型创建一个endpoint,除非列出的配置类型写着:nodefault。

太虚了!!!

本文出自 “美丽人生” 博客,转载请与作者联系!

你可能感兴趣的:(职场,osgi,休闲,bundle注册)