`
javaboy2006
  • 浏览: 183212 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

尝试给SOFA下的一个定义

    博客分类:
  • java
阅读更多
    OSGI:服务与组件(Components & Services)

    关键理念是组件与服务(Components & Services),Developing with OSGi technology means developing bundles: the OSGi components.(摘自:http://www.osgi.org/About/WhyOSGi)。

    直观点来理解,我们开发的一个基于OSGI的系统(如settleprod),里面的每一个工程都是一个component。每一个component实现并注册自己的services,而这些services将会被其他的component来引用。

    最后,这些component在部署的时候都会打成一个jar包,每个jar包里面都会有描述自己的一个MF文件,比如下面就是sofa-platform-common-1.2.jar这个包的一个MF文件,在META-INF文件夹下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xi.hux
Build-Jdk: 1.5.0_08
Bundle-ManifestVersion: 2
Bundle-Name: Alipay SOFA Platform common
Bundle-SymbolicName: com.alipay.sofa.platform.common;singleton:=true
Bundle-Version: 1.0.0
Bundle-Vendor: Alipay
Eclipse-LazyStart: false
Spring-Parent: org.mule.esb


    关键的信息是:Bundle-SymbolicName: com.alipay.sofa.platform.common,这个事标示这个组件的名字,其他组件要引用这个组件的服务的话会用到这个名字。

    现在业界内对OSGI的实现比较典型的就是Equinox,这个其实就是我们每天正在使用的Eclipse的内核,现在版本Eclipse就是基于实现了OSGI的这个Equinox平台的。我们现在不需要下载任何第三方jar包就可以在eclipse上开发OSGI组件了。

    另附一篇JavaWorld上的 Hello, OSGi, Part 1: Bundles for beginners,算是一个OSGI的“hello world”,手把手教你怎么样直接使用Equinox开发OSGI bundle。

    Spring:反转控制IoC

    这个没什么好说的,看过《spring in action》一遍就能很容易的上手Sping了,没书的话直接就去看documentation也无所谓。关键理念就是IoC,把每一个业务实现的类都管理成bean,再使用反转控制来控制他们之间的依赖关系,然后就是玩玩bean的生命周期之类的。
   
    Spring Dynamic Module:OSGI服务(Services)的Spring实现

    关注OSGI的话都会了解到Spring那边有一个Spring Dynamic Module的东西,Spring动态模块。Spring Dynamic Module在原来的Spring的基础上增加了3个重要的jar包(可能由于版本不同,报名也变了):


org.springframework.osgi.bundle.extender
org.springframework.osgi.bundle.core
org.springframework.osgi.bundle.io
    事实上,这三个jar包在OSGI里面都是一个组件,不同的是org.springframework.osgi.bundle.extender这个组件,他会监听其他组件的部署,然后在其他组件部署后去到该组件jar下查看是否有名为”spring”的目录,如果有的话则这个组件对他而言就是一个 Spring Enabled的组件,然后他就会为该组件创建一个Spring的应用上下文(Application Context),读取在”spring”目录下面的xml配置文件,并创建xml配置文件里面定义的所有bean,配置他们之间的依赖。如果他在这些配置文件中发现有<osgi-service ref=”aBean” interface=”aInterface”>的定义,则会在一个Service Repository(服务库)上注册这个服务,而且服务的索引key为interface指定的接口,服务的实现为ref指定的在组件内的一个bean。如果他在这些配置文件中发现有<osgi-reference id=”name” interface=”bInterface”>的定义,则会去Service Repositry查找以interface标识的服务,查看是否有这个服务的实现,并在组件内的应用上下文注册成为一个bean,供组件内的其他 bean使用。

    这就是服务的注册和服务的引入。他与Equinox实现的服务的注册和服务的引入之间的不同就是,Equinox的实现是通过编程的API来实现的,你要注册服务需要自己在程序内调用一个context.registerService的API,把自己的服务注册上去,服务的引入也需要调用一个 getService的API来获得;而Spring Dynamic Module里面的实现方式是沿用了Spring的理念,IoC,服务的注册和获取不用你在程序里面来完成,只需要你在XML配置文件中说明就好了,然后 Spring会为你注册和引用。

    作为介绍OSGI的同一系列文章,Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules也介绍了OSGI的Spring实现,同样是手把手的教程。

    Nuxeo Runtime:主机适配(Host Adapt:OSGI组件的实现)和扩展(Extension)

    我们编写的一个个工程很容易在Equinox里面就是一个组件,但是在其他没有完全实现OSGI技术(比如Jboss)的平台上面,怎么让我们的工程变成组件呢?Nuxeo Runtime就是做的这个功能。比如,我们的一个工程,最后打包成jar包,然后部署到Jboss上面,最后是成为了一个MBean,而不是一个 OSGI的组件。但是,如果我们通过Nuxeo Runtime的适配器来部署到JBoss上,在Jboss上仍然是一个MBean,但是这个MBean也是一个OSGI组件,那上面介绍的OSGI的技术就可以实现了。换种方式说,就是NXRuntime使用OSGI组件模型,并利用一堆Adapters来把这些组件部署到不同的Java主机平台上面,比如Jboss,Geronimo(另一种Java EE服务器)。

    另外,Nuxeo Runtime除了实现了OSGI组件技术外,还实现了一种扩展机制。事实上,看一下有关OSGI架构的介绍,OSGI 并没有关于扩展的定义,扩展是Nuxeo Runtime借鉴Eclipse插件技术增加的功能。有接触过Eclipse插件开发的话,就会知道Eclipse插件开发无非就是为上面的扩展点(Extension Point)和扩展(Extension),比如你想新增加一个View,用来显示当前编辑器上面都有哪些TODO标签,那么只需开发一个插件,这个插件有一个扩展,该扩展会去扩展Eclipse上面id为org.eclipse.ui.views的扩展点。那么Nuxeo Runtime也实现了这种扩展机制,让你很容易的为扩展点编写扩展,比如,在组件名为Bundle-SymbolicName: com.alipay.sofa.platform.event的一个支付宝组件里面,定义了一个扩展点serviceExport:

    <osgi:extension-point ref=”sofaPlatformServiceExporter” name=”serviceExport”>
        <osgi:object />
    </osgi:extension-point>  

    这个扩展点是用于暴露Web Service的,以后我们需要编写Web Service的时候,只需要扩展这个扩展点,把自己的接口和实现指明就可以了,如下:

    <osgi:extension bean=”sofaPlatformServiceExporter” point=”serviceExport”>
        <osgi:content>
            <serviceExport>
                <serviceInterface>com.alipay.settleprod.product.cod.facade.LogisticsResolveService</serviceInterface>
                <serviceBean>logisticsResolveService</serviceBean>
            </serviceExport>
        </osgi:content>
    </osgi:extension>

    这样使得我们的组件很灵活,以后要增加web service和修改web service时只需要增加插件,编写扩展即可。如果想了解多点有关扩展和扩展点,可以直接google下eclipse插件开发,也可以直接查看支付宝里面扩展和扩展点是如何实现的。

    Sofa:Spring Dynamic Module+Nuxeo Runtime实现OSGI的整套技术

    现在感觉对Sofa的理解比较清晰了,尝试给Sofa一个说法就是“使用Nuxeo Runtime实现了OSGI组件模型,利用Spring Dynamic Module实现组件服务机制,并且再利用Nuxeo Runtime实现了扩展机制”的一整套技术组合。其优点:

模块化,模块边界清晰,易于维护。
服务化,服务的注册和依赖都很方便。
易于扩展,很好的定义扩展点和扩展。
    这只是我的一种现在的理解,可能还有很大偏差,但是觉得大概就是这些了。当然,整个贯穿其中的还有Spring的IoC机制,让我们能很快速的就构建我们的服务,编写扩展和扩展点。还有很多ESB技术,Web Service技术等等,但是这些技术都是依托于上面所说的那些技术的,比如,使用Mule实现的ESB,在支付宝里面的地位是就是一个普通组件(记得是在近卫军时上课时我提的一个问题的答案),但是他不是业务组件,是架构组件。还有Xfire实现的web service,都是一样的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics