Ufida design-chijianqiang-qcon

900 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
900
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ufida design-chijianqiang-qcon

  1. 1. 企业级软件的组件化和动态化开发实践 池建强--@sagacity 用友集团-瑞友科技-IT应用研究院 www.ufida.com www.rayootech.com11年4月2日星期六
  2. 2. 大纲 ‣ 软件开发之殇 ‣ 组件化与动态化 ‣ 基于WTP Facet、XDoclet、ANT的组件构建 ‣ OSGi——兄弟,全靠你了 ‣ 展望:所有的Java应用都是Bundle11年4月2日星期六
  3. 3. 现代人类文明运行于软件之上, 而软件的构建过程却隐于黑暗里,多 少青春的日子耗费在了软件的缺陷上11年4月2日星期六
  4. 4. 从软件系统诞生 之初,程序员们就 开始梦想有一天能 够像建造桥梁和房 屋那样“透明”的构 造软件,实现“即插 即用”的软件系统11年4月2日星期六
  5. 5. 但是到目前为 止,软件的开发依 然让我们倍感挫 折,失败的软件项 目有增无减,我们 还在路上11年4月2日星期六
  6. 6. 但是到目前为 止,软件的开发依 然让我们倍感挫 折,失败的软件项 目有增无减,我们 还在路上11年4月2日星期六
  7. 7. 组件化的技术让我们更加接近真理之门11年4月2日星期六
  8. 8. 组件化的技术让我们更加接近真理之门 OSGi?11年4月2日星期六
  9. 9. 组件化与动态化 ‣ 组件化 ‣ 动态化 ‣ 完整的业务逻辑单元 ‣ 动态的改变组件的状态 ‣ 解决某一方面的问题 ‣ 动态的改变数据和数据结构 ‣ 每个组件可以独立开发 ‣ 动态的修改业务流程 ‣ 实现组织级复用 ‣ 动态的调整业务规则 ‣ 按需分配 ‣ 动态的分配资源 ‣ 动态的安装启动停止卸载 ‣ 动态的计算11年4月2日星期六
  10. 10. Metadata 组件化与动态化 Workflow ‣ 组件化 ‣ 动态化 RuleEngine ‣ 完整的业务逻辑单元 ‣ 动态的改变组件的状态 ‣ 解决某一方面的问题 ‣ 动态的改变数据和数据结构 ‣ 每个组件可以独立开发 ‣ 动态的修改业务流程 ‣ 实现组织级复用 ‣ 动态的调整业务规则 ‣ 按需分配 ‣ 动态的分配资源 ‣ 动态的安装启动停止卸载 ‣ 动态的计算 Component Building11年4月2日星期六
  11. 11. 企业级软件开发遇到的挑战 ‣ 组织级复用 ‣ 不是复制粘贴,不是简单的代码、接口或算法的复用 ‣ 没人愿意编写重复代码 ‣ 复用是永远的痛——200个表的故事 ‣ 组件的管理 ‣ 组件的独立开发 ‣ 组件的依赖关系 ‣ 自动构建——机器的活得让机器干11年4月2日星期六
  12. 12. 我们遇到的... 电子商务平台 ERP业务平台 Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork11年4月2日星期六
  13. 13. 我们遇到的... 电子商务平台 ERP业务平台 Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork11年4月2日星期六
  14. 14. 我们遇到的... 电子商务平台 ERP业务平台 Here you are! Flex 银企直联平台 报表 AJAX 组 织 规则引擎 任务调度 数 接 权 工 据 口 限 作 字 服 业务日志 流 典 务 引 管 擎 消息 全文检索 理 Main FrameWork11年4月2日星期六
  15. 15. 我们希望的... Flex AJAX 电子商务平台 消息 监控 银企直联平台 ERP业务平台 预警 短信 接 报表 规则引擎 组 工 数 口 织 作 据 服 权 流 字 务 业务日志 任务调度 引 限 典 管 擎 理 消息 全文检索 GAP-API Main FrameWork11年4月2日星期六
  16. 16. 开发实践 ‣ Eclipse WTP Facets ‣ XDoclet ‣ Ant ‣ 为什么当时没有采用OSGi ‣ 资源文件的处理 ‣ Servlet容器的支持 ‣ 持久化、事务11年4月2日星期六
  17. 17. Eclipse WTP Facets ‣ 提供了优秀的扩展机制 ‣ 对WTP(Web Tools Platform)平台进行扩展 ‣ 创建WTP项目时增加自定义的组件 ‣ 提供组件的依赖关系和多版本管理 ‣ Facets允许开发人员以组件集成的方式来创建项目,像搭积木一 样把各种组件进行组合并完成最终构建,是面向组件开发的一 种实现机制 ‣ Facets不提供运行时组件生命周期的管理11年4月2日星期六
  18. 18. 核心的WTP Faceted包括以下内容: id versions requires conflicts jst.java 1.3, 1.4, 1.5, 1.6 jst.ear jst.web 2.2, 2.3, 2.4 jst.java jst.ear, jst.ejb jst.ear 1.2, 1.3, 1.4, 5.0, 6.0 jst.java jst.ejb 1.1, 2.0, 2.1, 3.0, 3.1 jst.java jst.ear, jst.java11年4月2日星期六
  19. 19. 核心的WTP Faceted包括以下内容: id versions requires conflicts jst.java 1.3, 1.4, 1.5, 1.6 jst.ear jst.web 2.2, 2.3, 2.4 jst.java jst.ear, jst.ejb jst.ear 1.2, 1.3, 1.4, 5.0, 6.0 jst.java jst.ejb 1.1, 2.0, 2.1, 3.0, 3.1 jst.java jst.ear, jst.java11年4月2日星期六
  20. 20. 创建一个标准的Dynamic Web Project11年4月2日星期六
  21. 21. 创建一个标准的Dynamic Web Project Facets11年4月2日星期六
  22. 22. XDoclet & Ant ‣ XDoclet:优秀的文本处理和构建工具 ‣ 资源文件处理、Merge Point ‣ Ant: 历史悠久的构建脚本工具 ‣ 独立组件构建 ‣ 整体构建 ‣ Facets Ant XDoclet11年4月2日星期六
  23. 23. 组件化开发实践 ‣ 各组件独立开发,独立构建(build.xml) ‣ 公共资源文件处理-MergePoint(i18n,oid,spring,include) ‣ 整体构建(TotalBuild) ‣ 基于Facet机制装配组件11年4月2日星期六
  24. 24. 实际效果11年4月2日星期六
  25. 25. 实际效果 TotalBuild11年4月2日星期六
  26. 26. 实际效果 TotalBuild11年4月2日星期六
  27. 27. 实际效果 TotalBuild Facets11年4月2日星期六
  28. 28. 开始实践之旅 ‣ 各组件独立研发,依赖框架,依赖接口 ‣ 编写自己的build.xml,实现clean compile jar distribution db merge resource ‣ 在组件项目的根目录下执行ant src webModule ‣ 构建出统一目录结构的Distribution11年4月2日星期六
  29. 29. 公共资源文件处理(Merge) ‣ 建立公共模板文件,文件后缀设置为xdt ‣ applicationContext.xdt------------spring ‣ global.xdt---------------------------include global.jsp ‣ web.xdt-----------------------------web.xml ‣ ...... ‣ 设置Merge Point <XDtMerge:merge file="workflow-hbm.data"></XDtMerge:merge>11年4月2日星期六
  30. 30. Merge文件的内容 <value>gap/wf/persistent/db/bo/GapwfProcessinstance.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfActivityinstance.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfActivityinstancepre.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfRevelantdata.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfWorkitem.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfWorkitemdata.hbm.xml</value> <value>gap/wf/persistent/db/bo/GapwfDynprocessrelation.hbm.xml</value> db merge resource src webModule11年4月2日星期六
  31. 31. XDoclet构建 <path id="xdoclet.classpath"> <fileset dir="${lib.dir}"> <include name="*.jar"/> ‣ 设置XDoclet的classpath </fileset> <pathelement location="classes"/> ‣ 设置Ant的taskdef </path> ‣ 定义target <taskdef name="xdoclet" classname="xdoclet.DocletTask" classpathref="xdoclet.classpath" /> <target name="gen-applicationContext.xml"> <xdoclet destdir="${webmodule.dir}/WEB-INF/conf/applicationContext" force=true mergedir="${merge.dir}"> <fileset dir="${source.dir}" includes="**/*.java" /> <template templateFile="template/applicationContext.xdt" destinationfile="applicationContext.xml" /> </xdoclet> </target>11年4月2日星期六
  32. 32. TotalBuild ‣ 构建Facets项目所需要的组件内容 <!--调用各个组件的build.xml--> <target name="build"> <ant dir="${gap-api}" antfile="build.xml" target="all" /> <ant dir="${venus-frame}" antfile="build.xml" target="all" /> <ant dir="${venus-page}" antfile="build.xml" target="all" /> <ant dir="${venus-log}" antfile="build.xml" target="all" /> ...... </target> <!--重命名--> <target name="plugin"> <available file="Templates" type="dir" property="Templates.present" /> <antcall target="clean" /> <move todir="Templates/0. 主程序框架"> <fileset dir="${gap-api}/dist" /> <fileset dir="${venus-frame}/dist" /> </move> ...... </target>11年4月2日星期六
  33. 33. 构建我们自己的Facet ‣ 创建基于org.eclipse.ui.newWizards的扩展点 ‣ 设置category和wizard,实现独立的项目向导11年4月2日星期六
  34. 34. 核心扩展点 ‣ org.eclipse.wst.common.project.facet.core.facets ‣ <category />——Facet的类别 ‣ <project-facet />——Facet的属性描述 ‣ <project-facet-version />——Facet的版本处理 ‣ <template />——设置必选的Facet ‣ <preset />——预置Facet集合 辅助扩展点——增加图标和向导页面 ‣ org.eclipse.wst.common.project.facet.ui.images ‣ org.eclipse.wst.common.project.facet.ui.wizard11年4月2日星期六
  35. 35. Facet的核心配置 <!--Facet的基础信息配置--> <project-facet id="gap.mainframe"> <label>0. 主程序框架</label> <description>GAP平台的基础框架</description> <category>gap.category</category> </project-facet> <!--设置Facet的某个版本的相关信息(安装代理类,约束等)--> <project-facet-version facet="gap.mainframe" version="3.7"> <action id="gap.mainframe.install" type="INSTALL"> <delegate class="venus.tools.ide.facet.GAPFacetInstallDelegate"/> </action> <constraint> <requires facet="jst.web" version="[2.4"/> </constraint> </project-facet-version>11年4月2日星期六
  36. 36. Facet的两个代理类 ‣ 实现接口:org.eclipse.wst.common.project.facet.core.IDelegate ‣ GAPFacetInstallDelegate:负责负责所有实体Facet的安装 ‣ BuildFacetsDelegate: ‣ 虚拟Facet,在所有实体Facet安装完成后调用 ‣ 负责Facet的装配策略 ‣ 创建配置文件、驱动XDoclet进行文件合并、设置classpath ‣ 创建project的nature(.tomcatplugin) ‣ 删除不需要的文件11年4月2日星期六
  37. 37. 解决了哪些问题 ‣ 组件的独立开发 ‣ 组件的组合与依赖关系 ‣ 组件版本管理 ‣ 按需分配 ‣ 最终实现了组织级别的复用11年4月2日星期六
  38. 38. 遗留问题 ‣ 能装不能拆,无法实现物理隔离 ‣ 独立jar包的版本冲突 ‣ 运行时动态的生命周期管理(Install、Update、Remove) ‣ Time For:11年4月2日星期六
  39. 39. 遗留问题 ‣ 能装不能拆,无法实现物理隔离 ‣ 独立jar包的版本冲突 ‣ Time For: 运行时动态的生命周期管理(Install、Update、Remove) ‣ Time For: O Gi11年4月2日星期六
  40. 40. OSGi ‣ 天将降大任 ‣ 2005,R4.0发布——最好的年代,也是最坏的年代 ‣ 2010年3月,OSGi企业级规范4.2正式发布 ‣ 世界是你的,也是我的,归根结底应该是由Bundle构建的 ‣ 完美的解决方案11年4月2日星期六
  41. 41. update install refresh INSTALLED STARTING resolve update start refresh RESOLVED ACTIVE stop uninstall uninstall stop UNINSTALLED STOPPING11年4月2日星期六
  42. 42. OSGi 企业级特性 ‣ 声明式服务(Declarative Services) ‣ 框架加载(Framework Launching) ‣ Blueprint服务(Blueprint Service) ‣ Web应用(Web Application Bundle) ‣ 远程服务 日志服务 JPA JTA JDBC......11年4月2日星期六
  43. 43. OSGi 企业级特性 ‣ 声明式服务(Declarative Services) ‣ 框架加载(Framework Launching) ‣ Blueprint服务(Blueprint Service) ‣ Web应用(Web Application Bundle) ‣ 远程服务 日志服务 JPA JTA JDBC......11年4月2日星期六
  44. 44. 声明式服务 ‣ Service Component Model ‣ 通过声明的方式实现OSGi服务的发布、查找和绑定 ‣ 通过xml的方式定义Component和Service ‣ 引用服务和提供服务都以接口的方式定义 ‣ 允许以纯Java POJO的方式开发组件,不依赖OSGi框架 ‣ 更容易测试和模拟11年4月2日星期六
  45. 45. 声明式服务——提供服务和消费服务 ‣ 在Bundle的Manifest中定义一个或多个组件文件 Bundle-ManifestVersion: 2 ... Service-Component: OSGI-INF/component.xml [, ...]* ‣ 在OSGI-INF/目录下编写组件文件 <?xml version="1.0" encoding="UTF-8"?> <scr:component name="bookstore-order" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> <!--该组件的实现类--> <implementation class="com.osgi.ds.OrderService"/> <!--提供的服务--> <service><provide interface="com.osgi.ds.IOrder"/></service> <!--消费的服务--> <reference interface="com.osgi.ds.ICart" bind="setCart" unbind="unsetCart" policy="dynamic" cardinality="1..1"/> </scr:component>11年4月2日星期六
  46. 46. 声明式服务——组件的生命周期 ‣ Enabled——组件的启动 ‣ Satisfied——满足组件的配置信息 ‣ Immediate Component——立即激活组件 ‣ Delayed Component——延迟加载组件 ‣ Factory Component——工厂组件11年4月2日星期六
  47. 47. <=>%42.*%0$1-.*$0%*+$%#(45("$"*%#(")-120&*-("%&.%&%.$09-#$%-"%*+$%.$09-#$%0$1-.*0%& *+$%#(45("$"*%#(")-120&*-("7%?+$%.$09-#$%50(5$0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%() 50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/0,12),%&)#%("%5&1$ @AB7 ?+$%.*&*$%/-&10&4%-.%.+(:"%-"%C-120$%@@D7D7% 声明式服务——组件的生命周期 3&4!,)/55676 899)*&$%)/:1921")"%/:1"(&4!,$%&1" )(+=,*>+,( 6789:&8;&<3 ‣ Enabled——组件的启动 B&)/0&2 2,-$2.$&C B&)/0&2 Satisfied——满足组件的配置信息 D62,-$2.$&C ‣ +=,*>+,( $.%CA6,0$)E 9.:&?< !"#$"%&%()*+&(!,-.&( /&-.010*2&(3&12*-&4(3$&-*+*-0*"%(5& &B$6C$69 ‣ Immediate Component——立即激活组件 !"#$%&#&()*+&#(&,*$&(&-#./#0#+12314&4$#+14"*,5(0$*14#.&+12&#545&-#.&+05&#$%&(&#0(&#4 .54-6&#5*4,#*$7#$%&4#89:#%156-#-&0+$*)0$&#$%0$#+12314&4$#+14"*,5(0$*14;#<%*#0661=#89 !!"#$#2 3(4+5()-./0/1(1,- ‣ Delayed Component——延迟加载组件 2&4$0$*14#$1#&0,&(6/#(&+60*2#0+$*)0$&-#+12314&4$#+14"*,5(0$*14; 8%E$%&**0-62*$%()%&%/$,&$/%#(45("$"*%-.%*+$%/$,&-"1%()%#,&..%,(&/-"1%&"/%(6F$#*%#0$ !"#$%&(()*+ *+$%&#*-9&*-("%()%&%/$,&$/%#(45("$"*%#(")-120&*-("%/($.%"(*%(##20%2"*-,%*+$0$%-.%& ,&-./&0123425&561257"#$%.6"25 ‣ Factory Component——工厂组件 )(0%&%.$09-#$%(6F$#*7%8%#(45("$"*%-.%&%/$,&$/%#(45("$"*%:+$"%-*%.5$#-)-$.%&%.$09-#$ *(0%#(45("$"*%&"/%/($.%"(*%+&9$%*+$%!""#$!%&#%&**0-62*$%()%*+$%(")(*#*&%$,$4 <1&(:;&(1 2345674%789 <=>%42.*%0$1-.*$0%&%.$09-#$%&)*$0%*+$%#(45("$"*%#(")-120&*-("%6$#(4$.%.&*-.)-$/7%? *+-.%.$09-#$%42.*%,((E%*(%(6.$09$0.%()%*+$%.$09-#$%0$1-.*0%&.%-)%*+$%#(45("$"*I.%62" B&-"#&4 B&-"#&4 *$0$/%*+-.%.$09-#$7%?+-.%.*0&*$1%4&E$.%-*%5(..-6,$%*(%0$1-.*$0%.$09-#$.%:-*+(2*%#0$&*-" D%40*4+*&C 40*4+*&C )(0%*+$%62"/,$%&"/%,(&/-"1%#,&..$.3%*+$0$6%&,,(:-"1%0$/2#*-("%-"%-"-*-&,-J&*-("%*-4$ 4$4(0%)((*50-"*7 >8?7468>89 D%9& B&-"#&4 4&12*-& D%40*4+*&C K+$"%<=>%0$1-.*$0.%*+$%.$09-#$%("%6$+&,)%()%&%#(45("$"*%#(")-120&*-("3%-*%42.*%&9( 6 9& 4&12*-&+0-"1,E(F77% ,(&/%*(%(##20%)0(4%*+$%#(45("$"*L.%62"/,$7%<=>%#&"%$".20$%*+-.%6%0$1-.*$0-"1%&%-# 4&12*-& "G&1H*4&E(6 (6F$#*%:-*+%*+$%C0&4$:(0E%)(0%*+&*%.$09-#$7%M%0$1-.*$0-"1%&%-#+.!#/%&(+0%(6F$#*3%* &(:;&(1 (6F$#*%-.%"(*%"$$/$/%2"*-,%*+$%-#+.!#/%&(+0%-.%#&,,$/%*(%50(9-/$%*+$%.$09-#$%(6F$#*7% *+(C,%0#*-E 5-67=8 1&B*%C*%9 $0*-$.%)(0%*+-.%0$1-.*0&*-("%#(".-.*%()%*+$%#(45("$"*%50(5$0*-$.%&.%/$)-"$/%-"%+),-&.)/ @AB7 ?+$%&#*-9&*-("%()%&%#(45("$"*%#(")-120&*-("%42.*%6$%/$,&$/%2"*-,%-*.%.$09-#$%-.%0$G11年4月2日星期六
  48. 48. 框架加载 ‣ R4.2提供了一套标准的API用来启动OSGi容器 ‣ 各OSGi框架都需要实现——org.osgi.framework.launch.FrameworkFactory ‣ 允许在容器外启停OSGi框架,例如在web容器中通过listener启动OSGi ‣ 示例代码如下: Class<FrameworkFactory> factoryClass = ServiceLoader.load(FrameworkFactory.class); FrameworkFactory factory = factoryClass.newInstance(); Map<Object, Object> conf; ......//初始化配置信息 Framework framework=factory.newFramework(conf); framework.init(); BundleContext bundleContext = framework.getBundleContext(); ......//安装bundle framework.start();11年4月2日星期六
  49. 49. BluePrint服务 ‣ BluePrint的基础——Spring Dynamic Modules-->Eclipse Gemini ‣ 为OSGi定义了依赖注入(dependency injection)框架 ‣ 处理OSGi服务的动态性 ‣ 与POJO协同工作 ‣ OSGI-INF/blueprint/ <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> ... </blueprint>11年4月2日星期六
  50. 50. 3&45"$,67689 :$0;,(%"5)%5"$ 5&( BluePrint服务——Bean管理器 9 ‣ 创建具有给定参数和属性的 Java 对象的实例 ‣ 管理对象的生命周期 ,+7/&(1 0,.0&,18 ‣ argument, property, scope ‣ 构建方式:className, factoryMethod, factoryComponent !"!#$#" 45&(6 !"#$G#%&2&%&$3.$&$7#&-$/&-&(#$+,$#*#,#-%#2$+-$%"#$$/&.#0&.1..$+-%#3& <bean id="order" class="com.osgi.bs.OrderService" init-method="init" destroy-method="destroy"> 2(3)(#&#0&.1..<$!&70# CBC<C$.-$*&(# BCI$*.5+2#,$&-$.5#5+#9$.3$%"#$# <argument value="1"/> <argument value="2"/> &-2$%"#$/&.#0&.1..$+-%#3&6#<$!"#$%&70#$.-0)$*.5+2#,$&$,1//&)4$%"#$,./ %+.-,$7#%9##-$%"#$2+33##-%$3#&%1#,$&#$2+,61,,#2$+-$0&%#$,#6%+.-,< <property name="Description" value="This is the order"/> </bean> <01/$,67686 :$0;,=0;04$",3$0%5"$ :11,;571&).,)<=&/&(1 >8(1? %&()*&1@1 A&BC,;01;.( "1 45 "16 !"#$+2$.3$&$%.*$011年4月2日星期六 768*"#$ 7#$1-+;1#$+-$%"
  51. 51. BluePrint服务——服务注册 <!--服务注册--> <service id="orderService" interface="com.osgi.bs.IOrderService" ref="order"> <service-properties> <entry key="order.discount" value="0.8"/> </service-properties> </service> <!--实际代码--> OrderService os = new OrderService(1, 2); os.setDescription( "This is the order" ); Hashtable props = new Hashtable(); props.put("order.discount", "0.8"); bundleContext.registerService(com.osgi.bs.OrderService.class.getName(), os, props);11年4月2日星期六
  52. 52. BluePrint服务——服务引用 <!--reference方式--> <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000" availability="optional"/> <bean id="orderClient" class="..."> <property name="order" ref="orderRef"/> </bean> <!--reference-list方式--> <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService" availability="optional"> <reference-listener bind-method="bind" unbind-method="unbind"> <bean class="com.osgi.bs.ReferenceListener"/> </reference-listener> </reference-list>11年4月2日星期六
  53. 53. BluePrint服务——服务引用 <!--reference方式--> <reference id="orderRef" interface="com.osgi.bs.IOrderService" timeout="1000" availability="optional"/> <bean id="orderClient" class="..."> <property name="order" ref="orderRef"/> List中的对象是动态的,会随着匹配到的服 </bean> 务动态增减。 List没有超时属性,而且是只读的。 <!--reference-list方式--> <reference-list id="orderRefs" interface="com.osgi.bs.IOrderService" availability="optional"> <reference-listener bind-method="bind" unbind-method="unbind"> <bean class="com.osgi.bs.ReferenceListener"/> </reference-listener> </reference-list>11年4月2日星期六
  54. 54. BluePrint服务 VS 声明式服务 ‣ 通过不同的方式实现组件和服务的管理 ‣ 声明式服务重点关注快速构建轻量级的组件模型 ‣ BluePrint服务则面向现有的Java开发者构建富组件模型 ‣ R4.0发布DS,R4.2发布BS ‣ 目前DS应用更为广泛,BS则前景广阔11年4月2日星期六
  55. 55. OSGi与Web应用 ‣ 在Web应用中引入OSGi的好处: ✓ Modularity——改进物理和逻辑结构,易于部署和维护 ✓ Lifecycle——动态安装|使用|更新|卸载 ✓ Services——动态解偶和依赖11年4月2日星期六
  56. 56. OSGi与Web应用 ‣ 集成的两种方式: ✓ HttpService ✓ Bridged11年4月2日星期六
  57. 57. tion we have been using in Toast. Bridged—In the Bridged approach, the coding and exposure model same as in Solo, but here the OSGi framework is embedded into a w OSGi与Web应用 Servlets ‣ 集成的两种方式: JSPs ✓ HttpService ✓ Bridged HTTP OSGi Java Figure 19–1 Solo server-side configuration11年4月2日星期六
  58. 58. tion we have been using in Toast. Bridged—In the Bridged approach, the coding and exposure model same as in Solo, but here the OSGi framework is embedded into a w OSGi与Web应用 Servlets ‣ 集成的两种方式: JSPs !"#$$%&()*+,-../00123%0454006%78%972:;0<28=2&:0>4;05?>?00@A>50#! ✓ HttpService ✓ Bridged 19.2 Embedding the Back End in a Web Application HTTP 323 OSGi Servlets Java JSPs Figure 19–1 Solo server-side configuration HTTP Lite HTTP Bridge OSGiEquinox Framework Application Server Figure 19–2 Bridged server-side configuration11年4月2日星期六
  59. 59. 第三种武器——WAB ‣ WAB——Web Application Bundle1.0(R4.2) ‣ 以Bundle形式部署在OSGi框架中,提供Web应用的功能 ‣ 支持Servlet2.5和JSP2.1 Manifest-Version: 1.0 Import-Package: ... ... Bundle-Version: 1.0 Bundle-Name: orderManager Bundle-ClassPath: WEB-INF/lib/commons-logging.jar,WEB-INF/ classes Web-ContextPath: /order Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.osgi.bs.order11年4月2日星期六
  60. 60. Web Bundle Architecture Web Application Bundles Bundles Deploy Bundle Admin Console Bundle Application Server/OSGi Runtime JVM11年4月2日星期六
  61. 61. Web Bundle Architecture Web Application Bundles Bundles Deploy Bundle Admin Console Bundle Application Server/OSGi Runtime JVM11年4月2日星期六
  62. 62. 开源实践 ‣ Equinox——最成熟的OSGi开源实现,Eclipse的插件基础 ‣ Gemini (Spring DM)——实现了R4.2中的企业级规范 ‣ Virgo (Spring DM Server)——基于OSGi的Application Server ‣ Felix——另一个成熟的OSGi开源实现 ‣ Nuxeo——企业级CMS,实现了部分OSGi规范11年4月2日星期六
  63. 63. Questions? Follow me at twitter.com/sagacity t.sina.com.cn/n/池建强11年4月2日星期六
  64. 64. 杭州站 · 2011年10月20日~22日 www.qconhangzhou.com(6月启动)QCon北京站官方网站和资料下载 www.qconbeijing.com

×