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,都是一样的。
分享到:
相关推荐
基础天文标准库(Standards Of Fundamental Astronomy,SOFA)是IAU赞助的项目,旨在为天文计算提供权威有效的算法程序和常数数值。1994年的IAU大会上,IAU天文标准工作组 提出了创立SOFA的提案。1997年,SOFA评审...
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
SOFABoot 是一个完全兼容 SpringBoot 的开发框架,rpc-sofa-boot-starter 的作用就是将 SOFARPC 功能集成到 SOFABoot 中。rpc-sofa-boot-starter 提供了统一方便的编程界面、配置方式,同时提供了 SOFABoot 的健康...
[] ...Just install this comfy sofa into your application: public class MainApplication extends Application { @Override public void onCreate
sofa-rpc,sofarpc是一个高性能、高扩展性、生产级的java rpc框架。.zip
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
基于springboot的sofa rpc的简单示例,
sofa-rpc,SOFARPC是一种高性能、高扩展性、生产级的Java RPC框架。.zip
基础天文标准库(Standards Of Fundamental Astronomy,SOFA)是IAU赞助的项目,旨在为天文计算提供权威有效的算法程序和常数数值。1994年的IAU大会上,IAU天文标准工作组 提出了创立SOFA的提案。1997年,SOFA评审...
Sofa学习心得,告诉你如何从零开始做Sofa
SOFA微服务开发框架介绍.pdf
支付宝sofa框架的介绍
sofa-bolt,sofabolt是一个基于netty的轻量级、易用性和高性能远程处理框架。.zip
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
java开发中使用的SOFA框架的基本概念。
sofaboot关于spring boot项目的实例代码,包含sofaboot的客户端和服务端代码,导入之后,可直接运行SofaDemoServerApplication.java和SofaDemoClientApplication.java
SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Check,类隔离,日志空间隔离等等能力。
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用...
Bolt 名字取自迪士尼动画-闪电狗,是一个基于 Netty 最佳实践的轻量、易用、高性能、易扩展的通信框架。 这些年我们在微服务与消息中间件在网络通信上解决过很多问题,积累了很多经验,并持续的进行着优化和完善,...
rpc-sofa-boot-starter 的作用就是将 SOFARPC 功能集成到SOFABoot中。rpc-sofa-boot-starter 提供了统一方便的编程界面、配置方式,同时提供了 SOFABoot 的健康检查,类隔离,日志空间隔离等基础能力