Writen by libo
目录
1 什么是ESimple?
随着信息技术的发展,企业级应用软件已经进入以Web应用为中心的时代。随着J2EE技术的成熟,大量的关键业务比如电信行业的BOSS,证券行业的集中交易系统都已经有基于J2EE的成功案例。然而,由于企业级应用本身的复杂性,加之多层架构上固有的复杂,使企业级应用软件项目的难度大大增加。
复杂问题往往都不会有简单的,单方面的解决方案。要提高企业级应用开发的成功率,提高软件开发人员的生产率,生产出高质量的软件产品,必须从以下三个方面进行考虑。
软件架构 |
开发流程 |
开发工具 |
Web应用 |
当软件系统的规模、复杂性低的时候,其质量直接经由程序可以掌控。当规模、复杂性增加时,整个系统结构的设计较之算法与数据结构的设计就更显重要。软件架构涵盖系统整体控制结构;功能分配至各设计组件;实体布置;延展能力及性能等。软件架构是一种抽象机制,用以澄清设计意图,提供设计分析的基础,改善可维护性,提供决策、减少风险所需的充分信息。
无可否认,软件开发最重要的问题还是人员的组织,这一问题最大程度的决定着一个软件项目的成败。再优秀软件设计如果没有良好的软件过程作为支撑也无法得到贯彻执行。
对于软件开发过程的选择来说,没有最好的,只有最合适的。敏捷过程,或者说,以敏捷思想为指导的软件开发方法学的成熟。为商业应用软件的开发提供了良好的实践指导。
目前,开源软件已经覆盖了软件开发的全过程。许多优秀的open source软件都是由优秀的软件技术团队开发,都有着大量的用户群,完备的文档支持,都经过了大量的实际项目的考验。对于用户来说,使用开源软件既可满足成本方面的要求,又可保证软件的高可靠性。
ESimple开发套件,通过对优秀的开源软件进行集成整合,形成完整的软件架构以及支撑该架构的集成开发环境。同时,辅之以敏捷过程的最佳实践经验。提供全方位的web应用软件解决方案。
1.1 核心理念
l 轻量级
轻量级的解决方案已经可以满足大多数的应用。必要的时候,提升为“重量级”的解决方案不会是一件难事。
l 简单
最优秀的设计不是全面到再也不能增加东西,而是简洁到什么也不能去掉。
ESimple无论如何发展都应该保证:整个系统应该在10分钟之内安装完成。初次使用ESimple的开发人员应该安装完后30分钟内开发部署成功著名的hello world例子。
l 实用
不追求最新的技术,最全面的解决方案。由业务需求驱动架构演变,通过refactor完善系统架构。
2 软件结构
目前,一个完整的web应用软件架构分为三个层次:表示层,业务逻辑层和数据访问层。
表示层的设计主导思想为著名的MVC模式,目前几乎所有的表示层架构都是基于MVC的思路。
在业务逻辑层的设计中,组件化的思想占据着主导地位。而且,在具体的开发实践过程中,像EJB这样的重量级组件由于其开发和部署上的复杂性,性能上的不足逐渐限制了其使用的范围。而基于简单的javabean组件技术的一些轻量级组件容器得到了广泛的应用。著名的如apache组织的avalon,spring framework,picocontainer等都有实际的项目应用。其提倡的IOC的设计原则也得到了广泛的认同。
对于大多数web应用来说,数据访问层主要的任务就是尽量减少对特定数据库系统的依赖。同时能够提供较高的开发效率。对于许多应用来说,仅仅依赖O/R mapping工具是不够的。还需要对标准的JDBC进行必要的封装,形成一个好用的JDBC工具类库
2.1 轻量级组件容器
2.1.1 component
在ESimple中,component采用标准的java bean。不需要实现额外的接口。这样最大限度的保证组件的通用性,减少已有java程序移植的代价。
组件的生命周期分为注册,初始化,服务调用,注销四个阶段。
2.1.1.1 Singleton or not Singleton?
有一些著名的frameowork例如(turbine,picocontainer),将组件或者服务统一实现为singleton方式。这一做法具有一定的好处,。但是,我们认为,在一些极其特殊的情况下,everything is singleton的做法为需求的满足带来一定的难度。因此,好的实现应该是,大部分情况下组件以singleton的方式存在。但是允许在特别注明的情况下,每次调用组件时动态创建对象。
2.1.1.2 Why not script it?
Ofbiz提供了使用专门的脚本语言来编写服务的功能。这一功能有其好处。但是使用不当,只会增加问题的复杂度。因此,目前暂不考虑支持对脚本语言的支持。
2.1.2 服务
对于服务的调用,采用与调用业务组件相同的方式。服务分为基本服务和业务服务。
2.1.2.1 基本服务
l Cache Service
l Logging Service
l Naming Service
提供JNDI naming contexts.服务
l Pool Service
l Template Service
提供对velocity模板语言的支持
l XML-RPC Service
支持通过xml-rpc 进行远程调用。
2.1.2.2 业务服务
l Scheduler Service
l Security Service
基于RBAC(role bases acess control)的权限控制服务。
l Config Service
提供标准的xml配置文件解析服务。
l Upload Service
管理 multipart/form-data文件上传
l Crypto Service
提供基本的加密/解密算法支持
2.1.3 Container
组件容器的主要作用有:
l 组件注册发布。包括组件的注册,查找功能。
l 组件生命周期管理。负责维护组件的状态
l 组件间关系的维护。组件之间具有一定的引用关系。组件容器负责处理组件之间关系以及初始化的顺序。
l 基础服务管理。
所有对于组件的调用,都要先通过组件容器进行。这一做法较之直接初始化javaBean具有明显的优势,大大增加了系统的灵活性。同时,对于系统以后的扩展具有很大的好处。例如可以透明的引入AOP机制以适应复杂的需求。
2.1.4 分布式扩展
关于如何使用EJB,更多的是一个观念的问题。很多人将ejb视为J2EE的核心,认为使用EJB的JAVA程序才是完全基于J2EE的。然而,从项目开发实践的角度来讲,J2EE是诸多技术的集合体。EJB只是其中一种。否则,盲目的使用EJB技术,就是“不审势即宽严皆误“。
当实际需求需要一个分布式的体系作为实现的时候, EJB将是一个最佳的选择。在如下的情况下,EJB将是一个推荐的技术选择:
l 应用程序的部分组件需要远程访问。
l 需要支持多种客户端程序,比如CORBA客户端调用
l 异步通讯模式时实现message消费者时,Message-driven beans 是不错的的实现选择
l 使用 EJB container 的事务管理会带来明显的便利的情况下。
对于opensuie来说,选择一种粗粒度的EJB策略。即采用façade模式,在上述情况或者特殊情况下需要利用EJB的特性时,实现组建容器的入口程序为session bean。如下所示:
2.2 MVC Framework
ESimple在MVC Framework方面的要求主要有:
l 业务逻辑无关。
l 方便与后台component container集成。
l 具有page flow管理功以及视图布局管理功能。
l 具有良好的扩展机制。
在MVC Framework方面,存在几个非常优秀的解决方案,都可以满足以上要求。
2.2.1 支持多种视图技术
视图的实现技术上,jsp并不是唯一的选择,有许多优秀的模板技术可以作为替代。Velocity就是其中有代表性的一个。模板语言具有运行简单,效率高的优势。因此在view可以提供对模板语言的支持,提供多种可选视图技术。
2.3 数据访问层
在数据访问层,通过一个高效的O/R Mapping工具来提供数据库访问具有很大的好处。O/R Mapping工具可以让开发人员避免编写繁琐的底层JDBC代码,同时使程序最大限度的摆脱数据库依赖性。
但是,不可否认,非常成熟的关系数据库技术在很多问题的解决中具有无可争议的优势。企图通过单一的O/R Mapping工具屏蔽后台数据库访问的所有细节是不可行的。因此,有必要对JDBC接口进行封装,形成标准的JDBC工具类库。
因此,在数据访问层,应提供两种类型的接口:基于O/R Mapping工具的静态访问接口和基于JDBC工具类库的动态接口。
2.4 选型
按照上述思路,对目前成熟的open source项目进行分析。最终选择下述几个项目
l MVC Framework : Struts1.1
l Lightweight Component Container: Spring Framework
l OR mapping tool : hibernate
对于MVC framework,有几个值得研究的,如webwork等,但是,struts无疑处于主导地位。关于struts的资源随处可见。支持struts的工具也有很多。使用struts的成功案例比比皆是。而其他一些framework的文档相对较少,专题书籍更是稀少。因此,最终选择了struts。
2.4.1 主要部件
其中,ActionServel,ActionMapping,ActionForward,RequestProcessor为Struts的部件,不过需要对RequestProcessor进行扩展,以支持从component container中查找组件。
BeanFactory为Spring Framework组件,提供基本的组件容器的功能。
SessionFactory为获得hibernate的session的工厂方法。
Action为用户编写的实现业务逻辑的组件。继承自struts的Action类。
3 开发实践
通过我们的开发实践,我们相信, 敏捷过程为商业应用软件的开发提供了良好的实践指导。
3.1 敏捷软件开发宣言
l 个体和交互 胜过 过程和工具
l 可以工作的软件 胜过 面面俱到的文档
l 客户合作 胜过 合同谈判
l 响应变化 胜过 遵循计划
3.2 敏捷过程遵循的原则:
l 我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
l 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
l 经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
l 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
l 围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
l 在团队内部,最具有效果并富有效率的传递信息的方法,就是面对面的交谈。
l 工作的软件是首要的进度度量标准。
l 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
l 不断地关注优秀的技能和好的设计会增强敏捷能力。
l 简单是最根本的。
4 开发工具
Eclipse是一个IBM于2001年11月推出的开放源代码框架,允许不同的开发商在同一个开发环境中兼容使用不同的工具。它提供了一个标准的IDE和一个优秀的扩展机制。通过对eclipse及其插件的整合,提供完整的开发,测试,版本控制,代码生成平台,对ESimple的软件架构提供良好的支撑。
在Esimple Framework的1.2版本,我们准备提供定制的eclipse plugin