最高院执行项目技术架构选型方案Fantasy2011年8月25日目录总体架构!2整体系统描述 2架构选型!4 JDK选型(JDK1.6_22 32位) 4 IOC容器选型(Spring3.0.5.RELEASE) 5 ORM选型(MyBatis) 6 MVC选型(SpringMVC) 7认证和权限选型(shiro1.1 + ralasafe 1.1) 8前台组件选型 11案件导入导出架构设计!12总体架构设计 12客户端功能结构 13技术实现方式 14总体架构整体系统描述系统架构图总揽展示层 :主要面向B/S架构,展示层主要由web资源文件组成,包括JSP,JS和大量的界面控件,同时还采用了AJAX和Flex等RIA技术,负责向用户展现丰富的界面信息,并执行用户的命令控制层:负责展示层请求的转发、调度和基础验证,同时自动拦截后台返回的Runtime异常信息。
领域层:是系统最为丰富的一层,主要负责处理整个系统的业务逻辑。
这一层包括业务服务和领域对象,同时负责系统的事务管理。
其中业务服务可以提供本地调用和共享远程服务的功能。
数据访问控制层:数据访问层的目的很明确,主要作为提供数据持久化的功能,包括数据的读取和写入,操作数据库的方法可以有两种方式ORM方式,ralasafe封装的方式。
公共基础设施层:可以包括Common通用模块,IOC模块,Logging日志模块,Exception异常模块和单元测试模块。
架构选型1.JDK选型(JDK1.6_22 32位)JDK1.5、JDK1.6和JDK1.7选型测试 1.增加5百万条String数据测试 2.增加5百万数据到ArrayList<String>中,并且插入时有额外的计算测试 3. HashMap <String, Integer> 有5百万 keys, values. 每对key, value是通过并发线程计算 (这个测试主要测试计算和并发能力)测试 4.把ArrayList<String>长度位5百万的列表,插入1000个文件中,再从 1000个文件中读取放入到列表中。
(测试多核并发边缘)从性能上看,JDK1.7 > JDK1.6 > JDK1.5考虑到JDK1.7正式版于2011年7月28日发布,所以稳定程度没有JDK1.6和JDK1.7的高,因此最终选用JDK1.6_22版本。
32位和64位选型假设物理内存无限大,那么 JVM 内存的最大值跟操作系统有关,一般 32 位机是 1.5g 到 3g 之间,而 64 位的就不会有限制了。
64位JDK管理大内存,面临的问题:(1)内存回收稻种的长时间停顿;(2)现阶段,64位JDK的性能测试结果普遍低于32位JDK;(3)相当的程序再64位JDK中消耗的内存一般比32位JDK大,这是由于指针膨胀及数据类型对齐补白等因素导致的。
通过评估JDK的版本,最终采用JDK1.6_22 32位版本2.IOC容器选型(Spring3.0.5.RELEASE)Spring带给我们什么?✦方便解耦,简化开发通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring 进行控制,避免硬编码所造成的过度程序耦合。
有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
✦AOP编程的支持通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
✦声明式事务的支持在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
✦方便程序的测试以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
✦方便集成各种优秀框架Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。
到底应该选用Hibernate还是选用MyBatis,我们首先看看几个前提条件:(1)数据量在千万级别(2)3000并发下,简单查询5秒内,复杂查询10秒内.(3)开发效率高,易上手。
前两个是硬性条件,最后一个是服务于开发人员,对于千万级数据量是否Hibernate能够满足我们的性能需求,我一直渴望能找到相关的数据,但是没有具体的数据支撑,但是网上的经验,很多的系统当数据量达到千万级以上的时候,把Hibernate换成SpringJDBC或者Ibatis或者纯JDBC的方式,可见Hibernate会成为将来性能的一个瓶颈,下面列举几种场景能够体现Hibernate的性能比较低:比如说有一个表,这个表有几个或者几十个字段,我需要更新其中的一个字段,iBatis 很简单,执行一个sql UPDATE TABLE_A SETcolumn_1=#column_1# WHERE id=#id# 但是用 Hibernate 的话就比较麻烦了,缺省的情况下 hibernate 会更新所有字段需要列出一个表的部分内容,用 iBatis 的时候,这里面的好处是可以少从数据库读很多数据,节省流量SELECT ID, NAME FROMTABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情况下Hibernate 会把所有的字段都选出来。
比如说有一个上面表有8个字段,其中有一两个比较大的字段,varchar(255)/text。
上面的场景中我为什么要把他们 也选出来呢?用hibernate 的话,你又不能把这两个不需要的字段设置为lazy load,因为还有很多地方需要一次把整个 domainobject 加载出来。
这个时候就能显现出ibatis 的好处了。
如果我需要更新一条记录(一个对象),如果使用 hibernate,需要现把对象select 出来,然后再做 update。
这对数据库来说就是两条sql。
而iBatis只需要一条update的sql就可以了。
减少一次与数据库的交互,对于性能的提升是非常重要。
所以比较起来,更倾向于使用Mybatis,将来可以进行细粒度的优化,一般系统性能的瓶颈都在数据库上。
所以这一点是 iBatis 非常重要的一个优势。
为什么是SpringMVC ?众所周知,基于JVM的Web框架可以列举很多,例如struts1、struts2、tapestry、SpringMVC等,面对这些框架我们到底该如何选择呢?这是一个让人头疼的问题,Matt Raible(资深的UI架构师),提出了选择的20个关键点:(1) Developer Productivity(2) Developer Perception(3) Learning Curve(4) Project Health(5) Developer Availability(6) Job Trends(7) Templating(8) Components(9) Ajax(10) Plugins or Add-ons(11) Scalability(12) Testing Suport(13) i18n and I10n(14) Validation(15) Multi-language Support(16) Quality of Documentation/Tutorials(17) Books published(18) Rest Support(client and server)(19) Mobile / iphone Support(20) Degree of Risk通过对以上20个关键点的比较,从表中可以看到SpringMVC,GWT和Ruby on Rails都以17分并列第一位。
对于企业应用来说,SpringMVC成为了首选。
5.认证和权限选型(shiro1.1 + ralasafe 1.1)一般把系统的安全体系分为三个部分:(1)用户认证(2)功能权限(3)数据权限目前有三种解决方案来保证系统的安全:(1)硬编码(2)安全框架(3)安全中间件对于第一种硬编码的方式是最常用的,也是最不灵活的方法,当用户的需要变更使,系统也要有很大的改动量很大;第二种方案使基于框架,例如SpringSecurity,Acegi等,需要你的应用系统按照该框架进行架构,如果是已有系统改造,代价非常大,对于安全框架,对于数据级权限没有提供任何支持,需要开发人员编写JAVA和XML代码;第三种方案,不仅能够实现用户认证和功能级权限,依赖于权限引擎的机制,实现数据级权限,所以采用以安全中间件的方式来架构系统的安全,目前安全中间件有:Oracle Entitlement Server 和 Ralasafe,前者是Oracle的商业产品,后者是国内的开源产品,并且开源协议为MIT,对商业完全友好,因此采用ralasafe。
但是对于Ralasafe来说,对于功能级权限和数据级权限是非常的强大,但是对于用户认证,只有实现一个很简单的数据库认证,对于将来的扩展很难,所以把用户认证部分单独拿出来,交给安全框架去做,通过对比SpringSecurity,Acegi和Shiro三种安全框架,要以最小的代价,最简单的配置与Ralasafe进行集成,所以Shiro符合我们的需求。
所以采用Shiro+Ralasafe来保证系统的安全。
shiroShiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。
!Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。
如下是它所具有的特点:1.易于理解的 Java Security API;2.简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等);3.对角色的简单的签权(访问控制),支持细粒度的签权;4.支持一级缓存,以提升应用程序的性能;5.内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;6.异构客户端会话访问;7.非常简单的加密 API;8.不跟任何的框架或者容器捆绑,可以独立运行。
Ralasafe在安全和数据权限方面,过去一直在使用的是Acegi和SpringSecurity,它们都属于 框架级别的,并且本身并不支持数据权限,如果要实现数据权限的话,必须要硬编码到系统中,会带来3方面的问题:1. 编码很累;2. 需要变更,代价大,后期无法改3. 发现很多技术并不合适,并不专业;因此采用开源基于安全引擎的中间件ralasafe,提供安全保证和数据权限功能, 以下是对ralasafe的介绍:1.功能概述•多应用系统集中管理•应用系统与数据库间的防火墙•数据库行列级权限•字段内容操作权限•定制违规拒绝提示2.权限模型图3.与系统集成4.使用ralasafe带来的收益★ 权限模式随业务精细化需求变化随时调整,无需事先定制★ 业务变更可拆分成业务变更,权限变更,防止牵一发而动全身★ 给权限系统再定义权限(权限管理自身的精细化管理)5.前台组件选型序号名称版本1 JQuery 1.4.42 表格JQGrid 3.8.23 弹出框JQueryUI 1.8.104 表单提交ajaxForm 2.6.75 提示组件qtip 2.06 下拉多选JQueryUi MultiSelectWidget 1.97 日期组件 My97DatePicker 4.78 自动完成组件JQuery 1.8.109 树组件ztree 2.5!前台的组件都是基于JQuery的组件,那么基于JQuery有什么好处呢?jQuery是继prototype之后又一个优秀的Javascrīpt框架。