首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

基于osgi开发特大型的企业应用

2012-11-01 
基于osgi开发大型的企业应用前端时间认真的学习了一下osgi相关的知识,个人感觉是非常的不错。但是看了一下

基于osgi开发大型的企业应用
    前端时间认真的学习了一下osgi相关的知识,个人感觉是非常的不错。

    但是看了一下目前osgi的时候,几个成功案例都是基于osgi开发ide,比如eclipse之类。还没有看到用于企业应用的成功案例,是osgi不适合开发企业应用?还是说,目前没有人这样开始使用osgi?或者只是我孤陋寡闻,其实大家已经用开了?

    顺便说明一下为什么有这种的疑问,这个要冲java开发application的方式说起,我接触过的无非是两种:

    1. 简单的j2se的application
        就是自己写代码,编译打包,然后写一个命令行脚本或者shell,通过java 和main class启动java进程,里面爱干嘛干嘛。
        好处是简单,小巧,灵活,没有额外的负载。缺点嘛,没有模块化的支持,想安装,卸载,启动,停止,更新其中部分功能时,完全没辙,只能整个退出,更新之后重启启动。不过对于小程序倒不是问题,大型系统就不大可能了。
        这个是轻量级的解决方法。

    2. 大而全的app server
        这个就是标准的j2ee,weblogic,glassfish,jboss之类的都是了,提供标准的j2ee容器,完整的j2ee支持,诸如ejb之类,总之什么都有了。自己写代码,打包为app,通过ear,war等方式发布,对其中的任何一个app,安装,卸载,启动,停止都是可以通过控制台搞定的。
        很强大,但是很“重“,非常的重,像我在的团队,目前开发的东东,启动起来什么不跑就吃了1g内存......
        这个方案会带来一个问题,当模块被打包在不同ear中时,无法使用java的方法调用,只能通过ejb,或者自己开端口等方式进行远程调用。效率方面不好,而且感觉也挺傻的:同一个机器同一个进程,彼此直接访问还要走远程......在weblogic上可以通过将功能模块打包在同一个ear中,开启 ejb的local call优化为本地访问,但是限制是只能在一个ear中,这又破坏了模块化。
      
    从个人爱好和经历来说,我喜欢第一种方式的轻巧,比较讨厌2的笨重。但是1的缺点也很明显,当程序大到一定程度,功能模块越来越多的情况下,就不适用了。上面的例子,那个启动就吃1g内存的家伙,它的java project现在都超过200个了,可以想象有多大吗?如果用1的方式来开发,根本不可能啊。

    再有就是个人审美观的问题,我这个人生性比较反感庞大而复杂的东西,可以说j2ee 容器/ejb(尤其是ejb3.0以前)是完全违背我的美感的,虽然我现在靠这个吃饭,恩,似乎有点偏激......

    所以现在想看看有没有第三条路可以走(恩,当然工作方面2是肯定无法避免的了),我自己现在想到解决方案就是基于osgi,将不同的功能模块划分为不同的 bundle(当然可以继续按照service细分)。这就避免了1原有的最大不足:无法划分模块来适用和管理,同时也绕开了app server这个大块头。

    稍后准备按照这个思路来开发一个application来练练手,试试可行性如何。比较看好这个思路的前景,但是目前没有信心,呵呵,主要是没有看到类似的案例,不知道该怎么着手,更别提什么最佳实践之类的可供参考。

    颇有摸石头过河的感觉,有朋友可以帮忙指点一二吗?网上可以找到的osgi的内容,基本都停留在简单介绍和高度评价上,没有找到实际的可供参考的东西。哪位同学如有osgi方面的知识请不吝赐教,不胜感激啊!

    非常有诚意的希望能有人和我一起深入探讨这个话题,无论是赞成还是反对.

ps: 因为在标题中有“请教”的字眼,被自动转移到问答频道了。我想了一下,我发这个帖子的主要目的还是为了可以找人讨论,而不是一个简单的问答。因此厚颜将请教二字从标题中去除后再发贴一次,

    





老兄,service定义bundle在哪里,你这样做common bundle怎么能够热插拔?




老兄,service定义bundle在哪里,你这样做common bundle怎么能够热插拔?



对于热拔插的支持,我个人感觉在business bundle这个层面上比较有可能有需求,对于common bundle,似乎实际意义不大。

打个比方说,有一个短信网关之类的应用,在business层面上,增加,卸载或更新某个业务能力是可能的,比如对smpp sms模块的更新,增加一个rest方式的sms模块,这个热拔插请求是比较合理的。对于common层,我不大理解为什么需要热拔插?比如说从提供datasource的bundle,难道是从mysql数据库切换到oracle?我对这块的需求和背景不大了解,pufan同学能否简单的介绍一下你遇到的场景:在类似我图中的common bundle的功能模块中,需要实现热拔插。这可以帮助我理解,谢谢!



老兄,service定义bundle在哪里,你这样做common bundle怎么能够热插拔?



对于热拔插的支持,我个人感觉在business bundle这个层面上比较有可能有需求,对于common bundle,似乎实际意义不大。

打个比方说,有一个短信网关之类的应用,在business层面上,增加,卸载或更新某个业务能力是可能的,比如对smpp sms模块的更新,增加一个rest方式的sms模块,这个热拔插请求是比较合理的。对于common层,我不大理解为什么需要热拔插?比如说从提供datasource的bundle,难道是从mysql数据库切换到oracle?我对这块的需求和背景不大了解,pufan同学能否简单的介绍一下你遇到的场景:在类似我图中的common bundle的功能模块中,需要实现热拔插。这可以帮助我理解,谢谢!


很常见的需求,举几个例子:
DB bundle:更换数据库连接池大小、更改连接参数
Log bundle:更改log级别
Cache bundle:停用或启用cache,甚至从本地cache无缝切换到远程cache。
等等

用osgi最大的思想转变就是活用service,要注意这个‘活’字,不但要面向接口设计,更要充分利用osgi框架的service依赖及查找特性进行whiteboard pattern设计,那时你就会发现开发速度达到甚至超越传统框架也并不是不无可能的了。 73 楼 skydream 2010-02-09   DB bundle:更换数据库连接池大小、更改连接参数
Log bundle:更改log级别
Cache bundle:停用或启用cache,甚至从本地cache无缝切换到远程cache。

我怎么感觉这几个需求,不是只有通过热拔插才能完成。如果这几个模块设计的好,完全可以做到runtime 的动态配置。当然热拔插相当于推倒重来,做起来更简单一些。 74 楼 pufan 2010-02-09   更普遍的需求就是版本升级,当然这也是所有bundle的共有需求。

理论上来说,任何需求都不一定要热插拔,当然这也要求你的代码设计的“更好”。 75 楼 liu_swei 2010-02-21   jnn 写道liu_swei 写道jnn 写道liu_swei 写道目前国外很多开源的应用服务器都开始转向osgi了,比如:glassfish、jonas、geronimo、spring-dm、spring-osgi、pax-web等,我们目前做的是开发微内核集成框架,用的内核是karaf,karaf是felix的子项目,项目是开源的,大家感兴趣可以申请加入来为国产中间件做一份贡献:
http://www.trustie.net/projects/project/show/loong

不知道你们在Karaf基础上做了哪些改进,我们公司的Fuse ESB也是基于Karaf的,有空可以聊一聊。


我们重构了声明式服务,重构了日志服务,重构了热部署,定义了部署框架,现在可以部署war包,还可以随时扩展新的部署器、定义了协议处理器框架,定义了web容器框架同时集成了tomcat和jetty,并开发了dservice容器、集成opensso、集成数据源事物等等,下一步要重构karaf的内核
目前我们开源的只是微内核框架,以后会陆续开源所有的源码!

不知道你说的重构主要做了那方面的工作。
据我所知你上面提到的大部分功能 都是由karaf是通过pax-xxx 来实现的。
dservice容器、集成opensso、集成数据源事物, 这几个功能到是有点意思。

我现在有个问题就是如果Karaf升级了,你们的微内核框架需要做多大的修改才能使用新版本的Karaf.


呵呵,我们的重构更多的是功能上的,至于karaf内核,我们正准备重写它的内核
这样就不必依赖于它了,至于集成的jetty我们最初采用的的确是pax-web的,后来为了集成tomcat我们自己定一个了web容器框架,并重新集成了jetty,已经完全和pax-web无关了。

热点排行