中間件層主要是網(wǎng)客通平臺(tái)使用的J2EE中間件,包括平臺(tái)使用到的應(yīng)用服務(wù)器和中間件技術(shù)。
一、應(yīng)用服務(wù)器
應(yīng)用服務(wù)器為網(wǎng)客通提供的整個(gè)J2EE平臺(tái)實(shí)現(xiàn),EMALL基礎(chǔ)服務(wù)層和應(yīng)用層、業(yè)務(wù)層都是建立在應(yīng)用服務(wù)器之上。
網(wǎng)客通設(shè)計(jì)上遵循SUN公司提出的J2EE規(guī)范,這樣能夠盡可能的保證在不同的J2EE應(yīng)用服務(wù)器中進(jìn)行移植。
經(jīng)過(guò)測(cè)試、網(wǎng)客通平臺(tái)支持Tomcat、WebLogic、JBoss這幾種J2EE應(yīng)用服務(wù)器。
二、中間件技術(shù)
本著重用的設(shè)計(jì)原則,網(wǎng)客通在一些功能中采用了已有的成熟技術(shù),這些都是經(jīng)過(guò)實(shí)踐考驗(yàn)的中間件。主要以java標(biāo)準(zhǔn)包和開(kāi)源項(xiàng)目為主,大部分都針對(duì)系統(tǒng)作了相應(yīng)調(diào)整,以便適合系統(tǒng)的需要。
1. Apache commons:
著名的開(kāi)源組織Apache的一個(gè)java工具包,提供很多實(shí)用的功能。
1) commons-beanutils:
提供對(duì)Java反射和自省API的包裝。
在平臺(tái)中用于通用的接口設(shè)計(jì)。
2) commons-codec:
包含一些通用的編碼解碼算法。Hex,Base64, 以及URL encoder。
平臺(tái)中主要用來(lái)做消息摘要,實(shí)現(xiàn)數(shù)據(jù)加密等功能。
3) commons-collections:
提供一個(gè)類(lèi)包來(lái)擴(kuò)展和增加標(biāo)準(zhǔn)的Java Collection框架。提供了比j2sdk更全面的數(shù)據(jù)結(jié)構(gòu),平臺(tái)中繼承并實(shí)現(xiàn)了一些特殊的數(shù)據(jù)結(jié)構(gòu)。
4) commons-pool:
提供了通用對(duì)象池接口,一個(gè)用于創(chuàng)建模塊化對(duì)象池的工具包,以及通常的對(duì)象池。
我們?cè)谠械幕A(chǔ)上進(jìn)行了優(yōu)化,在性能和使用性方面有所提高。
5) commons-dbcp:
這是一個(gè)基于apache的對(duì)象池(apache commons pool)實(shí)現(xiàn)的數(shù)據(jù)庫(kù)連接池。
我們?cè)谠械幕A(chǔ)上進(jìn)行了優(yōu)化,對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行了特別的處理,防止數(shù)據(jù)庫(kù)連接泄漏的問(wèn)題,并提供了監(jiān)控的功能。
6) commons-discovery:
供工具來(lái)定位資源(包括類(lèi)) ,通過(guò)使用各種模式來(lái)映射服務(wù)/引用名稱(chēng)和資源名稱(chēng)。
7) commons-el:
提供在JSP2.0規(guī)范中定義的EL表達(dá)式的解釋器。
對(duì)平臺(tái)中的JSP提供EL表達(dá)式支持。
8) commons-fileupload:
強(qiáng)大和高性能的文件上傳功能。
平臺(tái)中被用于上傳各種圖片、Flash、文檔等資源,我們?cè)谠械幕A(chǔ)上進(jìn)行了優(yōu)化。
9) commons-logging:
提供通用的日志操作接口。
主要用于程序調(diào)試和服務(wù)器日常的日志輸出。
10) commons-validator:
提供了一個(gè)簡(jiǎn)單的,可擴(kuò)展的框架來(lái)在一個(gè)XML文件中定義校驗(yàn)器(校驗(yàn)方法)和校驗(yàn)規(guī)則。支持校驗(yàn)規(guī)則的和錯(cuò)誤消息的國(guó)際化。
平臺(tái)中用來(lái)校驗(yàn)各種xml數(shù)據(jù)。
2. Cewolf / JFreeChart:
Cewolf 是一個(gè)用于生成各種圖表的標(biāo)簽庫(kù)。它支持在JSP中嵌入圖表圖片。運(yùn)行servlet 容器的任意的Web應(yīng)用程序服務(wù)器都可以使用它。因?yàn)镃ewolf 是一個(gè)功能完整的標(biāo)簽庫(kù),所以不需要使用Javascript。
JFreeChart是開(kāi)放源代碼站點(diǎn)SourceForge.net上的一個(gè)JAVA項(xiàng)目,它主要用來(lái)各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區(qū)域圖、分布圖、混合圖、甘特圖以及一些儀表盤(pán)等等。這些不同式樣的圖表基本上可以滿足目前的要求。主要用于生成統(tǒng)計(jì)圖表。
這兩個(gè)技術(shù)一起提供了網(wǎng)客通平臺(tái)的統(tǒng)計(jì)分析圖表,JFreeChart主要用于輸出圖表,Cewolf對(duì)其進(jìn)行了封裝。
3. Dom4j:
Dom4j是一個(gè)易用的、開(kāi)源的庫(kù),用于XML,XPath和XSLT。它應(yīng)用于Java平臺(tái),采用了Java集合框架并完全支持DOM,SAX和JAXP。
主要用來(lái)處理XML數(shù)據(jù)。
XML在網(wǎng)客通有廣泛的應(yīng)用,主要是作為配置文件使用。由于XML嚴(yán)格的格式要求和層次結(jié)構(gòu),也有用來(lái)作為參數(shù)在HTML表單中傳遞。如組合商品功能,因?yàn)榻M合商品中的商品是由管理員挑選的,參數(shù)數(shù)量并不確定,如果每從組合商品中添加/刪除一個(gè)商品都直接更新到數(shù)據(jù)庫(kù)話,會(huì)對(duì)系統(tǒng)造成負(fù)荷。所以,在組合商品的管理中,將操作的數(shù)據(jù)類(lèi)轉(zhuǎn)換成XML傳遞,就可以一次進(jìn)行修改。
4. Hibernate:
Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序?qū)嵱茫部梢栽赟ervlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
在平臺(tái)中,我們采用Hibernate進(jìn)行數(shù)據(jù)庫(kù)操作,只有在一些對(duì)數(shù)據(jù)庫(kù)性能有特別要求的模塊,才直接使用jdbc進(jìn)行連接。
5. Ehcache:
Ehcache出自Hibernate,在Hibernate中使用它作為數(shù)據(jù)緩存的解決方案。這是Hibernate必須的包。
6. JCrontab:
它是由Java語(yǔ)言編寫(xiě)的日程處理程序,它目的是提供強(qiáng)大的定時(shí)處理功能,讓我們的應(yīng)用程序可以按照提供的時(shí)間表來(lái)執(zhí)行不同的應(yīng)用。
我們主要用Jcrontab管理以下一些定時(shí)任務(wù):
1) 年排行榜后臺(tái)更新進(jìn)程:自動(dòng)計(jì)算年排行榜。
2) 月排行榜后臺(tái)更新進(jìn)程:自動(dòng)計(jì)算月排行榜。
3) 周排行榜后臺(tái)更新進(jìn)程:自動(dòng)計(jì)算周排行榜。
4) 日排行榜后臺(tái)更新進(jìn)程:自動(dòng)計(jì)算日排行榜。
5) 更新對(duì)象緩存:實(shí)現(xiàn)對(duì)象緩存的更新,處理那些長(zhǎng)期沒(méi)被再一次訪問(wèn)的對(duì)象緩存。
6) 清頁(yè)面緩存:當(dāng)管理員使用的手工刷新頁(yè)面緩存的功能時(shí),系統(tǒng)會(huì)將這些需要刷新的緩存加到一個(gè)隊(duì)列中,由本進(jìn)程負(fù)責(zé)刷新。
7) 相關(guān)產(chǎn)品自動(dòng)實(shí)現(xiàn)間隔:相關(guān)產(chǎn)品的計(jì)算對(duì)系統(tǒng)消耗比較大,所以系統(tǒng)不會(huì)對(duì)所有幾十萬(wàn)個(gè)商品進(jìn)行計(jì)算,只有在用戶查看單個(gè)商品時(shí)算出這個(gè)商品的相關(guān)產(chǎn)品并進(jìn)行緩存。那么當(dāng)用戶下一次訪問(wèn)這個(gè)商品的相關(guān)產(chǎn)品時(shí)就直接從緩存中讀取出來(lái)。而這個(gè)進(jìn)程就是為了定時(shí)更新這個(gè)緩存。
8) 自動(dòng)推薦后臺(tái)更新進(jìn)程:進(jìn)程根據(jù)商品推薦規(guī)則進(jìn)行自動(dòng)推薦。
9) 新聞推薦后臺(tái)更新進(jìn)程:進(jìn)程根據(jù)新聞推薦規(guī)則進(jìn)行自動(dòng)推薦。
10) 關(guān)鍵字后臺(tái)進(jìn)程:當(dāng)用戶在前臺(tái)搜索欄中輸入一個(gè)查詢值時(shí),系統(tǒng)并不馬上將其統(tǒng)計(jì)到關(guān)鍵字,而是放到內(nèi)存中,由此進(jìn)程定時(shí)統(tǒng)計(jì)。
11) 保存訪問(wèn)量信息進(jìn)程:用戶每訪問(wèn)一次系統(tǒng),系統(tǒng)并不馬上統(tǒng)計(jì),而是放到內(nèi)存中,由此進(jìn)程定時(shí)保存到數(shù)據(jù)庫(kù),供統(tǒng)計(jì)進(jìn)程進(jìn)行統(tǒng)計(jì)。
12) 年訪問(wèn)量排行計(jì)算:計(jì)算年訪問(wèn)量排行榜。
13) 月訪問(wèn)量排行計(jì)算:計(jì)算月訪問(wèn)量排行榜。
14) 周訪問(wèn)量排行計(jì)算:計(jì)算周訪問(wèn)量排行榜。
15) 日訪問(wèn)量排行計(jì)算:計(jì)算日訪問(wèn)量排行榜。
16) 年降價(jià)排行計(jì)算:計(jì)算年降價(jià)排行榜。
17) 月降價(jià)排行計(jì)算:計(jì)算月降價(jià)排行榜。
18) 周降價(jià)排行計(jì)算:計(jì)算周降價(jià)排行榜。
19) 日降價(jià)排行計(jì)算:計(jì)算日降價(jià)排行榜。
20) 統(tǒng)計(jì)計(jì)算:每天對(duì)訪問(wèn)量進(jìn)行統(tǒng)計(jì)。
21) 生成訂閱郵件列表進(jìn)程:根據(jù)用戶的訂閱設(shè)置,生成需要發(fā)送的郵件隊(duì)列。
22) 發(fā)送訂閱郵件進(jìn)程:根據(jù)要發(fā)送的郵件隊(duì)列發(fā)送郵件。
23) 拍賣(mài)自動(dòng)出價(jià)進(jìn)程:實(shí)現(xiàn)拍賣(mài)模塊中的自動(dòng)出價(jià)功能。
7. JCS:
JCS是Jakarta的項(xiàng)目Turbine的子項(xiàng)目。它是一個(gè)復(fù)合式的緩沖工具。可以將對(duì)象緩沖到內(nèi)存、硬盤(pán)。具有緩沖對(duì)象時(shí)間過(guò)期設(shè)定。還可以通過(guò)JCS構(gòu)建具有緩沖的分布式構(gòu)架,以實(shí)現(xiàn)高性能的應(yīng)用。
對(duì)于一些需要頻繁訪問(wèn)而每訪問(wèn)一次都非常消耗資源的對(duì)象,可以臨時(shí)存放在緩沖區(qū)中,這樣可以提高服務(wù)的性能。而JCS正是一個(gè)很好的緩沖工具。緩沖工具對(duì)于讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作的應(yīng)用性能提高非常顯著。
網(wǎng)客通平臺(tái)中使用jCS提供緩存功能,主要是頁(yè)面緩存和對(duì)象緩存,通過(guò)JCS,系統(tǒng)將用戶訪問(wèn)過(guò)的頁(yè)面和對(duì)象緩存到內(nèi)存中,對(duì)于訪問(wèn)量巨大,內(nèi)存緩存已經(jīng)不能負(fù)荷的情況下,我們還可以將緩存設(shè)置到硬盤(pán)中保存。
使用緩存的話,能將系統(tǒng)可負(fù)載和性能大幅度的提升。當(dāng)沒(méi)有使用集群環(huán)境的情況下,緩存是一種必不可少的技術(shù)。
8. JSF / MyFaces:
JavaServer Faces (JSF) 是一種用于構(gòu)建 Web 應(yīng)用程序的新標(biāo)準(zhǔn) Java 框架。它提供了一種以組件為中心來(lái)開(kāi)發(fā) Java Web 用戶界面的方法,從而簡(jiǎn)化了開(kāi)發(fā)。
JSF 的主要優(yōu)勢(shì)之一就是它既是 Java Web 用戶界面標(biāo)準(zhǔn)又是嚴(yán)格遵循模型-視圖-控制器 (MVC) 設(shè)計(jì)模式的框架。用戶界面代碼(視圖)與應(yīng)用程序數(shù)據(jù)和邏輯(模型)的清晰分離使 JSF 應(yīng)用程序更易于管理。為了準(zhǔn)備提供頁(yè)面對(duì)應(yīng)用程序數(shù)據(jù)訪問(wèn)的 JSF 上下文和防止對(duì)頁(yè)面未授權(quán)或不正確的訪問(wèn),所有與應(yīng)用程序的用戶交互均由一個(gè)前端“Faces”servlet(控制器)來(lái)處理。
MyFaces是JavaServer Faces(JSF) Web框架 (JSR 127)的一個(gè)實(shí)現(xiàn)。提供了很多常用控件。
我們平臺(tái)中采用一些基于JSF框架的MyFaces控件。這樣使程序結(jié)構(gòu)十分清晰。
9. Log4j:
Log4j是Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,通過(guò)使用Log4j,我們可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等;我們也可以控制每一條日志的輸出格式;通過(guò)定義每一條日志信息的級(jí)別,我們能夠更加細(xì)致地控制日志的生成過(guò)程。最令人感興趣的就是,這些可以通過(guò)一個(gè)配置文件來(lái)靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼。
這是一個(gè)可選包,如果不使用Log4j的話,commons-logging會(huì)自動(dòng)使用SUN J2SDK的日志包,不過(guò)我們還是推薦使用Log4j,它的功能非常強(qiáng)大。
10. Lucene:
Lucene是一個(gè)開(kāi)放源程序的搜尋器引擎,利用它可以輕易地為Java軟件加入全文搜尋功能。Lucene的最主要工作是替文件的每一個(gè)字作索引,索引讓搜尋的效率比傳統(tǒng)的逐字比較大大提高,Lucen提供一組解讀,過(guò)濾,分析文件,編排和使用索引的API,它的強(qiáng)大之處除了高效和簡(jiǎn)單外,是最重要的是使使用者可以隨時(shí)應(yīng)自已需要自訂其功能。
我們使用Lucene建立索引,并在這基礎(chǔ)上實(shí)現(xiàn)了全文搜索功能。
11. Ant:
Ant是一個(gè)基于Java的自動(dòng)化腳本引擎,腳本格式為XML。
我們除了用Ant做Java編譯相關(guān)任務(wù)外,還通過(guò)插件實(shí)現(xiàn)很多應(yīng)用的調(diào)用。包括程序編譯、打包、Hibernate配置文件自動(dòng)生成、部署、以及單元測(cè)試等操作。
當(dāng)一個(gè)代碼項(xiàng)目大了以后,每次重新編譯,打包,測(cè)試等都會(huì)變得非常復(fù)雜而且重復(fù),因此c語(yǔ)言中有make腳本來(lái)幫助這些工作的批量完成。在Java中應(yīng)用是平臺(tái)無(wú)關(guān)性的,當(dāng)然不會(huì)用平臺(tái)相關(guān)的make腳本來(lái)完成這些批處理任務(wù)了,Ant本身就是這樣一個(gè)流程腳本引擎,用于自動(dòng)化調(diào)用程序完成項(xiàng)目的編譯,打包,測(cè)試等。除了基于JAVA是平臺(tái)無(wú)關(guān)的外,腳本的格式是基于XML的,比make腳本來(lái)說(shuō)還要好維護(hù)一些。
12. Axis:
Axis是一個(gè)SOAP引擎,提供創(chuàng)建服務(wù)器端、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。SOAP是被廣泛作為新一代跨平臺(tái)、跨語(yǔ)言分布計(jì)算Web Services的重要部分。
網(wǎng)客通平臺(tái)使用Axis提供WebService支持,廣泛應(yīng)用于通用數(shù)據(jù)接口,對(duì)外系統(tǒng)提供服務(wù)等功能。
如:
1) 商品查詢服務(wù):提供接口讓外接系統(tǒng)可以查到平臺(tái)中的商品信息。
2) 新聞發(fā)布服務(wù):提供接口讓外接系統(tǒng)可以取到各類(lèi)新聞。
3) 訂單服務(wù):提供接口讓外接系統(tǒng)可以在平臺(tái)中生成訂單,并獲取各種訂單信息。
注:上述服務(wù)都有嚴(yán)格的權(quán)限控制。
13. JavaMail:
JavaMail是Sun發(fā)布的用來(lái)處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。
我們使用JavaMail實(shí)現(xiàn)了平臺(tái)中郵件發(fā)送、群發(fā)等相關(guān)功能,供業(yè)務(wù)系統(tǒng)使用。
14. XDoclet:
XDoclet是一個(gè)開(kāi)源項(xiàng)目,可以通過(guò)在java源代碼中的一些特殊的注釋信息,自動(dòng)生成配置文件、源代碼等等。例如web、ejb的部署描述文件等。
我們用XDoclet來(lái)生成Hibernate的hbm配置文件。
15. JSTL:
JSP 標(biāo)準(zhǔn)標(biāo)記庫(kù)(JSP Standard Tag Library,JSTL)是一個(gè)實(shí)現(xiàn) Web 應(yīng)用程序中常見(jiàn)的通用功能的定制標(biāo)記庫(kù)集,這些功能包括迭代和條件判斷、數(shù)據(jù)管理格式化、XML 操作以及數(shù)據(jù)庫(kù)訪問(wèn)。
我們使用JSTL封裝各種業(yè)務(wù)邏輯。
16. Jakarta ORO:
Jakarta ORO Java 類(lèi)是一套文本處理Java類(lèi),提供了與Perl5 兼容的規(guī)則表達(dá)式,類(lèi)AWK規(guī)則表達(dá)式,glob 表達(dá)式,以及用于執(zhí)行替換、分割、過(guò)濾文件名等的工具。這個(gè)包是OROMatcher, AwkTools, PerlTools, and TextTools libraries originally from ORO, Inc的后續(xù)產(chǎn)品。
網(wǎng)客通平臺(tái)使用ORO處理正則表達(dá)式,廣泛應(yīng)用于各種文本處理中。
17. SwarmCache / JGroups:
SwarmCache是一個(gè)簡(jiǎn)單且有效的分布式緩存,它使用IP multicast與同一個(gè)局域網(wǎng)的其他主機(jī)進(jìn)行通訊,是特別為集群和數(shù)據(jù)驅(qū)動(dòng)web應(yīng)用程序而設(shè)計(jì)的。SwarmCache能夠讓典型的讀操作大大超過(guò)寫(xiě)操作的這類(lèi)應(yīng)用提供更好的性能支持。SwarmCache使用JavaGroups來(lái)管理從屬關(guān)系和分布式緩存的通訊。
JGroups是一個(gè)開(kāi)源的純java編寫(xiě)的可靠的群組通訊工具。其工作模式基于IP多播,但可以在可靠性和群組成員管理上進(jìn)行擴(kuò)展。其結(jié)構(gòu)上設(shè)計(jì)靈活,提供了一種靈活兼容多種協(xié)議的協(xié)議棧,對(duì)于每個(gè)產(chǎn)品都有不同的可靠性需求。這種協(xié)議棧可以讓用戶定義的自己可靠性指標(biāo)和性能指標(biāo)。
當(dāng)使用集群環(huán)境時(shí),系統(tǒng)存在著緩存同步的問(wèn)題,需要對(duì)集群中每一臺(tái)服務(wù)器的緩存進(jìn)行同步,這樣就必須要有一個(gè)緩存同步的機(jī)制,SwarmCache和JGroups就是為了解決這個(gè)問(wèn)題而被加到網(wǎng)客通中。
18. JUnit:
JUnit是由 Erich Gamma 和 Kent Beck 編寫(xiě)的一個(gè)回歸測(cè)試框架(regression testing framework)。Junit測(cè)試是程序員測(cè)試,即所謂白盒測(cè)試,因?yàn)槌绦騿T知道被測(cè)試的軟件如何(How)完成功能和完成什么樣(What)的功能。
我們主要用JUnit來(lái)進(jìn)行單元測(cè)試。