TurboShop商城白皮书-系统架构

 

第二章 体系架构

2.1系统整体架构

 

整体网络架构图

 

       TurboShop商城属于B/S系统。所以需要部署在Internet环境中,外部访问者包括浏览器用户和外部其他系统,通过HTTP协议进行访问。浏览器用户即购物顾客,通过浏览器进行商品浏览,下单等操作。商城管理员也能通过浏览器登录商城后台进行数据管理。外部系统可以通过TurboShop提供的整合接口OutFace进行数据交换,数据将以XML格式返回。

       TurboShop商城部署在web应用服务器中,外围设置可以包括前置服务器,实现集群负载均衡,也可以使用独立的数据库服务器,增强网站负载性能。

 

2.2软硬件部署

优秀的跨平台特性、免费的黄金组合tomcat+mysql,使企业的投入成本降到最低。

 

兼容操作系统
支持Windows Server 2000/2003、Linux、FreeBSD、Solaris等主流操作系统

 

数据库
Mysql4.1以上版本

 

应用服务器
Tomcat 4-6、JBoss 4、WebLogic 7-9、以及其他支持Java企业版1.5标准的应用服务器

 

第三章 技术特点

 

3.1TurboPortal开发平台

 

3.1.1平台概述

 

 

 

 

 

 

       TurboShop商城业务搭建在TurboTeam自主研发的TurboPortal平台上,该开发平台是TurboTeam在长期企业级J2EE开发中积累下来的一个开发框架,它不是单纯的Spring或Hibernate,而是一个综合体,整合了很多优秀开源框架的思想,提供丰富的开发接口,整合了模板技术、web流程控制,定时任务、多线程任务、粗细粒度鉴权框架等等,通过非常低耦合的XML配置方式,使得开发人员开发效率大大提高、错误率非常低、在平台上搭建的系统具有很高的可扩展性和可维护性,从而对系统质量提供非常有力的保证。

 

 

 

       请求一个页面流程

 

 

 

 

 

       浏览器访问请求,主要分两种情况:前台访问和后台访问。前后台访问一个页面,主要区别在于模板使用和鉴权。因为前台访问需要使用模板,并且不需要做权限验证,所以需要经过URL重写过滤器,页面调用的方法不需要通过代理获取,也就是不必进行鉴权。后台获得数据页面为JSP,所以不需要经过URL重写过滤器过滤器,页面内调用的所有方法,都要通过代理获取,以便通过数据库配置实现粗细粒度权限控制。

 

不使用代理获取一个类:

ProductMgr productMgr = (ProductMgr)factory.getInstanceNonProxy("com.cwc.app.api.ProductMgr")

 

使用代理获取一个类:

ProductMgrIFace productMgr = (.ProductMgrIFace)factory.getInstanceViaProxy("com.cwc.app.api.ProductMgr")

 

 

 

       提交一个业务流程

 

 

 

 

 

       提交表单等操作,都属于提交一个业务流程,所有提交请求都会提交到appController(命令控制器),经过命令解析后调用相应函数处理,根据处理结果跳转到不同页面。任何提交请求都会经过代理,以便通过数据库配置实现粗细粒度权限控制。

 

       提交请求处理成功后,可以调用相关的提示函数实现页面弹出框提示,或根据backurl、xml配置返回到相关提示页面。

 

 

3.1.2平台特点

 

l  内存缓存数据(智能数据自动同步)

 

       TurboPortal底层DAO数据库操作已经集成了数据内存缓存和数据智能同步功能,只要在开发业务的时候使用TurboPortal提供的数据库操作函数,即可透明实现数据内存缓存,同时开发人员也不需要考虑如何把内存数据跟数据库最新数据进行同步问题,因为TurboPortal会自动帮你处理。

 

 

 

 

l  自动生成静态HTML(智能数据自动同步)

 

 


自动生成静态HTML机制

 

 

 

       TurboPortal提供了一种触发式自动HTML静态缓存技术,具有可分离、无入侵业务、低耦合和高可配性特点。简单来说,开发人员在开发商城业务的时候,根本不需要考虑生成静态页面的问题,也不需要单独做一个生成静态页面的功能模块,因为这些都可以通过后期简单配置实现,而且还不需要考虑页面数据发生变化时,数据同步问题,页面重新生成问题,这些TurboPortal都会自动处理。

 

       TurboPortal这种可配式静态HTML生成机制是具有创新性的,一改传统一次生成方式所有静态文件方式。商城系统既然不像CMS系统,生了的新闻页面后数据基本不需要怎么变化,也不像论坛系统,数据经常变化,而且介乎于两者之间,静态页面当中,可能有些数据要定期更新,但是更多情况下,数据浏览远大于数据更新,所以TurboPortal这种静态机制非常合适这种应用情况。传统的批量生成静态文件方式可维护性和扩展性比较差,容易出错,漏更新,而且一次生成大量文件也比较占用空间。TurboPortal这种方式是有访问才生成,而且还能够通过配置设置限制生成文件数的多少,同时系统还会定期清理一些过期页面,节约了空间。

 

      

       如果希望哪个URL能生成静态文件,只需要在conf/ urlrewrite.xml配置一个相应的MAPPING,

例如:

 

<rule>

<from>^/catalog/list-p-([0-9]+)-([0-9]+)\.html$</from>        <to>/controler/PageControler?pcid=$1&amp;cid=$2&amp;groups=turboshop_product|turboshop_catalog|turboshop_config&amp;page=com.cwc.app.servlet.page.catalog.ListP

</to>

</rule>

 

<from>可以使用正则表达式实现URL匹配,并能提取参数传递到<to>的实际访问URL上。

 

       有些页面数据经常变化,例如购物车,下单页面等,并不需要生成静态,可以增加nocache=1参数,实现纯URL rewrite。这样同样能对提高网站安全性起很大作用。

 

实现纯URL rewrite,以上配置可改为:

<rule>

<from>^/catalog/list-p-([0-9]+)-([0-9]+)\.html$</from>        <to>/controler/PageControler?pcid=$1&amp;cid=$2&amp;nocache=1&amp;page=com.cwc.app.servlet.page.catalog.ListP

</to>

</rule>

 

 

 

 

l  两级缓存架构(HTML+MEMORY)

 

 

 

 

二级缓存实现

 

 

       把内存缓存和静态文件缓存综合起来,TurboPortal实质上提供了一种二级缓存的解决方案。次方案具有无入侵、低耦合、非常灵活的特点。

 

       我们可以看一个列表商品数据的例子,看看二级缓存的好处:

 

       当第一次访问一个商品列表页面时,所有数据从数据库读取,并同时把页面中各个数据模块存放在内存中,同时把页面生成HTML静态文件。

 

       当第二次访问同一个商品列表页面的时候,系统直接把请求转到静态页面。

 

       当翻到第二页时,该页面的新商品数据会直接从数据库读取,但是页面中其他公共数据模块会从内存中读取。

 

 

 

l  双重权限验证

 

 

 

 

 

 

       商城系统,后台安全非常重要,TurboPortal提供了基于session的权限验证和AOP事件拦截双重鉴权机制,低耦合、可分离,通过数据库配置即可实现对指定事件进行鉴权。

 

       TurboPortal把一个操作(读取数据、删除商品等),定义为一个事件。所有权限配置以事件为中心,把事件跟角色关联,就形成了最基本的粗粒度鉴权。

 

       后台每个页面,都可以通过数据库配置,跟事件进行绑定,从而实现了浏览级别的角色鉴权。

      

       对于页面内的局部数据鉴权显示,TurboShop也提供一个鉴权标签,可以对页面中的某块内容跟多个事件进行绑定,只有具备所有事件权限的角色才能看到相关内容。

 

 

 

l  Velocity模板技术

 

       TurboShop商城前台页面都采用模板技术制作,一个商城,可以拥有无数套模板,每套模板,独占一个文件夹,通过商城后台的“网站模板管理”功能,能够非常方便的切换不同模板。切换新模板后,前台静态页面会自动重新生成,但是商品页面,货架页面等链接,都保持不变。这样就不会破坏被搜索引擎收录的友好度。

 

       由于采用了Velocity模板技术,商城前台模板制作就是对静态的HTML模板文件进行编辑,数据展示、拆分,都是用易于理解和容易上手的模板语言,使得即使是美工人员,也很容易编辑、排版、制作商城模板。

 

       TurboShop提供多套模板切换技术,每套模板独占一个文件夹,前台访问连接不改变,切换新模板后,HTML自动重新生成。

 

 

 

l  Lucence全文索引技术

 

 

       Lucence是一个开源全文检索技术,支持海量数据高性能搜索,可以用于开发搜索引擎。TurboPortal通过集成lucene技术,提供相关操作函数,商城业务通过调用这些函数,实现对商品商品ID,商品名称,商品简介,商品属性,商品编号,商品关键字进行全文索引,从而实现普通数据库不可能实现的海量商品多字段高效全文检索,让用户非常容易搜索到他们想了解的商品,并且大量搜索都不会对数据库造成压力,从另一个角度来看,也是提高了系统的性能。

 

 

l  开放式AOP事件拦截插件机制

 

 

 

 

 

 

 

 

       TurboPortal提供了一个开放式的事件拦截外部接口,开发用户可以自行开发一个类,实现Interceptor接口,实现接口里面的方法,最后通过method_interceptor.xml进行装配,拦截需要捕获的事件或捕获所有事件,在该事件前后定制自己需要的操作,改变参数、改变返回结果等等。

 

 

l  多线程异步机制

 

       一般情况下,程序执行都是同步执行,比如A()函数里面有C()、D()、E()三个函数,假如D()函数是一个比较耗时的操作,那么E()将会一直等待D()执行完才会被执行,也就是说A()函数的瓶颈在D()函数。这样的情况,我们可以采用异步线程执行D()函数,从而消除了这个瓶颈。

      

       TurboPortal集成了多线程异步处理池,提供了一些接口和函数,我们可以把D()函数封装进一个类,然后该类继承ThreadAction,在调用时使用异步线程去调用该类。

 

 

l  可配置式定时任务

 

    TurboPortal提供了一种开放式的定时任务实现,开发人员可以创建一个任务类,通过继承TimerTask,并在run()函数实现任务内容,最后通过asynchronized.xml进行装配,根据需求,可把任务配置成隔多少秒执行一次,隔多少小时执行一次以及指定隔多少天几时几分执行一次。

 

 

l  URL-Rewrite

 

       URL重写就是可以把一般访问lisy.jsp?a=1改写成list-1.html这样的形式。TurboPortal提供的URL重写是整合了静态文件的生成,通过参数设置,可以决定被重写的URL是否生成静态页面还是只是一个重写后的动态访问。TurboShop商城全站都是xxx.html这样的静态网址访问形式,但实质上包含了商品页面、货架列表等这些真正静态页面的访问和像购物车、下单流程这些伪静态页面的访问。

 

       使用了URL重写主要有两大好处,一是增强了搜索引擎对数据页面的收录度。二是增强了网站的安全性,有效地防止了SQL注入攻击,因为重写的URL对参数输入格式都有严格的限制。

 

 

 

l  自动事务管理

 

       TurboPortal集成了数据库的自动事务处理,商城业务的开发和事务的使用,完全分离,无需硬编码,业务开发完成后,只需要通过配置transaction.xml即可。

 

 

 

l  灵活可扩展的粗细粒度权限认证

 

       TurboPortal提供了一套很灵活的粗细粒度权限架构,以角色-事件为配置核心,既可以对单独事件进行权限配置,也可以对页面进行事件绑定,对页面中局部内容进行事件绑定等粗粒度权限控制。同时,开发用户可以创建一个细粒度控制类,实现MiniPrivilegeIFace接口,最后在mini_privilege.xml进行装配,把粗粒度事件和细粒度控制类绑定,从而非常灵活的实现来粗细粒度的权限控制。如果以后需要更改细粒度控制策略,只需要修改细粒度控制类或者是重新装配一个策略,具有很高的可维护性和扩展性。

 

3.2稳定、高效的访问性能

 

3.2.1高效内存数据缓存

 

       因为商城系统的特殊性,通常每个页面都会有很丰富的数据表现,而这些数据都来自调用不同的函数去查询数据库,而这些函数还会在很多不同的地方重复是使用。这样的页面在大负载压力下,性能是很差的。为解决这种情况,TurboShop使用内存数据缓存作为通用的解决方案,把经常使用的数据放在内存中,

避免了直接访问数据库,从而使读取数据性能大幅提高,整个网站的性能也就大大提高。

 

3.2.2大负载静态页面

 

       内存数据缓存的确对系统性能有很大提升,但是当访问压力更大的时候,内存数据缓存优势已经到了一个极限,而这个时候性能瓶颈不单是数据库的查询,还有就是应用服务器对业务的处理也是系统资源开销非常大的。那么进一步的性能提升方案就是把这些页面直接生成静态HTML文件,让所有请求直接访问HTML,这样是最自然的一种方式,也是在有限资源条件下,把系统性能提高最大化的一种最低成本的方式。

 

       TurboShop商城能够根据用户访问的URL,自动生成相应的静态HTML页面,当以后再有用户访问这个URL时,实质上是访问静态文件,这样应用服务器也不用去处理页面逻辑,然后生成输出内容,而仅仅需要做一个URL分发,效率基本上等于直接访问静态HTML文件,系统性能得到进一步提高。

 

       综合内存数据缓存和静态文件机制,TurboShop商城实际上具备了一个二级缓存的系统,所以系统性能非常优秀。在我们大量的压力测试评估中,使用最基本的一个配置:双核2G CPU+2G内存,分配给TOMCAT 1G内存作为测试服务器,TurboShop商城最保守估计起码支持最少2000人同时在线。

 

      

3.2.3优化数据库设计

       系统架构为TurboShop商城提供了有力的性能保证,但是我们在商城的数据库设计上也做了很多的考虑。比如商品的点击数和货架的点击数,这个是每次访问都需要递增的一个字段,如果按照传统的方式每次访问都UPDATE一次,那么在大访问时,这将会是一个瓶颈。所以TurboShop在数据库里面设计了一个临时表,专门用来存放商品和货架的点击记录。每一次访问商品或货架,都会往表里面插入一条数据,而不是直接更新商品表或货架表的点击数字段,也就是把update操作转换为insert操作(规避了频繁update造成的性能瓶颈),然后通过TurboPortal装配一个定时任务,每隔12小时汇总更新一次商品和货架的点击数。

 

       对于一些特殊的商品状态,比如捆绑商品,它是有自己独立的表来记录捆绑商品信息和关联商品信息,在商城的前台,商品是能否显示是否正在处于捆绑促销之中的,如果直接通过关联查询查询捆绑促销的表,那么系统性能将会非常差。所以TurboShop在商品表会增加一个标识捆绑商品的字段,以提供查询性能。当然,这个字段的数据同步也是比较复杂,同样需要结合定时任务使用。

 

       总的来说,TurboShop在设计数据库时尽可能的通过一些手段方法来优化表的设计,减少和错开一些不必要的更新,以便为系统提供更好的性能。

 

3.2.4定时数据统计、系统清理计划任务

    为了提高系统性能和稳定性,TurboShop商城会把一些数据统计,过期静态文件清理,临时上传图片清理、多余日志文件清理、自动备份数据库等操作,通过TurboPortal配置成定时任务,放到夜间执行,以便不影响白天的系统访问。

 

3.2.5多线程异步处理

       商城里面的发送邮件和管理商品索引,都是比较耗时的操作。比如在下单的时候,连接邮件服务器时间过长,那么下单流程就卡在那里了,严重影响了用户体验。次数多了,会直接影响到用户商城的业务。对于类似这些特殊任务,TurboShop都会创建一个新的异步线程去执行,使得用户感觉不到这些耗时操作的存在,从整体来看,也是提升了系统的执行效率。

 

3.2.6高性能全文检索

       随着商城商品日益增多,站内商品搜索会越来越重要,而普通数据库全文检索,性能和效率都是非常差的,更别说多字段同时查询。TurboShop商城通过使用全文索引技术,提供对海量商品多字段高性能全文检索,让顾客能够非常容易搜索到他们需要的商品。

 

3.3安全的企业级系统

3.3.1全站静态访问技术

       现在很多从外部对网站攻击都是采用SQL注入方式,通过在URL后加入一些非法的或者经过特殊构造参数,获得网站控制权或破坏网站数据。TurboShop商城全站都经过URL静态重写,所有访问URL都是以HTML结尾,带参数网址通过xx-xxx.html形式访问,这种静态访问方式包含了两部分内容,一种是真正的静态页面,另外一种是动态内容。经过重写后的URL,会对参数的类型做严格的定义,也就是用户不可能随意构造自己的参数对网站进行攻击。这样就使得网站安全得到有力保证。

 

 

 

3.3.2双重权限验证机制

TurboShop管理后台对权限有严格控制。整个后台鉴权采用SESSION+AOP事件拦截设计。SESSION主要是对后台入口进行登录验证,AOP事件拦截主要是结合角色进行粗、细粒度权限验证。

       在AOP事件拦截设计中,又分为页面拦截、页面内容控制和开放式可配置细粒度拦截。

       多重的权限拦截手段,使得后台不同角色权限非常严密,角色之间不能通过拼URL等方式获得、操作自己角色没有的功能,或浏览数据。

 

3.3.3数据安全事务管理

       TurboShop所有涉及到一个表以上的业务操作,我们都配置了事务,确保了数据的一致性和安全性。在系统发生异常时,不会丢失数据和产生脏数据。

 

3.3.4每天自动备份数据库

       很多系统都有提供数据库备份功能,但是TurboShop提供更为先进的自动备份功能,每天凌晨系统自动备份一次数据库,当然,用户可以通过修改配置,修改备份的时间,备份数量。备份出来的数据库,还能下载到本地,还可以直接在后台恢复某个时间的备份。这样,您就不用担心忘记了备份,当灾难发生时,您会发现,这是一个多么有用的功能。

 

 

3.4 高可维护性、可扩展性

 

3.4.1为用户提供对外系统整合接口

       TurboShop为用户提供了一个独立的组件OutFace,专门用来帮助用户整合现有的系统,比如登录、注销、注册等,还能通过外部接口获得商品群组的数据,使得用户能够非常方便的把一些商城商品整合到用户现有的系统上进行展示、销售。

 

3.4.2 开放式AOP事件拦截机制

       TurboShop提供了一个开放式的事件拦截接口,用户可以自行创建一个类,并实现相关接口,最后通过XML装配,便能够拦截商城所有执行事件,在其之前、之后执行一些自定义任务。

 

3.4.3 清晰、合理的分层系统架构

      TurboShop整体业务是搭建在TurboPortal上,开发人员只需要专注于自己的业务内容,而不需要费心事务、安全性、数据缓存、异步执行等事情上,因为这些TurboPortal都已经有良好集成,只需要通过简单配置或实现现有接口即可。并且随着开发进度往后推进,开发效率将会越来越高,因为高可复用层原子操作API会越来越丰富。层次清晰,维护方便,扩展性强,错误率低,充分利用了TurboPortal提供的丰富接口和框架功能,使得产品质量非常有保证。

 

 

3.4.4 灵活的低耦合粗、细粒度鉴权架构

      基于TurboPortal特性,TurboShop商城权限控制实现是非常灵活和容易扩展的,通过简单的数据库配置,即可实现事件、页面和页面内容的粗粒度鉴权。通过创建细粒度鉴权类,实现相关接口,并通过XML装配,跟相应事件关联,便能非常方便的实现了对事件的细粒度鉴权。灵活可分离的权限架构,为TurboShop日后扩展更复杂的角色权限关系提供了良好的基础和有力的保证。

 

posted on 2012-07-28 16:46  TurboShop官方博客  阅读(1504)  评论(0编辑  收藏  举报

导航