`
killko
  • 浏览: 104701 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Group-logo
Servicemix&Fu...
浏览量:0
社区版块
存档分类
最新评论

我的OSGI学习历程

阅读更多
       系统开发到了一定程度的时候,我发现以往有很多可以再优化的地方,于是试图去优化,最终虽然优化了,但是因为牵连的东西有点多,所以花了不少时间。经过一番思考,才意识到需要优化的不是那些代码,而是那些架构。我们需要的大系统应该由多个相对独立的小系统组成,将业务分而治之。于是就去找合适的方法来达到这个目的,很幸运的是,我发现了OSGI。

       刚开始, 就只是知道 OSGI是一个实现模块化的架构,而且最初是作为一个嵌入式的java应用架构规范发展起来的,网上传得最有名的就是在BMW上的车载系统和Eclipse IDE这个两个应用。BMW没钱买来了解,只好看看Eclipse吧 

       想当年,我也尝试用eclipse来开发java程序,但嫌eclipse用起来太繁杂,用了几天,就没兴趣了,就转用比较简单,容易上手的Netbeans来做开发的IDE(也正是为了和其他习惯用eclipse的同事能合作好点,所以也就用上Maven,这是题外话了)。回过头来看Eclipse,依然是感觉超多的Plugins,弄的眼花缭乱。以前一直觉得Eclipse本身的开发也太复杂了吧,这么多的功能,得要多强大的全局观念才能兼顾得过来呀。知道有OSGI这回事后,才理解到,原来Eclipse并不需要多强的全局观念,它的功能都被“分而治之”了,这不正是我们的系统所追求的架构吗?于是,豁然开朗,但是这么多的令人眼花缭乱的功能还是令我静不下心来了解eclipse。

      于是,继续找,后来在apache上找到了felix,感觉挺清爽的,并且在felix.apache.org上了解到了很多OSGI方面的一些知识,再后来就看到了karaf,有了karaf,准备运行时环境就轻松了,于是就开始尝试去开发OSGI的bundle,然后放到karaf上跑。

      刚开始尝试做OSGI bundle,首先意识到的是如何组建一个bundle工程,想到既然一直以来都是用Maven做项目工程的,还是继续用Maven吧,再说OSGI Bundle在打包方面和JAR唯一的区别就是manifest.mf而已,而manifest.mf也是jar本来就有的东西,在OSGI bundle来说,只是内容上多加了几个小项而已。于是继续沿用原来的一套,拿个maven-jar-plugin插件在pom.xml里维护manifest项。

      接着就是尝试编码,直接写个BundleActivator的实现了,实现start和stop方法,只是往里面写个System.out.println Balabala...。mvn package生成一个bundle。扔到<karaf-root>/deploy文件夹下,运行<karaf-root>/bin/karaf.bat或<karaf-root>/bin/karaf.sh,console出现Balabala......。尝试着stop/start bundle,看着不断Balabala...。

     之后,就尝试一个bundle A在manifest.mf里export package,然后另一个bundle B在manifest.mf里import package,然后写代码用bundle A中的类创建个实例,并调用方法。扔karaf里运行之,还正常。尝试不同次序地stop/start这两个bundle,

     接着就尝试在Activator的start方法里,用BundleContext的registerService发布一个OSGI Service。也正常,在karaf console里用命令ls <bundle-id>,可以列出发布出来的服务。

    再接着尝试在另一个bundle里的Activator的start方法里,用BundleContext的getServiceReference方法引用刚才那个OSGI Service。也正常,可以引用并调用服务方法。

    So far so good!

   尝试不同次序地stop/start这两个bundle,问题出现了:服务引用那里会有返回null的情况,噩梦开始了。
  
   由于bundle启动的次序不确定,发布service的bundle可能会比引用service的bundle启动得晚。就会出现引用的服务为null。

   刚开始,我是通过在引用service的bundle的manifest里,添加import package来依赖发布service的bundle,这样当发布者未active时,引用者就不会resolved,所以,就曲线式决定了bundle的启动先后。但这是个坏实践。

  后来就采用ServiceListener或ServiceTracker的方式来引用服务,这样,服务就不再依赖bundle的启动次序了。但还有个致命的缺点----要写大量的代码。

  于是开始找DI的解决方案,刚开始选择了Declarative Service(DS),在felix项目下,有Service Component Runtime(SCR)的bundle可以支持Declarative Service,在manifest里用Service-Component项指定一个DS的XML文档,这个文档描述了服务及其组装关系。当bundle启动后,SCR bundle就读取该XML文档,解析并按文档组装起应用,如果某些服务未可用的话,就会延后到服务可用时再完成组装。这个过程完全由SCR bundle来管理。我们就不需要写ServiceListener或ServiceTracker来组装应用了,节省了大量的精力。

   再后来,又发现了更好的Blueprint的DI方案,于是就转向用Blueprint来取代Declarative Service,实现应用的组装。

  到此为止,系统还只是在单一个平台上运作,而我做的系统偏偏是由几个系统来组成的分布式的系统,于是继续找分布式的解决方案,于是又尝试ROSGI(这个开源项目已没有继续维护更新了)、接着CXF DOSGI,CXF DOSGI是可用,但发布的singlebundle版本太大(什么依赖都集成进去了),multiplebundle版本要剪裁,还存在一些和我自己用的某些bundle的版本冲突问题(这个也令我意识到import和export package时指定版本号及bundle版本管理的重要性,以后有空再聊聊这个问题)。所以cxf dosgi用了一段时间后,决定采用消息中间件来负责分布式系统间通讯的架构。

   在cxf dosgi里,osgi service可以跨framework地互相调用,但服务对应的API bundle就需要在关联的系统中各运行一个。采用消息中间件后,就不需要在不同的系统间共享API了,消息所在的队列、主题及消息本身的消息头,甚至消息体都隐式地定义了API,再加上消息的异步和同步的机制,使消息中间件的应用进一步增强了每个子系统的内聚,使子系统间的耦合更加松散。

   很“巧合”的是,Apache有个Servicemix的顶级开源项目,这个Servicemix和karaf的渊源十分深厚----karaf就是servicemix项目的内核独立分离出来的一个开源项目,所以,将所有以前开发的bundle移植到servicemix上,不费吹灰之力。Servicemix集成了ActiveMQ,于是Servicemix就成了我用来实现用消息中间件取代cxf dosgi方式的首选。

   上了Servicemix,自然就会用上了它集成的Camel,Camel强大的企业集成能力,将系统提升到面向服务的ESB层面了。

    既然上了SOA的贼船,就要想想将业务的规则和流程提炼出来,借助规则引擎或工作流引擎来实现,这是一条分支,暂时放下,日后再提。

    继续OSGI方面,在camel的支持下,无状态的服务纷纷被提炼出来,成为全系统通用的服务,而这些服务可以由众多细粒度的osgi服务来组装而成。服务采用消息处理器的方式实现,在对外的接口方面,则借助ESB来实现,要什么接口,就用什么Camel Component,这些Component都是现成的。至于消息路由,还是用那个用惯了的Blueprint吧:在Camel的命名空间(http://camel.apache.org/schema/blueprint)直接在CamelContext节点中定义消息路由。

    无状态的服务好解决,那么业务逻辑相关的有状态的部分怎么办呢?除了刚才提到的用规则引擎和工作流引擎外,Camel的消息处理器可以负责这部分的工作,具体的细节怎么做?我还要学习学习。

    讲了这么多,似乎还没有涉及到企业应用方面的东西,例如:持久化、事务(包括分布式事务)、Web等等。但还是暂时打住,分支太多了,这条裹脚(国脚)布也够长了。
5
0
分享到:
评论
9 楼 3gwind 2013-11-15  
楼主没有采用Eclipse 系 Equinox 的Virgo等的原因是什么 ,我最近才开始花时间学习OSGI,在选择上有些不解应该采用哪种方案,是Apache 还是 Eclipse。不知道楼主当时是如何选择的。
多谢
8 楼 buffering 2013-06-15  
学到东西了,希望楼主一直更新。
7 楼 baso4233 2013-04-16  
刚开始了解OSGi
6 楼 Kevin_jiang2011 2013-02-26  
菜鸟向楼主学习。
5 楼 killko 2013-02-21  
MrCrapBag 写道
能否放一些代码上来看看


http://killko.iteye.com/blog/1797364
4 楼 duduppp 2013-02-21  
搜到你这里来了,铜丝天涯沦落人
3 楼 killko 2013-02-21  
MrCrapBag 写道
楼主写的很好,最近正好也在看这个,一起学习一下

一起学习
2 楼 MrCrapBag 2013-02-19  
能否放一些代码上来看看
1 楼 MrCrapBag 2013-02-19  
楼主写的很好,最近正好也在看这个,一起学习一下

相关推荐

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    用Python分析文本数据项目

    用Python分析文本数据项目

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    AshampooUnInstaller v15.00.22 Portable一款强大的卸载工具,彻底、智能著称阿香婆强制卸载软件.rar

    阿香婆软件强制卸载软件 Ashampoo UnInstaller 是一款强大的卸载工具,彻底、智能著称,如果您选择使用Ashampoo安装程序,它会自动分析软件从开始安装到结束的全过程,并为该软件建立一个日志,以便以后更彻底的卸载它,Ashampoo UnInstaller 全面提速!程序采用了新的技术,速度得到了全面提高。Windows 默认应用现在也可以像其它无用程序和恶意软件一样被无忧卸载。摆脱工具栏、插件和其它隐藏的追踪软件,享受安全快捷的上网体验!新的快照比较功能,可以非常简单的创建安装日志,这是旧版本 UnInstaller 粉丝最急需的!新的界面,便捷的批量卸载,以及内置的在线搜索,Ashampoo UnInstaller 一定会让你惊叹无比。快来体验更清晰、更详尽、更快速的 Ashampoo UnInstaller !Ashampoo UnInstallerAshampoo UnInstaller彻底删除无用程序的所有痕迹! 让安装、试用、卸载程序更加轻松。只需点几下,无用的软件、浏览器扩展和工具栏就能从你的硬盘中

    基于java的公交车信息管理系统开题报告.docx

    基于java的公交车信息管理系统开题报告

    基于java的网络书店系统的开题报告.docx

    基于java的网络书店系统的开题报告

    forge-1.20.1-47.3.0-installer.jar

    forge-1.20.1-47.3.0-installer

    实例-文本进度条源代码

    python

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    网络安全教程:基础知识到高级概念全面解读

    内容概要:本文详细介绍了网络安全领域的基础知识和高级概念,涵盖了网络安全概述、网络架构与协议、操作系统安全、网络攻击与防御、密码学与安全协议、身份认证与访问控制、系统漏洞与补丁管理、网络安全实践及发展趋势与挑战等内容。 适合人群:信息安全专业人员、IT运维人员、网络安全工程师、系统管理员。 使用场景及目标:本文不仅帮助读者理解网络安全的理论知识,还能指导实际操作,适用于日常网络安全管理和应急响应。目标在于增强个人和企业对网络安全的认识,提升防护能力。 其他说明:网络安全是一个不断发展变化的领域,文中提到的内容和技术应及时跟进最新的发展动态,确保网络安全的有效性。

    java毕设项目之基于SpringBoot的特殊儿童家长教育能力提升平台(源码+说明文档+mysql).zip

    环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目经过测试均可完美运行

    精选微信小程序源码:仿京东白条小程序(含源码+源码导入视频教程&文档教程,亲测可用)

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的应用服务。"京东白条"是京东金融推出的一种信用消费产品,用户可以在京东商城购物时享受先消费后付款的便利。这款"微信小程序京东白条小程序源码"包含了实现这一功能的小程序源代码,以及相应的导入教程,对于开发者来说,是一个有价值的参考资料。 源码是程序开发的基础,它包含了开发者编写的控制程序行为的指令。在这个案例中,源码可能包括了与京东白条接口交互的逻辑,用户界面设计,以及数据处理等功能。通过分析这些源码,开发者可以学习如何集成京东的API,实现白条的查询、支付和管理等操作。 "源码导入视频教程"和"源码导入文档教程"是辅助开发者理解和使用源码的重要资料。视频教程通常以直观的方式展示源码的导入步骤和环境配置,帮助开发者快速上手。文档教程则可能包含了详细的步骤说明,解决常见问题的技巧,以及开发过程中的注意事项,对于初学者来说尤其有价值。 微信小程序的开发涉及到以下几个关键技术点: 1. **WXML(Weixin Markup Language)**:这是微信小程序的视图层语言,

    数字孪生赋能智慧城市大脑建设方案PPT(65页).pptx

    市大脑的基础平台是支撑其高效运行的关键。该平台通过整合电子政务网、视联网、互联网等多网资源,以及云计算、大数据、人工智能等先进技术,打造了一个统一、开放、可扩展的底层架构。在这个基础上,城市大脑能够接入海量数据,包括但不限于视频监控、交通流量、环境监测、民生服务等领域的实时数据,并进行高效处理和分析。这些数据经过清洗、转换、开发后,形成了丰富的数据资源池,为城市治理提供了坚实的数据支撑。 在数据资源的基础上,智慧城市大脑进一步构建了算法服务平台和融合业务应用系统。算法服务平台集成了多种先进的视频分析算法和人工智能算法,如人脸识别、车辆识别、城市问题智能识别等,这些算法能够实时分析视频流和数据流,快速识别城市运行中的问题和异常。同时,融合业务应用系统则将这些算法与城市治理的各个领域相结合,如交通、环保、旅游、医疗等,形成了多个具有实战价值的应用场景。例如,在交通领域,城市大脑能够通过实时分析交通流量和路况信息,优化信号灯控制策略,缓解交通拥堵;在环保领域,则能够实时监测空气质量和水质情况,及时预警环境污染事件。 数字驾驶舱是智慧城市大脑的又一亮点。它作为城市治理能力现代化的新抓手,实现了数据一屏展示、指标一屏分析、指挥一屏联动、场景一屏闭环和治理一屏透视。通过数字驾驶舱,决策者可以直观地看到城市运行的全貌,及时获取关键信息,做出准确的判断和决策。同时,数字驾驶舱还能够根据用户的需求进行个性化配置,提供多种数据处理和分析工具,帮助用户深入挖掘数据价值,提升城市治理的精细化和智能化水平。 智慧城市大脑的建设成效显著。它不仅提高了城市治理的效率和准确性,还带来了显著的社会效益和经济效益。通过优化资源配置、降低运营成本、提升服务质量等方式,智慧城市大脑为城市居民提供了更加便捷、高效、舒适的生活环境。同时,它也为城市的可持续发展注入了新的动力,推动了产业升级和经济转型。可以说,智慧城市大脑已经成为了未来城市发展的重要方向和趋势,它将引领我们走向一个更加智慧、绿色、宜居的城市新时代。 总的来说,智慧城市大脑是一个集数据、算法、应用为一体的综合性解决方案,它通过高度集成和智能分析,实现了城市治理的精细化和智能化。在未来的发展中,随着技术的不断进步和应用场景的不断拓展,智慧城市大脑将会发挥出更加巨大的潜力和价值,为城市的可持续发展和社会的全面进步做出更大的贡献。

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    上传一个考研冲刺资源dssdf

    上传一个【考研冲刺】资源

    C0858 手机之家(1页).Zip

    C0858 手机之家(1页).Zip

Global site tag (gtag.js) - Google Analytics