`
snoopy7713
  • 浏览: 1148825 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

基于OSGi的声明式服务

    博客分类:
  • OSGi
阅读更多

1. 引言

  OSGiOpen Services Gateway Initiative)有双重定义。一方面它指OSGi Alliance组织;另一方面指该组织制定的一个基于Java语言的服务规范——OSGi服务平台。OSGi Alliance是一个由Sun MicrosystemsIBM、爱立信等于19993月成立的开放的标准化组织。该组织及其标准原本目的在于使服务提供商通过住宅网关为各种家庭智能设备提供各种服务,目前该平台逐渐成为一个为室内、交通工具、移动电话和其他环境下的所有类型的网络设备的应用程序和服务进行传递和远程管理的开放式服务平台。

  该规范和核心部分是一个开放并提供统一接口标准的体系框架,其中定义了应用程序的生命周期模式和服务注册,基于这个体系机构,服务提供商、程序开发人员、软件提供商、服务网管运营商、设备提供商能够协调地联合起来开发,部署以及管理向用户提供的各种服务。这个框架实现了一个优雅、完整和动态的组件模型。应用程序(称为bundle)无需重新引导可以被远程安装、启动、升级和卸载(其中Java/类的管理被详细定义)。API中还定义了运行远程下载管理政策的生命周期管理。服务注册允许bundles去检测新服务和取消的服务,然后相应配合。

2. 声明式服务出现及其组成

  OSGi框架包含一套编程式的服务模型,它提供了服务的发布、查找和绑定操作。这个模型是简单而且强大的,它使应用能通过服务方式同外部的bundle进行通讯和协作。在OSGi服务层定义了一个和生命周期层紧密结合的动态协作模型,一个服务(service)就是一个通过服务登记来注册到一个或者多个Java接口下的Java对象。

  当OSGi的服务模型应用于大型的系统和大范围的部署会带来一些兼容性问题,例如:

Ø         启动时间----编程式的服务模型需要bundle主动地注册服务和获取服务,这些工作通常在启动时执行,需要bundle在其激活器中执行初始化。在一个大型系统中,它会延长系统的启动时间,不能快速的响应结果。

Ø         内存占用----一个服务被注册到框架中意味着服务实现相关的类和对象被装载到内存中,如果服务从不被使用的话,那么这个内存是没有必要被占用的,而且创建一个类加载器可能引起显著的开销。

Ø         复杂性----服务能够在任何时候注册和注销。这种动态的特性使得编程式的服务模型比传统的方式更加复杂,这些复杂性对开发健壮的和可靠的应用会起到消极的作用,因为这些应用不能保证所有的动态处理总是正确。

针对编程是服务模型存在的上述问题,我们提出了新的服务构件模型Declarative service声明式服务的方式来发布、查找和绑定OSGi的服务。

声明式服务中引入了两个元素,构件(component)和元数据文件(metadata.xml)。构件是一个物理的、可替换的系统组成部分,它包装了实现体且提供了对一组服务接口的实现方法。构件自身必须相容于接口且实现接口,接口表示了驻留在构件内的成分所实现的服务。这些服务定义了的一个整合的行为,并从一些构件实例提供给其它客户端构件实例。在声明式服务中一个构件就对应了某一个构件实现类,这个类相当于是一个pojo(普通的Java对象),在这个类中我们可以注册服务、引用服务、构件属性配置等一些满足特定需求的操作,总之构件是服务的提供者和使用者。而元数据文件则是一个xml文件,在声明式服务中所有的元数据文件名称都为metadata.xml,在这个xml文件中我们可以根据需求配置构件的一些必需信息,且所配置的这些信息必须遵循声明式服务元数据规范。

声明式服务主要由四个部分组成,声明式服务容器部分、元数据解析部分、代码织入部分和打包成声明式服务bundle的插件部分。

Ø         声明式服务容器----用来解析部署到OSGi环境中的bundle,存放所有已创建的服务构件实例和方面构件实例,并对其相应的配置信息、生命周期进行管理。

Ø         元数据解析----用来解析bundle中的元数据文件信息,使用SAX解析器将元数据文件中每一个节点的信息都解析出来,构造成构件(component)或是构件实例(instance)供声明式服务容器使用。

Ø         代码织入----针对构件实现类进行的操作,主要是在构件实现类已实现的服务接口中增加一个pojo接口(用来获取当前服务对象的构件实例,给某个字段注入值),并在相应的构件实现类基础上生成以"_WC_ "开头的字节码文件。

Ø         声明式服务插件----将构件所在工程打包成声明式服务的bundle,在打包的过程中对构件实现类进行织入、对元数据文件进行解析并增强并在该bundlemanifest文件中添加与声明式相关的头标信息。

1是组成声明式服务的模块图,其中Loong Dservice Impl是声明式服务容器部分,Loong Dservice Metadata是元数据解析部分,Loong Dservice weaver是代码织入部分,Loong Dservice plugin是声明式服务插件部分。

声明式服务模块图

3. 声明式服务的优点

声明式服务是一个基于OSGi框架面向服务的构件模型,采用服务组件的延迟加载以及组件生命周期管理的方式来控制对于内存的占用以及快速启动。

  这种方式简化了OSGi服务的开发者执行服务注册和处理服务依赖的工作,从而可以使编程的工作减少到最小;它也允许服务构件在需要时才进行加载。作为这种方式的结果,bundle中不再需要提供BundleActivator来通过服务注册库与其它的bundle进行协作。

  从系统的角度来看,服务构件模型意味着减少了启动时间和潜在的降低了内存的占用。从一个程序员的角度来看,服务构件模型提供了一种简化的编程模型。

DService声明式服务框架是提供了一个简单的、可扩展的、基于POJO的面向服务构件开发模型;是基于OSGi扩展规范中的Declarative ServicesSpecification的参考实现。它提供声明元数据的方式开发OSGi环境中的服务构件,由框架管理构件实例,从而简化了因管理动态环境而导致的非功能性需求;它可以通过集成功能性或非功能性方面构件快速开发出一个业务构件。非侵入式编程,开发人员只需要关心自己的业务逻辑。

总之,声明式服务有以下几方面的特性:

Ø         简化开发方式:开发一个应用无需关注OSGiDService相关的API,也无需控制构件组装与它们的生命周期,只需要开发若干POJO和相应的xml元数据。

Ø         服务的动态性管理:Dservice框架与OSGi框架相结合,任何关于服务的管理都由DService框架来完成,包括发布服务、引用服务、受管服务等等。

Ø         服务对象依赖注入:框架可以为构件实例管理所有的服务依赖。

Ø         构件延迟实例化:构件实例可以等到需要它时才被创建,这样可以避免启动占用太多的时间和空间。

Ø         可扩展:Dservice框架的高可扩展性可以让开发人员自己为框架动态的增加其自定义的功能(比如提供一个远程的OSGi服务、使用JMX等)。

Ø         编译期代码织入:生成子类继承用于开发的构件实现类,保持用户代码纯洁、可调试。

分享到:
评论
1 楼 jsonmong 2015-06-29  
OSGI,是未来的主流,目前已相当成熟。
应用OSGI比较好的,国外有JIRA、国内有JXADF(http://osgi.jxtech.net

相关推荐

    OSGi and Equinox:Creating Highly Modular Java Systems

    阅读本书,首先你很快就会使用Eclipse ...你将了解所有的OSGi声明式服务,以及如何通过这些服务来解决各种现实问题。最后,你会发现所有这些都在本书所提供的完整案例(从早期的原型构建到最终的应用交付)中得以实现。

    WebSphere基于OSGi的应用部署和SCA集成.doc

    【WebSphere基于OSGi的应用部署和SCA集成】 WebSphere应用服务器V7引入了对OSGi(开放服务网关倡议)应用程序和Java持久化API 2.0的支持,这两个技术的结合提供了更灵活和模块化的部署方案。OSGi Blueprint ...

    osgi介绍osgi介绍

    1. **模块化**:每个bundle都是一个独立的模块,有自己的类路径和资源,可以通过声明式服务来暴露和消费接口。 2. **动态性**:bundle可以在运行时安装、启动、停止或卸载,使得系统可以进行热更新,而不会中断服务...

    基于OSGI的新一代手机电话本实现

    5. **Declarative Services (DS):** 一种声明式的服务框架,简化了服务的注册和使用过程。 6. **Event Admin:** 提供了一种事件驱动的通信机制,bundle可以通过它来发布和接收事件。 7. **Configuration Admin:...

    hessian-bndtools-osgi:此存储库包含几个 bndtools 项目,这些项目解释了如何从外部 Java 应用程序使用 OSGi 声明式服务

    此存储库包含几个 bndtools 项目,这些项目解释了如何从外部 Java 应用程序使用 OSGi 声明式服务 bndtools 运行描述符未处于工作状态。 最好将生成的目录中的 jar 文件复制并部署到 OSGi 容器并运行代码。 该代码...

    Intellij 13下OSGi的Maven例子

    客户端和服务端的实现通常会涉及到OSGi的Declarative Services(DS)或Blueprint,它们是声明式服务配置的方式,通过XML文件定义服务的依赖和行为。在DS中,我们可以使用`@Component`和`@Reference`注解来声明服务...

    OSGI入门和例子

    3. **服务注册与发现**:OSGI提供了服务注册和服务发现机制,允许bundle之间以声明式的方式提供和查找服务。这增强了系统的可扩展性和解耦性。 4. **版本管理**:OSGI支持多个版本的相同包共存,每个bundle都可以...

    OSGi R4规范,中文版

    OSGi R4引入了服务组件模型(SCR),这是一种用于管理服务生命周期和依赖关系的声明式方式。通过配置文件,开发人员可以定义服务的元数据以及与其他服务的依赖关系,从而简化了服务的配置和部署过程。 ##### 2.4 ...

    OSGi R4服务平台核心规范

    这确保了所有基于OSGi规范的产品和服务能够在相同的质量标准下运行,提高了整个生态系统的兼容性和互操作性。 #### 四、OSGi规范的关键特性 1. **模块化架构**:OSGi规范支持模块化设计,每个服务都可以作为一个...

    spring-osgi 入门手册和代码

    - **Declarative Services (DS)**:DS 是一种声明式服务配置机制,它允许开发者通过元数据定义服务及其依赖关系,而无需编写额外的代码。 - **Blueprint Container**:Spring OSGi 提供了一个基于 Blueprint 的...

    osgi实战(pdf超请版)

    - **7.2 OSGI R4规范**:详细解析OSGI R4规范,包括核心框架(Core Framework)、启动级别服务(Start Level Service)、声明式服务(Declarative Services)、配置管理服务(Configuration Admin Service)、事件管理服务...

    OSGi_Release7官方文档

    2. **服务注册与发现**:OSGi服务允许模块之间以声明式的方式共享资源。服务注册到服务注册表中,其他模块可以通过查询发现并使用这些服务,实现了松耦合和动态性。 3. **生命周期管理**:束有启动、暂停、更新和...

    Equinox开发OSGi应用程序

    - **Declarative Services**:这是一种声明式服务模型,简化了服务的定义和注册过程。 #### 探讨OSGi应用架构 在设计OSGi应用程序时,可以考虑以下几点: - **模块化设计**:将应用程序划分为多个独立的bundles,...

    WPF界面-OSGI.net

    1. **WPF基础**:了解WPF的基本概念,如XAML(eXtensible Application Markup Language)用于声明式地定义UI,以及数据绑定、样式和模板等特性。 2. **OSGI原理**:理解OSGI的核心概念,如服务、模块(称为bundle)...

    OSGI原理与最佳实践(附简下载)

    6. **合理利用服务组件模型(Declarative Services, DS)**: 使用DS声明式配置服务,减少代码量,提高代码可读性和可维护性。 7. **监控与日志**: 集成OSGI的监控和日志服务,便于调试和排查问题。 8. **安全性...

    osgi+maven+springdm文档集

    它提供了一种声明式的方式来配置和管理OSGI服务,使得Spring应用能在OSGI容器中无缝运行。"EclipseMavenSpringDM(译文).pdf"可能是对Spring DM的深入解读,特别是如何在Maven和Eclipse环境下集成和使用。 **4. ...

    解决osgi spring 事务配置问题

    2. **声明式事务管理**:利用`@Transactional`注解在方法级别声明事务边界,由Spring AOP代理在背后处理事务的开始、提交或回滚。 然而,在OSGi中,由于类加载器的隔离,Spring的AOP代理可能无法正确地找到被代理的...

Global site tag (gtag.js) - Google Analytics