第一篇:淘寶技術(shù)架構(gòu)發(fā)展總結(jié)(寫寫幫推薦)
從個(gè)人網(wǎng)站到淘寶網(wǎng) 仰觀Java時(shí)代淘寶的技術(shù)發(fā)展(1)
引言
光棍節(jié)的狂歡
“時(shí)間到,開搶!”坐在電腦前早已等待多時(shí)的小美一看時(shí)間已到2011年11月11日零時(shí),便迫不及待地投身于淘寶商城一年一度的大型網(wǎng)購(gòu)促銷活動(dòng)——“淘寶雙11購(gòu)物狂歡節(jié)”。小美打開早已收藏好的寶貝——某品牌的雪地靴,飛快的點(diǎn)擊購(gòu)買,付款,一回頭發(fā)現(xiàn)3000雙靴子已被搶購(gòu)一空。
小美跳起來,大叫一聲“歐耶!”
小美不知道,就在11日零點(diǎn)過后的這一分鐘內(nèi),全國(guó)有342萬人和她一起涌入淘寶商城。當(dāng)然,她更不知道,此時(shí)此刻,在淘寶杭州的一間辦公室里,燈火通明,這里是“戰(zhàn)時(shí)指揮部”,淘寶技術(shù)部的一群工程師,正在緊盯著網(wǎng)站的流量和交易數(shù)據(jù)。白板上是他們剛剛下的注,賭誰能最準(zhǔn)確地猜中流量峰值和全天的交易總額。他們的手邊放著充足的食物和各類提神的飲料。
一陣急促的電話聲響起來,是前線部門詢問數(shù)據(jù)的,工程師大聲報(bào)著:“第1分鐘,進(jìn)入淘寶商城的會(huì)員有342萬”。過一會(huì)工程師主動(dòng)拿起電話:“交易額超過1億了,現(xiàn)在是第8分鐘?!苯酉聛恚暗?1分鐘,剛突破2億”。“第32分鐘,3億了”?!暗?個(gè)小時(shí),4.39億”。這些數(shù)據(jù)隨后出現(xiàn)在微博上,引起一片驚呼。
“完蛋了!”突然有人大喝一聲,所有的眼睛都緊張的盯著他,只見他撓撓頭,嘿嘿的笑道“我賭的少了,20億輕松就能過了,我再加5億”,他跑去白板邊上把自己的賭注擦去,寫上25,接下來有人寫上28,有人寫上30,有人跑到微博上開下盤口,同事們紛紛轉(zhuǎn)載下注。接下來的這24個(gè)小時(shí),戰(zhàn)時(shí)指揮部的工程師們都不能休息,他們盯著網(wǎng)站的各種監(jiān)控指標(biāo),適時(shí)的調(diào)整機(jī)器和增減功能。頂住第一波高峰之后,這些人開始忙里偷閑的給自己買東西,大家互相交流著哪家買的移動(dòng)硬盤靠譜,哪家衣服適合自己的女朋友,不時(shí)的有人哀嚎寶貝被人搶了、信用卡額度不夠了。同時(shí),旁邊白板上的賭注越下越大。
11月11日,這個(gè)棍子最多的日子被網(wǎng)民自我調(diào)侃的變成了一個(gè)節(jié)日——“光棍節(jié)”。而淘寶網(wǎng)又用瘋狂的折扣促銷給它賦予了另外一個(gè)意義——“購(gòu)物狂歡節(jié)”。2011年11月11日這一天,淘寶商城與淘寶網(wǎng)交易額之和突破52億,這個(gè)數(shù)字是“購(gòu)物天堂”香港一天零售總額8.5億的6倍。
網(wǎng)民感受到的是瘋搶的喜悅,而網(wǎng)站的技術(shù)人員感受到的卻是“壓力山大”。就如同你家辦酒席,宴請(qǐng)左鄰右舍,這個(gè)辦起來容易。倘若宴請(qǐng)十里八鄉(xiāng)所有的人,吃飯的人自然開心,但卻不是一般人家能夠辦得起來的。能辦得起來如此盛宴者,需要強(qiáng)大的財(cái)力物力、組織能力、技術(shù)實(shí)力(例如做這么多菜,你的炒鍋一定要是“分布式的”、“可復(fù)制的”、“可擴(kuò)展的”,洗菜切菜要有“工作流引擎”,上菜的路徑要用圖論來計(jì)算出來,甚至連廚房的下水道都要重新設(shè)計(jì))。
淘寶能夠舉辦如此盛宴,網(wǎng)站的技術(shù)實(shí)力可見一斑。淘寶網(wǎng)擁有全國(guó)最大的hadoop分布式計(jì)算集群之一,日新增數(shù)據(jù)50TB,有40PB海量數(shù)據(jù)存儲(chǔ)。分布在全國(guó)各地80多個(gè)節(jié)點(diǎn)的CDN網(wǎng)絡(luò),支持的流量超過800Gbps。淘寶的搜索引擎能夠?qū)?shù)十億的商品數(shù)據(jù)進(jìn)行實(shí)時(shí)搜索,另外還擁有自主研發(fā)的文件存儲(chǔ)系統(tǒng)和緩存系統(tǒng),以及java中間件和消息中間件系統(tǒng),這一切組成了一個(gè)龐大的電子商務(wù)操作系統(tǒng)。另外從商業(yè)數(shù)據(jù)上來看,AMAZON的財(cái)報(bào)顯示2011年完成了大約 480億美金的交易額,EBAY2011年財(cái)報(bào)全年完成了大約600億美金的交易額(不包括其獨(dú)立的汽車交易平臺(tái))。不管從交易額、商品數(shù)量、同比增速等指標(biāo)上看,淘寶網(wǎng)均遠(yuǎn)超于此,是目前全球最大的電子商務(wù)平臺(tái)。(由于淘寶非上市公司,未公布2011年業(yè)績(jī),以上內(nèi)容來自淘寶網(wǎng)技術(shù)副總裁@_行癲 的微博)
以上這些技術(shù)數(shù)據(jù)可能已經(jīng)讓一些同學(xué)產(chǎn)生不適的感覺,為了讓更多的人讀懂這本書,我們從技術(shù)的角度來看,小美訪問淘寶網(wǎng)的時(shí)候,網(wǎng)站上發(fā)生了什么事情。下參考資料:《你剛才在淘寶上買了一件東西【技術(shù)普及帖】》,來自南京郵電大學(xué)孫放同學(xué)
為了有個(gè)更直觀的對(duì)比,我們說一個(gè)同行,他在2011年光棍節(jié)之前做促銷,流量上去之后,達(dá)到12Gbps(他們有這么大的流量,老板很高興,在微博上面說了這個(gè)數(shù)據(jù)),這時(shí)候流量達(dá)到了極限,網(wǎng)站幾乎掛掉,用戶無法下訂單。而淘寶網(wǎng)光棍節(jié)當(dāng)天網(wǎng)絡(luò)的流量最高達(dá)到800多Gbps,帶給各家銀行和快遞公司的流量也讓他們壓力山大,如臨大敵(后來,他們以能夠撐住淘寶帶來的流量為榮而到處宣傳)。另外如果你在網(wǎng)上購(gòu)買過火車票的話,更能體會(huì)到網(wǎng)站能支持多大的流量有多重要。但這不是一朝一夕做出來的,也不是有錢就能辦到的。
以上對(duì)比的這些網(wǎng)站,也許讀者很容易就猜到是哪一家,這里拿出來作對(duì)比,絕對(duì)沒有嘲笑人家的意思,采用通常的網(wǎng)站技術(shù)方案,能做到這種程度已經(jīng)不錯(cuò)了。任何網(wǎng)站的發(fā)展都不是一蹴而就的,在什么樣的階段采用什么樣的技術(shù)。在發(fā)展的過程中網(wǎng)站會(huì)遇到各種各樣的問題和業(yè)務(wù)帶來的壓力,正是這些原因才推動(dòng)著技術(shù)的進(jìn)步和發(fā)展,而技術(shù)的發(fā)展又會(huì)反過來促進(jìn)業(yè)務(wù)的更大提升。二者互為因果,相互促進(jìn)。如今淘寶網(wǎng)的流量已經(jīng)是全球排名第12、國(guó)內(nèi)排名第3(美國(guó)的ebay全球排名23,國(guó)內(nèi)前兩名是百度和騰訊)。淘寶網(wǎng)的系統(tǒng)也從使用一臺(tái)服務(wù)器,到采用萬臺(tái)以上的服務(wù)器。本書就為大家描述淘寶網(wǎng)在整個(gè)發(fā)展過程中,所有的主動(dòng)和被動(dòng)的技術(shù)變革的前因后果,這由很多有趣的故事組成。
正如同很多人或組織成功了以后,就會(huì)為自己的出身編造一個(gè)美麗的傳說。淘寶網(wǎng)的出身,網(wǎng)上也有非常多的傳說,下面我們就從它的出生開始講起。個(gè)人網(wǎng)站
2003年4月7日,馬云,在杭州,成立了一個(gè)神秘的組織。他叫來十位員工,要他們簽了一份協(xié)議,這份協(xié)議要求他們立刻離開阿里巴巴,去做一個(gè)神秘的項(xiàng)目。這個(gè)項(xiàng)目要求絕對(duì)保密,老馬戲稱“連說夢(mèng)話被老婆聽到都不行,誰要是透漏出去,我將追殺到天涯海角”。這份協(xié)議是英文版的,匆忙之間,大多數(shù)人根本來不及看懂,但出于對(duì)老馬的信任,都卷起鋪蓋離開了阿里巴巴。
他們?nèi)チ艘粋€(gè)神秘的據(jù)點(diǎn)——湖畔花園小區(qū)的一套未裝修的房子里,房子的主人是馬云。這伙人剛進(jìn)去的時(shí)候,馬云給他們布置了一個(gè)任務(wù),就是在最短的時(shí)間內(nèi)做出一個(gè)個(gè)人對(duì)個(gè)人(C2C)的商品交易的網(wǎng)站?,F(xiàn)在出一個(gè)問題考考讀者,看你適不適合做淘寶的創(chuàng)業(yè)團(tuán)隊(duì)。親,要是讓你來做,你怎么做?
在說出這個(gè)答案之前,容我先賣個(gè)關(guān)子,介紹一下這個(gè)創(chuàng)業(yè)團(tuán)隊(duì)的成員:三個(gè)開發(fā)工程師(虛竹、三豐、多?。?、一個(gè)UED(二當(dāng)家)、三個(gè)運(yùn)營(yíng)(小寶、阿珂、破天)、一個(gè)經(jīng)理(財(cái)神)、還有就是馬云和他的秘書。當(dāng)時(shí)對(duì)整個(gè)項(xiàng)目組來說壓力最大的就是時(shí)間,怎么在最短的時(shí)間內(nèi)把一個(gè)從來就沒有的網(wǎng)站從零開始建立起來?了解淘寶歷史的人知道淘寶是在2003年5月10日上線的,這之間只有一個(gè)月。要是你在這個(gè)團(tuán)隊(duì)里,你怎么做?我們的答案就是:買一個(gè)來。
買一個(gè)網(wǎng)站顯然比做一個(gè)網(wǎng)站要省事一些,但是他們的夢(mèng)想可不是做一個(gè)小網(wǎng)站而已,要做大,就不是隨便買個(gè)就行的,要有比較低的維護(hù)成本,要能夠方便的擴(kuò)展和二次開發(fā)。那接下來就是第二個(gè)問題:買一個(gè)什么樣的網(wǎng)站?答案是:輕量一點(diǎn)的,簡(jiǎn)單一點(diǎn)的,于是買了這樣一個(gè)架構(gòu)的網(wǎng)站:LAMP(linux+apache+mySQL+PHP)。這個(gè)直到現(xiàn)在還是一個(gè)很常用的網(wǎng)站架構(gòu)模型。這種架構(gòu)的優(yōu)點(diǎn)是:無需編譯,發(fā)布快速,PHP功能強(qiáng)大,能做從頁(yè)面渲染到數(shù)據(jù)訪問所有的事情,而且用到的技術(shù)都是開源的,免費(fèi)。
當(dāng)時(shí)我們是從一個(gè)美國(guó)人那里買來的一個(gè)網(wǎng)站系統(tǒng),這個(gè)系統(tǒng)的名字叫做PHPAuction(他們的官方網(wǎng)站 http://),這個(gè)框架易于擴(kuò)展,方便組件化開發(fā),它的頁(yè)面模板支持JSP和velocity等、持久層支持ibatis和hibernate等、控制層可以用EJB和Spring(Spring是后來才有的)。項(xiàng)目組選擇了這個(gè)強(qiáng)大的框架,這個(gè)框架如果當(dāng)時(shí)開源了,也許就沒有webwork和struts2什么事了。另外,當(dāng)時(shí)Sun在全世界大力推廣他們的EJB,雖然淘寶的架構(gòu)師認(rèn)為這個(gè)東東用不到,但他們還是極力堅(jiān)持。在經(jīng)歷了很多次的技術(shù)討論、爭(zhēng)論和爭(zhēng)吵之后,這個(gè)系統(tǒng)的架構(gòu)就變成了下圖的樣子:
Java應(yīng)用服務(wù)器是Weblogic,MVC框架是WebX、控制層用了EJB、持久層是ibatis,另外為了緩解數(shù)據(jù)庫(kù)的壓力,商品查詢和店鋪查詢放在搜索引擎上面。這個(gè)架構(gòu)圖是不是好看了一點(diǎn)了,親?
這幫Sun的工程師開發(fā)完淘寶的網(wǎng)站之后,又做了一個(gè)很牛的網(wǎng)站,叫“支付寶”。
其實(shí)在任何時(shí)候,開發(fā)語(yǔ)言本身都不是系統(tǒng)的瓶頸,業(yè)務(wù)帶來的壓力更多的是壓到了數(shù)據(jù)和存儲(chǔ)上。上面一篇也說到,MySQL撐不住了之后換Oracle,Oracle的存儲(chǔ)一開始在本機(jī)上,后來在NAS上,NAS撐不住了用EMC的SAN存儲(chǔ),再然后Oracle的RAC撐不住了,數(shù)據(jù)的存儲(chǔ)方面就不得不考慮使用小型機(jī)了。在2004年的夏天,DBA七公、測(cè)試工程師郭芙和架構(gòu)師行癲,踏上了去北京測(cè)試小型機(jī)的道路。他們帶著小型機(jī)回來的時(shí)候,我們像歡迎領(lǐng)袖一樣的歡迎他們,因?yàn)槟莻€(gè)是我們最值錢的設(shè)備了,價(jià)格表上的數(shù)字嚇?biāo)廊?。小型機(jī)買回來之后我們爭(zhēng)相合影,然后Oracle就跑在了小型機(jī)上,存儲(chǔ)方面從EMC低端cx存儲(chǔ)到Sun oem hds高端存儲(chǔ),再到EMC dmx高端存儲(chǔ),一級(jí)一級(jí)的往上跳。
到現(xiàn)在為止,我們已經(jīng)用上了IBM的小型機(jī)、Oracle的數(shù)據(jù)庫(kù)、EMC的存儲(chǔ),這些東西都是很貴的,那些年可以說是花錢如流水啊。有人說過“錢能解決的問題,就不是問題”,但隨著淘寶網(wǎng)的發(fā)展,在不久以后,錢已經(jīng)解決不了我們的問題了?;ㄥX買豪華的配置,也許能支持1億PV的網(wǎng)站,但淘寶網(wǎng)的發(fā)展實(shí)在是太快了,到了10億怎么辦?到了百億怎么辦?在N年以后,我們不得不創(chuàng)造技術(shù),解決這些只有世界頂尖的網(wǎng)站才會(huì)遇到的問題。后來我們?cè)陂_源軟件的基礎(chǔ)上進(jìn)行自主研發(fā),一步一步的把IOE(IBM小型機(jī)、Oracle、EMC存儲(chǔ))這幾個(gè)“神器”都去掉了。這就如同在《西游記》里面,妖怪們拿到神仙的兵器會(huì)非常厲害,連猴子都能夠打敗,但最牛的神仙是不用這些神器的,他們揮一揮衣袖、翻一下手掌就威力無比。去IOE這一部分會(huì)在最后一個(gè)章節(jié)里面講,這里先埋個(gè)千里伏筆。
欲知后事如何,且聽下回分解。
已經(jīng)有讀者在迫不及待的問怎么去掉了IOE,別急,在去掉IOE之前還有很長(zhǎng)的路要走。行癲他們買回來小型機(jī)之后,我們用上了Oracle,七公帶著一幫DBA在優(yōu)化SQL和存儲(chǔ),行癲帶著幾個(gè)架構(gòu)師在研究數(shù)據(jù)庫(kù)的擴(kuò)展性。Oracle本身是一個(gè)封閉的系統(tǒng),用Oracle怎么做擴(kuò)展?用現(xiàn)在一個(gè)時(shí)髦的說法就是做“分庫(kù)分表”。
我們知道一臺(tái)Oracle的處理能力是有上限的,它的連接池有數(shù)量限制,查詢速度跟容量成反比。簡(jiǎn)單的說,在數(shù)據(jù)量上億、查詢量上億的時(shí)候,就到它的極限了。要突破這種極限,最簡(jiǎn)單的方式就是多用幾個(gè)Oracle數(shù)據(jù)庫(kù)。但一個(gè)封閉的系統(tǒng)做擴(kuò)展,不像分布式系統(tǒng)那樣輕松。我們把用戶的信息按照ID來放到兩個(gè)數(shù)據(jù)庫(kù)里面(DB1/DB2),把商品的信息跟著賣家放在兩個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù)里面,把商品類目等通用信息放在第三個(gè)庫(kù)里面(DBcommon)。這么做的目的除了增加了數(shù)據(jù)庫(kù)的容量之外,還有一個(gè)就是做容災(zāi),萬一一個(gè)數(shù)據(jù)庫(kù)掛了,整個(gè)網(wǎng)站上還有一半的數(shù)據(jù)能操作。
數(shù)據(jù)庫(kù)這么分了之后,應(yīng)用程序有麻煩了,如果我是一個(gè)買家,買的商品有DB1的也有DB2的,要查看“我已買到的寶貝”的時(shí)候,應(yīng)用程序怎么辦?必須到兩個(gè)數(shù)據(jù)庫(kù)里面分別查詢出來對(duì)應(yīng)的商品。要按時(shí)間排序怎么辦??jī)蓚€(gè)庫(kù)里面“我已買到的寶貝”全部查出來在應(yīng)用程序里面做合并。還有分頁(yè)怎么處理?關(guān)鍵字查詢?cè)趺刺幚??這些東西交給程序員來做的話會(huì)很悲催,于是行癲在淘寶的第一個(gè)架構(gòu)上的作品就來解決了這個(gè)問題,他寫了一個(gè)數(shù)據(jù)庫(kù)路由的框架DBRoute,這個(gè)框架在淘寶的Oracle時(shí)代一直在使用。后來隨著業(yè)務(wù)的發(fā)展,這種分庫(kù)的第二個(gè)目的——容災(zāi)的效果就沒有達(dá)到。像評(píng)價(jià)、投訴、舉報(bào)、收藏、我的淘寶等很多地方,都必須同時(shí)連接DB1和DB2,哪個(gè)庫(kù)掛了都會(huì)導(dǎo)致整個(gè)網(wǎng)站掛掉。上一篇說過,采用EJB其實(shí)是和Sun的工程師妥協(xié)的結(jié)果,在他們走了之后,EJB也逐漸被冷落了下來。在05、06年的時(shí)候,spring大放異彩,正好利用spring的反射(IoC)模式替代了EJB的工廠模式,給整個(gè)系統(tǒng)精簡(jiǎn)了很多代碼。
上一篇還說過,為了減少數(shù)據(jù)庫(kù)的壓力,提高搜索的效率,我們引入了搜索引擎。隨著數(shù)據(jù)量的繼續(xù)增長(zhǎng),到了2005年,商品數(shù)有1663萬,PV有8931萬,注冊(cè)會(huì)員有1390萬,這給數(shù)據(jù)和存儲(chǔ)帶來的壓力依然山大,數(shù)據(jù)量大,性能就慢。親,還有什么辦法能提升系統(tǒng)的性能?一定還有招數(shù)可以用,這就是緩存和CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))。
你可以想象,九千萬的訪問量,有多少是在商品詳情頁(yè)面?訪問這個(gè)頁(yè)面的時(shí)候,數(shù)據(jù)全都是只讀的(全部從數(shù)據(jù)庫(kù)里面讀出來,不寫入數(shù)據(jù)庫(kù)),如果把這些讀操作從數(shù)據(jù)庫(kù)里面移到內(nèi)存里,數(shù)據(jù)庫(kù)將會(huì)多么的感激涕零。在那個(gè)時(shí)候我們的架構(gòu)師多隆大神,找到了一個(gè)基于 Berkeley DB 的開源的緩存系統(tǒng),把很多不太變動(dòng)的只讀信息放了進(jìn)去。其實(shí)最初這個(gè)緩存系統(tǒng)還比較弱,我們并沒有把整個(gè)商品詳情都放在里面,一開始把賣家的信息放里面,然后把商品屬性放里面,商品詳情這個(gè)字段太大,放進(jìn)去受不了。說到商品詳情,這個(gè)字段比較恐怖,有人統(tǒng)計(jì)過,淘寶商品詳情打印出來平均有5米長(zhǎng),在系統(tǒng)里面其實(shí)放在哪里都不招人待見。筆者清楚的記得,我來淘寶之后擔(dān)任項(xiàng)目經(jīng)理做的第一個(gè)項(xiàng)目就是把商品詳情從商品表里面給移出來。這個(gè)字段太大了,查詢商品信息的時(shí)候很多都不需要查看詳情,它跟商品的價(jià)格、運(yùn)費(fèi)這些放在一個(gè)表里面,拖慢了整個(gè)表的查詢速度。在05年的時(shí)候,我把商品詳情放在數(shù)據(jù)庫(kù)的另外一張表里面,再往后這個(gè)大字段被從數(shù)據(jù)庫(kù)里面請(qǐng)了出來,這也讓數(shù)據(jù)庫(kù)再一次感激涕零。
到現(xiàn)在為止,整個(gè)商品詳情的頁(yè)面都在緩存里面了,眼尖的讀者可能會(huì)發(fā)現(xiàn)現(xiàn)在的商品詳情不全是“只讀”的信息了,這個(gè)頁(yè)面上有個(gè)信息叫“瀏覽量”,這個(gè)數(shù)字每刷新一次頁(yè)面就要“寫入”數(shù)據(jù)庫(kù)一次,這種高頻度實(shí)時(shí)更新的數(shù)據(jù)能用緩存嗎?如果不用緩存,一天幾十億的寫入,數(shù)據(jù)庫(kù)會(huì)怎么樣?一定會(huì)掛掉。那怎么辦?親??
CDN這個(gè)工作相對(duì)比較獨(dú)立,跟別的系統(tǒng)一樣,一開始我們也是采用的商用系統(tǒng)。后來隨著流量的增加,商用的系統(tǒng)已經(jīng)撐不住了,LVS的創(chuàng)始人章文嵩博士帶人搭建了淘寶自己的CDN網(wǎng)絡(luò)。在本文的引言中我說過淘寶的CDN系統(tǒng)支撐了800Gbps以上的流量,作為對(duì)比我們可以看一下國(guó)內(nèi)專業(yè)做CDN的上市公司ChinaCache的介紹——“ChinaCache??是中國(guó)第一的專業(yè)CDN服務(wù)提供商,向客戶提供全方位網(wǎng)絡(luò)內(nèi)容快速分布解決方案。作為首家獲信產(chǎn)部許可的CDN服務(wù)提供商,目前ChinaCache在全國(guó)50多個(gè)大中城市擁有近300個(gè)節(jié)點(diǎn),全網(wǎng)處理能力超過500Gbps,其CDN網(wǎng)絡(luò)覆蓋中國(guó)電信、中國(guó)網(wǎng)通、中國(guó)移動(dòng)、中國(guó)聯(lián)通、中國(guó)鐵通和中國(guó)教育科研網(wǎng)等各大運(yùn)營(yíng)商?!薄@樣你可以看得出淘寶在CDN上面的實(shí)力,這在全世界都是數(shù)一數(shù)二的。另外因?yàn)镃DN需要大量的服務(wù)器,要消耗很多能源(消耗多少?在前兩年我們算過一筆帳,淘寶上產(chǎn)生一個(gè)交易,消耗的電足以煮熟4個(gè)雞蛋)。這兩年章文嵩的團(tuán)隊(duì)又在研究低功耗的服務(wù)器,在綠色計(jì)算領(lǐng)域也做了很多開創(chuàng)性的工作。淘寶CDN的發(fā)展需要專門一個(gè)章節(jié)來講,想先睹為快的可以看一下筆者對(duì)章文嵩的專訪:http://qing.weibo.com/1866752224/6f4460e033000jme.html 回想起剛用緩存那段時(shí)間,筆者還是個(gè)小菜鳥,有一個(gè)經(jīng)典的錯(cuò)誤常常犯,就是數(shù)據(jù)庫(kù)的內(nèi)容更新的時(shí)候,忘記通知緩存系統(tǒng),結(jié)果在測(cè)試的時(shí)候就發(fā)現(xiàn)我改過的數(shù)據(jù)怎么在頁(yè)面上沒變化呢。后來做了一些頁(yè)面上的代碼,修改CSS和JS的時(shí)候,用戶本地緩存的信息沒有更新,頁(yè)面上也會(huì)亂掉,在論壇上被人說的時(shí)候,我告訴他用ctrl+F5刷新頁(yè)面,然后趕緊修改腳本文件的名稱,重新發(fā)布頁(yè)面。學(xué)會(huì)用ctrl+F5的會(huì)員對(duì)我佩服的五體投地,我卻慚愧的無地自容。
有些技術(shù)的發(fā)展是順其自然的,有些卻是突如其來的。到2007年的時(shí)候,我們已經(jīng)有幾百臺(tái)應(yīng)用服務(wù)器了,這上面的java應(yīng)用服務(wù)器是weblogic,而weblogic是非常貴的,比這些服務(wù)器本身都貴。有一段時(shí)間多隆研究了一下jboss,說我們換掉weblogic吧,于是又省下了不少銀兩。那一年,老馬舉辦了第一屆的“網(wǎng)俠大會(huì)”,會(huì)上來的大俠中有一位是上文提到的章文嵩,還有一位曾經(jīng)在jboss團(tuán)隊(duì)工作,我們也把這位大俠留下了,這樣我們用起jboss更加有底氣了。
這些雜七雜八的修改,我們對(duì)數(shù)據(jù)分庫(kù)、放棄EJB、引入Spring、加入緩存、加入CDN、采用開源的Jboss,看起來沒有章法可循,其實(shí)都是圍繞著提高容量、提高性能、節(jié)約成本來做的,由于這些不算大的版本變遷,我們姑且叫它2.1版吧,這個(gè)版本從構(gòu)圖上來看有3只腳,是不是穩(wěn)定了很多?
架構(gòu)圖如下:
下集預(yù)告:創(chuàng)造技術(shù) 分布式文件系統(tǒng)TFS、分布式kv緩存tair、搜索引擎升級(jí)
第二篇:java技術(shù)架構(gòu)
Java技術(shù)體系圖
Java程序員
高級(jí)特性
反射、泛型、注釋符、自動(dòng)裝箱和拆箱、枚舉類、可變
參數(shù)、可變返回類型、增強(qiáng)循環(huán)、靜態(tài)導(dǎo)入
核心編程
IO、多線程、實(shí)體類、集合類、正則表達(dá)式、XML和屬性文件
圖形編程
AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace
網(wǎng)路編程
Applet、Socket/TCP/UDP、NIO、RMI、CORBA
Java語(yǔ)法基礎(chǔ)
類、抽象類、接口、最終類、靜態(tài)類、匿名類、內(nèi)部類、異常類、編碼規(guī)范
Java開發(fā)環(huán)境
JDK、JVM、Eclipse、Linux
Java核心編程技術(shù)
Java,設(shè)計(jì)而又非常精巧的語(yǔ)言。學(xué)習(xí)Java,須從Java開發(fā)環(huán)境開始,到Java語(yǔ)法,再到Java的核心API。
1.Java開發(fā)入門:Java開發(fā)環(huán)境的安裝與使用,包括JDK命令、EclipseIDE、Linux下Java程序的開發(fā)和部署等。
2.Java語(yǔ)法基礎(chǔ):基于JDK和Eclipse環(huán)境,進(jìn)行Java核心功能開發(fā),掌握J(rèn)ava面向?qū)ο蟮恼Z(yǔ)法構(gòu)成,包括類、抽象類、接口、最終類、靜態(tài)類、匿名類、內(nèi)部類、異常的編寫。
3.Java核心API:基于JDK提供的類庫(kù),掌握三大核心功能:
A。Java核心編程:包括Java編程的兩大核心功能——Java輸入/輸出流和多線程,以及常用的輔助類庫(kù)——實(shí)體類、集合類、正則表達(dá)式、XML和屬性文件。
B。Java圖形編程:包括Sun的GUI庫(kù)AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI庫(kù)SWT和Jface;
C.Java網(wǎng)路編程:Applet組件編程,Socket編程,NIO非阻塞Socket編程、RMI和CORBA分布式開發(fā)。
4.Java高級(jí)特性:掌握J(rèn)DK1.4、JDK5.0、JDK6.0中的Java高級(jí)特性,包括反射、泛型、注釋,以及java高級(jí)特性——自動(dòng)裝箱和拆箱、枚舉類、可變參數(shù)、可變返回類型、增強(qiáng)循環(huán)、靜態(tài)導(dǎo)入等。
JavaEE初級(jí)軟件工程師
JSF框架開發(fā)技術(shù)
配置文件(頁(yè)面導(dǎo)航、后臺(tái)Bean)、JSF組件庫(kù)(JSF EL語(yǔ)言、HTML標(biāo)簽、事件處理、)、JSF核心庫(kù)(格式轉(zhuǎn)換、輸入驗(yàn)證、國(guó)際化)
Javaweb核心開發(fā)技術(shù)
開發(fā)環(huán)境(Eclipse、Linux)
三大組件(JSP、JavaBean、Servlet)
擴(kuò)展技術(shù)(EL、JSTL、Taglib)
網(wǎng)頁(yè)開發(fā)技術(shù)
HTML、XML、CSS、JavaScript、AJAX
數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù)
SQL、MySql、Oracle、SQLServer、JDBC
Web服務(wù)器(Tomcat/Jetty/Resin/JBossWeb)
JavaWeb核心技術(shù):
JavaWeb項(xiàng)目開發(fā)的全過程可以分解為:
網(wǎng)頁(yè)開發(fā)+數(shù)據(jù)庫(kù)設(shè)計(jì)——>JavaWeb項(xiàng)目開發(fā),其中,javaWeb由6項(xiàng)基本技術(shù)組成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是將這6種技術(shù)進(jìn)行有機(jī)結(jié)合的技術(shù)框架:
JavaEE中級(jí)軟件工程師
四種經(jīng)典架構(gòu)SSH1、SSI1、SSH2、SSI2
Struts1表現(xiàn)層框架
入門配置、核心組件、標(biāo)簽庫(kù)、國(guó)際化、數(shù)據(jù)檢驗(yàn)、數(shù)據(jù)庫(kù)開發(fā)、Sitemesh集成、集成Hibernate/iBATIS
Struts2表現(xiàn)層框架
入門配置、核心組件、標(biāo)簽庫(kù)、國(guó)際化、數(shù)據(jù)校驗(yàn)、Sitemesh集成轉(zhuǎn)換器、攔截器、集成Hibernate/iBATIS
Spring業(yè)務(wù)層框架
入門配置、IoC容器、MVC、標(biāo)簽庫(kù)、國(guó)際化、數(shù)據(jù)校驗(yàn)、數(shù)據(jù)庫(kù)開發(fā)
Hibernate持久層框架
MySQL、Oracle、SQLServer iBATIS持久層框架
MySQL、Oracle、SQLServer
Web服務(wù)器(Tomcat/Jetty/Resin/JBossWeb)
Java高級(jí)軟件工程師
javaWeb開源技術(shù)與框架
工作流、規(guī)則引擎
搜索引擎、緩存引擎、任務(wù)調(diào)度、身份認(rèn)證
報(bào)表服務(wù)、系統(tǒng)測(cè)試、集群、負(fù)載平衡、故障轉(zhuǎn)移
JavaWeb分布式開發(fā)技術(shù)
JTA(Java事物管理)
JAAS(Java驗(yàn)證和授權(quán)服務(wù))
JNDI(Java命名和目錄服務(wù))
JavaMail(Java郵件服務(wù))
JMS(java信息服務(wù))
WebService(web服務(wù))
JCA(java連接體系)
JMS(java管理體系)
應(yīng)用服務(wù)器(JBossAS/WebLogic/WebSphere)
JavaEE系統(tǒng)架構(gòu)師
面向云架構(gòu)(COA)
COA、SaaS、網(wǎng)格計(jì)算、集群計(jì)算、分布式計(jì)算、云計(jì)算
面向資源架構(gòu)(ROA)
ROA、RESI
面向web服務(wù)架構(gòu)(SOA)
WebService、SOA、SCA、ESB、OSGI、EAI
Java設(shè)計(jì)模式
創(chuàng)建式模式:抽象工廠/建造者/工廠方法/原型/單例
構(gòu)造型模式:適配器/橋接/組合/裝飾/外觀/享元/代理
行為型模式:責(zé)任鏈/命令/解釋器/迭代子/中介者/備忘錄/觀察者/狀態(tài)/策略/模板方法/訪問者
Java與UML建模
對(duì)象圖、用例圖、組件圖、部署圖、序列圖、交互圖、活動(dòng)圖、正向工程與逆向工程
CTO首席技術(shù)官
發(fā)展戰(zhàn)略
技術(shù)總監(jiān)
團(tuán)隊(duì)提升
團(tuán)隊(duì)建設(shè)
項(xiàng)目管理
產(chǎn)品管理
第三篇:大型網(wǎng)站架構(gòu)設(shè)計(jì)及技術(shù)總結(jié)
大型網(wǎng)站架構(gòu)設(shè)計(jì)及技術(shù)總結(jié)
隨著中國(guó)大型IT企業(yè)信息化速度的加快,大部分應(yīng)用的數(shù)據(jù)量和訪問量都急劇增加,大型企業(yè)網(wǎng)站正面臨性能和高數(shù)據(jù)訪問量的壓力,而且對(duì)存儲(chǔ)、安全以及信息檢索等等方面都提出了更高的要求??
本文中,我想通過幾個(gè)國(guó)外大型IT企業(yè)及網(wǎng)站的成功案例,從Web技術(shù)人員角度探討如何積極地應(yīng)對(duì)國(guó)內(nèi)大型網(wǎng)站即將面臨的擴(kuò)展(主要是技術(shù)方面,而較少涉及管理及營(yíng)銷等方面)矛盾。
一、國(guó)外大型IT網(wǎng)站的成功之道
(一)MySpace
今天,MySpace已經(jīng)成為全球眾口皆碑的社區(qū)網(wǎng)站之王。盡管一流和營(yíng)銷和管理經(jīng)驗(yàn)自然是每個(gè)IT企業(yè)取得成功的首要因素,但是本節(jié)中我們卻拋棄這一點(diǎn),而主要著眼于探討在數(shù)次面臨系統(tǒng)擴(kuò)張的緊急關(guān)頭MySpace是如何從技術(shù)方面采取應(yīng)對(duì)策略的。
第一代架構(gòu)—添置更多的Web服務(wù)器
MySpace最初的系統(tǒng)很小,只有兩臺(tái)Web服務(wù)器(分擔(dān)處理用戶請(qǐng)求的工作量)和一個(gè)數(shù)據(jù)庫(kù)服務(wù)器(所有數(shù)據(jù)都存儲(chǔ)在這一個(gè)地方)。那時(shí)使用的是Dell雙CPU、4G內(nèi)存的系統(tǒng)。在早期階段,MySpace基本是通過添置更多Web服務(wù)器來對(duì)付用戶暴增問題的。但到在2004年早期,在MySpace用戶數(shù)增長(zhǎng)到五十萬后,其數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)開始疲于奔命了。
第二代架構(gòu)—增加數(shù)據(jù)庫(kù)服務(wù)器
與增加Web服務(wù)器不同,增加數(shù)據(jù)庫(kù)并沒那么簡(jiǎn)單。如果一個(gè)站點(diǎn)由多個(gè)數(shù)據(jù)庫(kù)支持,設(shè)計(jì)者必須考慮的是,如何在保證數(shù)據(jù)一致性的前提下讓多個(gè)數(shù)據(jù)庫(kù)分擔(dān)壓力。
MySpace運(yùn)行在三個(gè)SQL Server數(shù)據(jù)庫(kù)服務(wù)器上—一個(gè)為主,所有的新數(shù)據(jù)都向它提交,然后由它復(fù)制到其它兩個(gè);另兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器全力向用戶供給數(shù)據(jù),用以在博客和個(gè)人資料欄顯示。這種方式在一段時(shí)間內(nèi)效果很好——只要增加數(shù)據(jù)庫(kù)服務(wù)器,加大硬盤,就可以應(yīng)對(duì)用戶數(shù)和訪問量的增加。
這一次的數(shù)據(jù)庫(kù)架構(gòu)按照垂直分割模式設(shè)計(jì),不同的數(shù)據(jù)庫(kù)服務(wù)于站點(diǎn)的不同功能,如登錄、用戶資料和博客。垂直分割策略利于多個(gè)數(shù)據(jù)庫(kù)分擔(dān)訪問壓力,當(dāng)用戶要求增加新功能時(shí),MySpace只需要投入新的數(shù)據(jù)庫(kù)加以支持。在賬戶到達(dá)二百萬后,MySpace還從存儲(chǔ)設(shè)備與數(shù)據(jù)庫(kù)服務(wù)器直接交互的方式切換到SAN(存儲(chǔ)區(qū)域網(wǎng)絡(luò))—用高帶寬、專門設(shè)計(jì)的網(wǎng)絡(luò)將大量磁盤存儲(chǔ)設(shè)備連接在一起,而數(shù)據(jù)庫(kù)連接到SAN。這項(xiàng)措施極大提升了系統(tǒng)性能、正常運(yùn)行時(shí)間和可靠性。然而,當(dāng)用戶繼續(xù)增加到三百萬后,垂直分割策略也變得難以維持下去。
第三代架構(gòu)—轉(zhuǎn)到分布式計(jì)算架構(gòu)
幾經(jīng)折騰,最終,MySpace將目光移到分布式計(jì)算架構(gòu)——它在物理上分布的眾多服務(wù)器,整體必須邏輯上等同于單臺(tái)機(jī)器。拿數(shù)據(jù)庫(kù)來說,就不能再像過去那樣將應(yīng)用拆分,再以不同數(shù)據(jù)庫(kù)分別支持,而必須將整個(gè)站點(diǎn)看作一個(gè)應(yīng)用?,F(xiàn)在,數(shù)據(jù)庫(kù)模型里只有一個(gè)用戶表,支持博客、個(gè)人資料和其他核心功能的數(shù)
據(jù)都存儲(chǔ)在相同數(shù)據(jù)庫(kù)。
既然所有的核心數(shù)據(jù)邏輯上都組織到一個(gè)數(shù)據(jù)庫(kù),那么MySpace必須找到新的辦法以分擔(dān)負(fù)荷——顯然,運(yùn)行在普通硬件上的單個(gè)數(shù)據(jù)庫(kù)服務(wù)器是無能為力的。這次,不再按站點(diǎn)功能和應(yīng)用分割數(shù)據(jù)庫(kù),MySpace開始將它的用戶按每百萬一組分割,然后將各組的全部數(shù)據(jù)分別存入獨(dú)立的SQL Server實(shí)例。目前,MySpace的每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器實(shí)際運(yùn)行兩個(gè)SQL Server實(shí)例,也就是說每臺(tái)服務(wù)器服務(wù)大約二百萬用戶。據(jù)MySpace的技術(shù)人員說,以后還可以按照這種模式以更小粒度劃分架構(gòu),從而優(yōu)化負(fù)荷分擔(dān)。
第四代架構(gòu)—求助于微軟方案
2005年早期,賬戶達(dá)到九百萬,MySpace開始用微軟的C#編寫ASP.NET程序。在收到一定成效后,MySpace開始大規(guī)模遷移到ASP.NET。
賬戶達(dá)到一千萬時(shí),MySpace再次遭遇存儲(chǔ)瓶頸問題。SAN的引入解決了早期一些性能問題,但站點(diǎn)目前的要求已經(jīng)開始周期性超越SAN的I/O容量——即它從磁盤存儲(chǔ)系統(tǒng)讀寫數(shù)據(jù)的極限速度。
第五代架構(gòu)—增加數(shù)據(jù)緩存層并轉(zhuǎn)到支持64位處理器的SQL Server 20052005年春天,MySpace賬戶達(dá)到一千七百萬,MySpace又啟用了新的策略以減輕存儲(chǔ)系統(tǒng)壓力,即增加數(shù)據(jù)緩存層——位于Web服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器之間,其唯一職能是在內(nèi)存中建立被頻繁請(qǐng)求數(shù)據(jù)對(duì)象的副本,如此一來,不訪問數(shù)據(jù)庫(kù)也可以向Web應(yīng)用供給數(shù)據(jù)。
2005年中期,服務(wù)賬戶數(shù)達(dá)到兩千六百萬時(shí),MySpace因?yàn)槲覀儗?duì)內(nèi)存的渴求而切換到了還處于beta測(cè)試的支持64位處理器的SQL Server 2005。升級(jí)到SQL Server 2005和64位Windows Server 2003后,MySpace每臺(tái)服務(wù)器配備了32G內(nèi)存,后于2006年再次將配置標(biāo)準(zhǔn)提升到64G。
事實(shí)上,MySpace的Web服務(wù)器和數(shù)據(jù)庫(kù)仍然經(jīng)常發(fā)生超負(fù)荷,其用戶頻繁遭遇“意外錯(cuò)誤”和“站點(diǎn)離線維護(hù)”等告示,他們不得不在論壇抱怨不停??
MySpace正是在這樣不斷重構(gòu)站點(diǎn)軟件、數(shù)據(jù)庫(kù)和存儲(chǔ)系統(tǒng)中,才一步步走到今天。事實(shí)上,MySpace已經(jīng)成功解決了很多系統(tǒng)擴(kuò)展性問題,其中存在相當(dāng)?shù)慕?jīng)驗(yàn)值得我們借鑒。MySpace系統(tǒng)架構(gòu)到目前為止保持了相對(duì)穩(wěn)定,但其技術(shù)人員仍然在為SQL Server支持的同時(shí)連接數(shù)等方面繼續(xù)攻堅(jiān),盡可能把事情做到最好。
(二)Amazon
亞馬遜書店無疑是電子商務(wù)發(fā)展的里程碑。2000年到現(xiàn)在,世界網(wǎng)絡(luò)業(yè)腥風(fēng)血雨。Amazon曾經(jīng)成為網(wǎng)絡(luò)泡沫的頭號(hào)代表。如今,當(dāng)這個(gè)“最大的泡沫”用幾經(jīng)易改的數(shù)字把自己變成了堅(jiān)實(shí)的IT巨人。
歷覽Amazon發(fā)展過程,其成功經(jīng)驗(yàn)在于,它創(chuàng)造性地進(jìn)行了電子商務(wù)中每一環(huán)節(jié)的探索,包括系統(tǒng)平臺(tái)的建設(shè),程序編寫、網(wǎng)站設(shè)立、配送系統(tǒng)等等方面。用Amazon當(dāng)家人貝索斯的話說就是,“在現(xiàn)實(shí)世界的商店最有力的武器就是地
段,地段,地段,而對(duì)于我們來說最重要的三件事就是技術(shù),技術(shù),技術(shù)?!?/p>
(三)eBay
eBay是世界聞名的拍賣網(wǎng)站,eBay公司通信部主管凱文?帕斯格拉夫認(rèn)為,“eBay成功的最重要原因在于公司管理和服務(wù)?!?/p>
其成功的奧秘可以列舉為以下幾點(diǎn):
①敢為天下先—在網(wǎng)絡(luò)尚不普及的時(shí)代,eBay率先進(jìn)入網(wǎng)絡(luò)拍賣領(lǐng)域;②依托虛擬商場(chǎng)所產(chǎn)生的特有的“零庫(kù)存”是eBay公司取得成功的另一個(gè)重要原因。該公司的核心業(yè)務(wù)沒有任何庫(kù)存風(fēng)險(xiǎn),所有的商品都是由客戶提供,它只需要負(fù)責(zé)提供虛擬的拍賣平臺(tái)—網(wǎng)絡(luò)和軟件。所以,eBay公司的財(cái)務(wù)報(bào)表上不會(huì)出現(xiàn)“庫(kù)存費(fèi)用”和“保管費(fèi)用”等。
③自eBay公司成立開始,它就一直遵循兩條“黃金原則”:建設(shè)虛擬社區(qū),給網(wǎng)民以家的感覺;保證網(wǎng)站穩(wěn)定安全地運(yùn)行。
二、國(guó)內(nèi)大型網(wǎng)站開發(fā)時(shí)的幾點(diǎn)建議
從本節(jié)開始,我們將結(jié)合國(guó)內(nèi)外大型IT網(wǎng)站在技術(shù)擴(kuò)展方面的沉痛教訓(xùn)和成功經(jīng)驗(yàn),探討在如今剛剛開始的Web 2.0時(shí)代如何應(yīng)對(duì)國(guó)內(nèi)網(wǎng)站即將面臨的數(shù)據(jù)訪問量增加(甚至是急劇膨脹)的問題,并提出一些供參考的策略和建議。
(四)搭建科學(xué)的系統(tǒng)架構(gòu)
構(gòu)建大型的商業(yè)網(wǎng)站絕對(duì)不可能像構(gòu)建普通的小型網(wǎng)站一樣一蹴而就,需要從嚴(yán)格的軟件工程管理的角度進(jìn)行認(rèn)真規(guī)劃,有步驟有邏輯地進(jìn)行開發(fā)。對(duì)于大型網(wǎng)站來說,所采用的技術(shù)涉及面極其廣泛,從硬件到軟件、編程語(yǔ)言、數(shù)據(jù)庫(kù)、Web服務(wù)器、防火墻等各個(gè)領(lǐng)域都有了很高的要求,已經(jīng)不是原來簡(jiǎn)單的html靜態(tài)網(wǎng)站所能比擬的。以著名的Yahoo!為例,他們的每一個(gè)大型網(wǎng)站工程都需要大量相應(yīng)專業(yè)人員的參與。
(五)頁(yè)面靜態(tài)化
可不要小看純靜態(tài)化的HTML頁(yè)面!其實(shí)在很多情況下,HTML往往意味著“效率最高、消耗最小”,所以我們盡可能使我們的網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來實(shí)現(xiàn)。但是,對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動(dòng)實(shí)現(xiàn),因此可以開發(fā)相應(yīng)的自動(dòng)化更新工具,例如我們常見的信息發(fā)布系統(tǒng)CMS。像我們經(jīng)常訪問的各個(gè)門戶站點(diǎn)的新聞?lì)l道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實(shí)現(xiàn)的。信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理、權(quán)限管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。
(六)存儲(chǔ)問題
存儲(chǔ)也是一個(gè)大問題,一種是小文件的存儲(chǔ),比如圖片這類;另一種是大文件的存儲(chǔ),比如搜索引擎的索引。
大家知道,對(duì)于Web服務(wù)器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都會(huì)采用的策略,他們都有獨(dú)立的圖片服務(wù)器,甚至很多臺(tái)圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁(yè)面訪問請(qǐng)求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會(huì)因?yàn)閳D片問題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化以保證更
高的系統(tǒng)消耗和執(zhí)行效率。
(七)數(shù)據(jù)庫(kù)技術(shù)—集群和庫(kù)表散列
對(duì)于大型網(wǎng)站而言,使用大型的數(shù)據(jù)庫(kù)服務(wù)器是必須的事情。但是,在面對(duì)大量訪問的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸仍然會(huì)顯現(xiàn)出來,這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無法滿足應(yīng)用,于是我們需要借助于數(shù)據(jù)庫(kù)集群或者庫(kù)表散列技術(shù)。
在數(shù)據(jù)庫(kù)集群方面,很多數(shù)據(jù)庫(kù)廠商都有自己的解決方案,Oracle、Sybase、SQL Server等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案。因此,你使用了什么樣的數(shù)據(jù)庫(kù),就參考相應(yīng)的解決方案來實(shí)施即可。
上面提到的數(shù)據(jù)庫(kù)集群由于在架構(gòu)、成本、擴(kuò)張性方面都會(huì)受到所采用數(shù)據(jù)庫(kù)類型的限制,于是我們需要從應(yīng)用程序的角度來考慮改善系統(tǒng)架構(gòu),其中,庫(kù)表散列是常用并且最有效的解決方案。我們?cè)趹?yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫(kù)進(jìn)行分離,不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或者表,再按照一定的策略對(duì)某個(gè)頁(yè)面或者功能進(jìn)行更小的數(shù)據(jù)庫(kù)散列,比如用戶表,按照用戶ID進(jìn)行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴(kuò)展性。在這一方面一個(gè)現(xiàn)成的例子就是搜狐。它的論壇就是采用了這樣的架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進(jìn)行數(shù)據(jù)庫(kù)分離,然后對(duì)帖子、用戶按照板塊和ID進(jìn)行散列數(shù)據(jù)庫(kù)和表,最終可以在配置文件中進(jìn)行簡(jiǎn)單的配置便能讓系統(tǒng)隨時(shí)增加一臺(tái)低成本的數(shù)據(jù)庫(kù)進(jìn)來補(bǔ)充系統(tǒng)性能。
(八)緩存策略
這絕對(duì)不單指低級(jí)的緩存技術(shù)相關(guān)的編程,應(yīng)從整個(gè)架構(gòu)角度著眼,深入研究Web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器的各層級(jí)的緩沖策略,最后才是低級(jí)的緩沖技術(shù)的編程。不同的Web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器及Web編程語(yǔ)言都有自己不同的緩沖策略。例如數(shù)據(jù)庫(kù)存儲(chǔ)方面,SQL Serve 2005中的主動(dòng)式緩存機(jī)制,Oracle數(shù)據(jù)的cache group技術(shù),Hibernate的緩存包括Session的緩存和SessionFactory的緩存;Web服務(wù)器方面,Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪問響應(yīng)能力,IIS緩沖器技術(shù);至于web開發(fā)語(yǔ)言,所用緩存技術(shù)更存在很大不同,例如ASP.NET 2.0中提出了兩種緩存應(yīng)用程序數(shù)據(jù)和緩存服務(wù)頁(yè)輸出的策略,這兩種緩存技術(shù)相互獨(dú)立但不相互排斥,PHP有Pear的Cache模塊,等等。
(九)鏡像
鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來的用戶訪問速度差異。在鏡像的細(xì)節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn)成的解決架構(gòu)和產(chǎn)品可選。也有廉價(jià)的通過軟件實(shí)現(xiàn)的思路,比如Linux上的rsync等工具。
(十)負(fù)載均衡
負(fù)載均衡將是大型網(wǎng)站解決高負(fù)荷訪問和大量并發(fā)請(qǐng)求采用的終極解決辦法。
負(fù)載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,基于LAMP
解決方案的Lighttped+Squid是相當(dāng)不錯(cuò)的解決負(fù)載均衡和加速系統(tǒng)的有效方式。
(十一)硬件四層交換
第四層交換使用第三層和第四層信息包的報(bào)頭信息,根據(jù)應(yīng)用區(qū)間識(shí)別業(yè)務(wù)流,將整個(gè)區(qū)間段的業(yè)務(wù)流分配到合適的應(yīng)用服務(wù)器進(jìn)行處理。第四層交換功能就象是虛IP,指向物理服務(wù)器。它傳輸?shù)臉I(yè)務(wù)服從的協(xié)議多種多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這些業(yè)務(wù)在物理服務(wù)器基礎(chǔ)上,需要復(fù)雜的載量平衡算法。在IP世界,業(yè)務(wù)類型由終端TCP或UDP端口地址來決定,在第四層交換中的應(yīng)用區(qū)間則由源端和終端IP地址、TCP和UDP端口共同決定。
在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國(guó)當(dāng)初接近2000臺(tái)服務(wù)器使用了三四臺(tái)Alteon就搞定了。(十二)軟件四層交換
大家知道了硬件四層交換機(jī)的原理后,基于OSI模型來實(shí)現(xiàn)的軟件四層交換也就應(yīng)運(yùn)而生,這樣的解決方案實(shí)現(xiàn)的原理一致,不過性能稍差。但是滿足一定量的壓力還是游刃有余的。
一個(gè)典型的使用負(fù)載均衡的策略就是,在軟件或者硬件四層交換的基礎(chǔ)上搭建squid集群,這種思路在很多大型網(wǎng)站包括搜索引擎上被采用,這樣的架構(gòu)低成本、高性能還有很強(qiáng)的擴(kuò)張性,隨時(shí)往架構(gòu)里面增減節(jié)點(diǎn)都非常容易。
(十三)軟件投資問題
據(jù)報(bào)導(dǎo),目前國(guó)內(nèi)除了一些上市企業(yè)和特別大知名大公司以外,很少有企業(yè)在成本中考慮正版軟件的購(gòu)置費(fèi)用。這種思維極有可能給中國(guó)互聯(lián)網(wǎng)帶來噩夢(mèng)。如果一些公司真正面臨軟件資金方面的困難,完全可以考慮使用開源世界的LAMP解決方案(Linux+Apache+MySQL+Perl、PHP或者Python Web編程語(yǔ)言);否則,隨著我國(guó)加入WTO范圍的不斷擴(kuò)大,盜版打擊必然越來越嚴(yán)。因此,“茍且偷生”必將自食其果。
另外,隨著網(wǎng)絡(luò)帶寬日漸提升,WEB 2.0技術(shù)必將影響到網(wǎng)絡(luò)世界的幾乎每一個(gè)角落。因此,如何積聚技術(shù)人員進(jìn)行技術(shù)攻關(guān)并進(jìn)一步加強(qiáng)安全防范也成為一個(gè)日益嚴(yán)峻的問題,宜盡早納入到公司的議事日程。
四、總結(jié)
中國(guó)電子商務(wù)真正理性發(fā)展的一個(gè)標(biāo)志,是大量的傳統(tǒng)企業(yè)實(shí)實(shí)在在地開始用互聯(lián)網(wǎng)來處理商務(wù)、做生意,而現(xiàn)在這樣的浪潮已經(jīng)開始。北京發(fā)行集團(tuán),聯(lián)合SINA、6688.com等單位共同推出的網(wǎng)上虛擬書店—新新書店就是這樣的一個(gè)標(biāo)志。
隨著網(wǎng)絡(luò)帶寬日漸提升,隨著網(wǎng)絡(luò)理念和WEB 2.0技術(shù)的斷深入人心,各種B2B、B2C、C2C等電子商務(wù)模式很可能以立體交叉方式整合到各種大型商務(wù)網(wǎng)站中來。因此,作為公司的技術(shù)人員,作為臨危救駕的“白衣騎士”,如何應(yīng)對(duì)海量存儲(chǔ)、海量訪問問題,海量信息檢索的問題,日益嚴(yán)峻的安全問題,等等,已經(jīng)刻不容緩。
第四篇:基于java技術(shù)的軟件開發(fā)架構(gòu)總結(jié)
基于java技術(shù)的軟件開發(fā)架構(gòu)總結(jié)
在具體的實(shí)現(xiàn)中,表現(xiàn)層可為Struts/JSF等,業(yè)務(wù)層、訪問層可為JavaBean或EJB等,資源層一般為數(shù)據(jù)庫(kù)。
宏觀上的層次就是這樣,在具體現(xiàn)實(shí)中,有如下幾種實(shí)現(xiàn)形式:
1,輕量級(jí)實(shí)現(xiàn)
表現(xiàn)層使用基于MVC的框架,比如Struts或JSF 業(yè)務(wù)層使用JavaBean(就是常說的Service)訪問層使用JavaBean(就是常說的DAO)優(yōu)點(diǎn):
輕量級(jí)實(shí)現(xiàn),簡(jiǎn)單明了? 缺點(diǎn):
難以無法實(shí)現(xiàn)分布式應(yīng)用?
以下功能必須通過編程實(shí)現(xiàn)?
事務(wù)控制? 資源管理(包括組件的創(chuàng)建)?
線程安全問題?
安全性?
2,重量級(jí)J2EE實(shí)現(xiàn)
表現(xiàn)層依然是基于MVC的框架
訪問層采用實(shí)體Bean實(shí)現(xiàn),如果可能最好采用CMP,實(shí)現(xiàn)起來更簡(jiǎn)潔。此處的實(shí)體Bean可以考慮采用本地接口
業(yè)務(wù)層一分為二,服務(wù)控制器可以由會(huì)話Bean充當(dāng),用來封裝業(yè)務(wù)流程(相當(dāng)于輕量級(jí)實(shí)現(xiàn)中的Service),也可以考慮采用本地接口;門面也可以由會(huì)話Bean充當(dāng)(一般來說無狀態(tài)會(huì)話Bean足矣),作為業(yè)務(wù)層的入口,應(yīng)該采用遠(yuǎn)程接口。優(yōu)點(diǎn):
以下功能可由EJB容器自動(dòng)實(shí)現(xiàn),或通過配置實(shí)現(xiàn)?
事務(wù)控制?
遠(yuǎn)程訪問?
線程安全?
資源管理?
安全性?
可以進(jìn)行分布式應(yīng)用?
因?yàn)椴捎昧薊JB,故部分特征可以由裝配人員來配置(比如事務(wù),安全性等),不需要在軟件中硬編碼? EJB組件有更好的重用性?
可利用容器提供的其他企業(yè)級(jí)的功能(比如集群,容錯(cuò),災(zāi)難恢復(fù)等)?
可以加入MDB(實(shí)現(xiàn)異步通訊)等技術(shù)? 缺點(diǎn):
開發(fā)難度較高?
如果不恰當(dāng)?shù)氖褂脤?shí)體Bean,會(huì)造成效率低下。如果采用CMP,則很多數(shù)據(jù)訪問的操作不能直接實(shí)現(xiàn)。?
缺少良好的開發(fā)環(huán)境?
軟件可能依賴于具體的EJB容器? EJB容器可能很貴,開發(fā)軟件也可能很貴?
3,輕量級(jí)和重量級(jí)J2EE的切換
如果項(xiàng)目有需求,并有充分的時(shí)間,還可以通過在表現(xiàn)層和業(yè)務(wù)層的交界處加入“業(yè)務(wù)代表”(JavaBean + 服務(wù)定位器實(shí)現(xiàn))來對(duì)表現(xiàn)層隱藏對(duì)業(yè)務(wù)層訪問的細(xì)節(jié)(JavaBean和EJB的訪問方式顯然不同),只需替換“業(yè)務(wù)代表”就可以切換輕量級(jí)和重量級(jí)兩種實(shí)現(xiàn)。舉例說明,一般電話上都有一個(gè)P/T開關(guān)(脈沖/音頻開關(guān)),隨著開關(guān)狀態(tài)的不同,撥號(hào)時(shí)電話機(jī)會(huì)判斷是使用脈沖撥號(hào)還是音頻撥號(hào)。
這種架構(gòu)唯一的缺點(diǎn)就是必須寫兩套實(shí)現(xiàn)代碼??
4,輕量級(jí)J2EE實(shí)現(xiàn)
訪問層通過JavaBean調(diào)用ORM框架實(shí)現(xiàn)(Hibernate,iBatis等),代碼簡(jiǎn)潔,功能完備(相對(duì)于EJB 2.x而言),如果用的是Hibernate,可以忽略底層數(shù)據(jù)庫(kù)的差異,如果用的是iBatis,則方便對(duì)SQL進(jìn)行優(yōu)化。
業(yè)務(wù)層和訪問層依靠AOP框架(如Spring)可以在切面中實(shí)現(xiàn)事務(wù),安全性等功能,同時(shí)不影響業(yè)務(wù)代碼。如果采用Spring,其中已經(jīng)內(nèi)置了事物切面,并可以輕易的與主流ORM框架進(jìn)行整合,實(shí)現(xiàn)聲明式的事物管理。當(dāng)然,更可以使用IoC模式降低組件間的耦合性。優(yōu)點(diǎn):
可以通過AOP框架實(shí)現(xiàn)事物、安全性等功能,同時(shí)不影響業(yè)務(wù)代碼?
ORM框架比CMP更靈活,比BMP更簡(jiǎn)潔(相對(duì)于EJB? 2.x而言),運(yùn)行效率也比較高
如果使用Spring,可以用更簡(jiǎn)單的方式實(shí)現(xiàn)J2EE中比較復(fù)雜的功能?
無需額外的容器?
ORM和AOP框架可以找到免費(fèi)的開源實(shí)現(xiàn),降低項(xiàng)目成本(不過也有人認(rèn)為采用開源項(xiàng)目可能綜合成本更高)? 缺點(diǎn):
非官方框架,缺少文檔、技術(shù)支持和業(yè)界經(jīng)驗(yàn)?
采用技術(shù)太多,學(xué)習(xí)曲線較高,難以招到合適的程序員(咱們學(xué)員可以考慮在這方面下點(diǎn)功夫,呵呵)?
某些企業(yè)級(jí)的功能輕量級(jí)框架還不能實(shí)現(xiàn)(或獨(dú)立實(shí)現(xiàn))??????????????????????????????????????????
測(cè)試、調(diào)試均比較復(fù)雜?
另類之處:
使用BMP + Hibernate(具體做法為BMP中的持久化方法,比如ejbLoad, ejbStore等都委托給Hibernate實(shí)現(xiàn))優(yōu)點(diǎn):
借助于Hibernate強(qiáng)大的ORM功能彌補(bǔ)CMP的不足(特別是EJB-QL)缺點(diǎn):
事物不好控制
不倫不類,容易發(fā)生未知的錯(cuò)誤(比如Hibernate自身的緩存可能會(huì)于容易提供的緩存沖突)另類之處:
將業(yè)務(wù)層(也可能包含訪問層)包裝成Web Services,支持遠(yuǎn)程調(diào)用 優(yōu)點(diǎn):
借助于Web Services可以實(shí)現(xiàn)松散耦合分布式應(yīng)用,說的大一點(diǎn),就是傳說中的SOA,呵呵 缺點(diǎn):
Web Services自身效率不高,無狀態(tài),安全性差
當(dāng)然,即使不分層,也能做出軟件來,但我們應(yīng)該思考怎么做才能最好?如果說分層不好,那么不分層的優(yōu)勢(shì)又在哪里呢??如果說分層有性能的損耗,那么性能損耗在哪里呢??如果不分層,軟件工程思想中的“分而治之”的原則啟不受到了質(zhì)疑?
有人說,分層是為了減少代碼量,如果分層是為了減少代碼量,那怎么能減少,代碼的重用也許會(huì)減少一些,但是程序更多的是業(yè)務(wù),我們關(guān)心的也只是業(yè)務(wù),試問分層的意義就是為了減少代碼量?
總之我的觀點(diǎn)就是:軟件分層是必須做的。至于框架,不應(yīng)該問用不用,而應(yīng)該問用什么?要選用實(shí)踐檢驗(yàn)過的框架,畢竟實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。
二年的J2EE開發(fā)之后,我們應(yīng)該掌握了一些主流的架構(gòu)模式,總結(jié)一下:
宏觀上講,我們采用了分層的架構(gòu),將軟件分為如下的層次:
第五篇:Struts2+Hibernate架構(gòu)技術(shù)教程課后參考答案
第1章
Struts2框架技術(shù)入門
1.5 習(xí)題 1.5.1 選擇題
1.D 2.A 3.C 4.B 5.B 1.5.2 填空題
1.MVC
2.Struts1和WebWork 3.IBM 4.FilterDispatcher 5.JSP、Struts2標(biāo)簽
1.5.3 簡(jiǎn)答題
1.簡(jiǎn)述MVC設(shè)計(jì)模式的工作流程。答:MVC設(shè)計(jì)模式工作流程是:
(1)用戶的請(qǐng)求(V)提交給控制器(C);
(2)控制器接受到用戶請(qǐng)求后根據(jù)用戶的具體需求,調(diào)用相應(yīng)的JavaBean或者EJB(M部分)來進(jìn)行處理用戶的請(qǐng)求;
(3)控制器調(diào)用M處理完數(shù)據(jù)后,根據(jù)處理結(jié)果進(jìn)行下一步的調(diào)轉(zhuǎn),如跳轉(zhuǎn)到另外一個(gè)頁(yè)面或者其他Servlet。
2.簡(jiǎn)述Struts2的工作原理。
答:Struts2中使用攔截器來處理用戶請(qǐng)求,從而允許用戶的業(yè)務(wù)控制器Action與Servlet分離。用戶請(qǐng)求提交后經(jīng)過多個(gè)攔截器攔截后交給核心控制器FilterDispatcher處理,核心控制器讀取配置文件struts.xml,根據(jù)配置文件的信息指定某一個(gè)業(yè)務(wù)控制器Action(POJO類)來處理用戶數(shù)據(jù),業(yè)務(wù)控制器調(diào)用某個(gè)業(yè)務(wù)組件進(jìn)行處理,在處理的過程中可以調(diào)用其他模型組件共同完成數(shù)據(jù)的處理。Action處理完后會(huì)返回給核心控制器FilterDispatcher一個(gè)處理結(jié)果,核心控制器根據(jù)返回的處理結(jié)果讀取配置文件struts.xml,根據(jù)配置文件中的配置,決定下一步跳轉(zhuǎn)到哪一個(gè)頁(yè)面。
一個(gè)客戶請(qǐng)求在Struts2框架中處理的過程大概有以下幾個(gè)步驟:(1)客戶提交請(qǐng)求到服務(wù)器;
(2)請(qǐng)求被提交到一系列的過濾器過濾后最后到FilterDispatcher;FilterDispatcher是核心控制器,是基于Struts2中MVC模式的控制器部分;
(3)FilterDispatcher讀取配置文件struts.xml,根據(jù)配置信息調(diào)用某個(gè)Action來處理客戶請(qǐng)求;
(4)Action執(zhí)行完畢,返回執(zhí)行結(jié)果,根據(jù)struts.xml的配置找到對(duì)應(yīng)的返回結(jié)果。1.5.4 實(shí)訓(xùn)題
略
第2章
Struts2核心組件詳解 2.7 習(xí)題
2.7.1 選擇題
1.B 2.C 3.B 4.D 5.B 6.D 2.7.2 填空題
1.struts.xml和struts.properties 2.struts.xml、struts.properties和web.xml 3.Action和攔截器 4.非耦合性
5.IoC方式和非IoC方式
6.不指定method屬性和指定method屬性 7.表達(dá)式、根對(duì)象和上下文環(huán)境 8.UI標(biāo)簽、非UI標(biāo)簽 9.表單標(biāo)簽和非表單標(biāo)簽 10.數(shù)據(jù)標(biāo)簽和控制標(biāo)簽
2.7.3 簡(jiǎn)答題
1.簡(jiǎn)述struts.xml配置文件的作用。
答:Struts2的核心配置文件是struts.xml,struts.xml具有重要的作用,所有用戶請(qǐng)求被Struts2核心控制器FilterDispatcher攔截,然后業(yè)務(wù)控制器代理通過配置管理類查詢配置文件struts.xml中由哪個(gè)也Action處理。
2.簡(jiǎn)述Struts2的核心控制器FilterDispatcher的作用。
答:FilterDispatcher是Struts2框架的核心控制器,該控制器作為一個(gè)Filter運(yùn)行在Web應(yīng)用中,它負(fù)責(zé)攔截所有的用戶請(qǐng)求,當(dāng)用戶請(qǐng)求到達(dá)時(shí),該Filter會(huì)過濾用戶請(qǐng)求。如果用戶請(qǐng)求以action結(jié)尾,該請(qǐng)求將被轉(zhuǎn)入Struts2框架處理。Struts2框架獲得了*.action請(qǐng)求后,將根據(jù)*.action請(qǐng)求的前面部分決定調(diào)用哪個(gè)業(yè)務(wù)控制器組件,例如,對(duì)于login.action請(qǐng)求,Struts2調(diào)用名為login的Action來處理該請(qǐng)求。Struts2應(yīng)用中的Action都被定義在struts.xml文件中,在該文件中定義Action時(shí),定義了該Action的name屬性和class屬性,其中name屬性決定了該Action處理哪個(gè)用戶請(qǐng)求,而class屬性決定了該Action的實(shí)現(xiàn)類。
3.簡(jiǎn)述Struts2的業(yè)務(wù)控制器Action的作用。答:Action類中包含了對(duì)用戶請(qǐng)求的處理邏輯,因此也把Action稱為Action業(yè)務(wù)控制器。Action是應(yīng)用的核心,業(yè)務(wù)控制器是Struts2中實(shí)現(xiàn)業(yè)務(wù)控制的中心,除了保存用戶的數(shù)據(jù)外,它也負(fù)責(zé)調(diào)用其他模型組件在execute()方法中進(jìn)行數(shù)據(jù)處理。
2.7.4 實(shí)訓(xùn)題
略
第3章
Struts2的高級(jí)組件
3.6 習(xí)題 3.6.1 選擇題
1.A 2.A 3.B 4.C 5.C 3.6.2 填空題
1.properties 2.native2ascii 3.AOP 4.服務(wù)器端校驗(yàn)
3.6.3 簡(jiǎn)答題
1.什么是國(guó)際化,為什么使用國(guó)際化? 答:“國(guó)際化”是指一個(gè)應(yīng)用程序在運(yùn)行時(shí)能夠根據(jù)客戶端請(qǐng)求所來自的國(guó)家/地區(qū)、語(yǔ)言的不同而顯示不同的用戶界面。例如,請(qǐng)求來自于一臺(tái)中文操作系統(tǒng)的客戶端計(jì)算機(jī),則應(yīng)用程序響應(yīng)界面中的各種標(biāo)簽、錯(cuò)誤提示和幫助信息均使用中文文字;如果客戶端計(jì)算機(jī)采用英文操作系統(tǒng),則應(yīng)用程序也應(yīng)能識(shí)別并自動(dòng)以英文界面做出響應(yīng)。
引入國(guó)際化機(jī)制的目的在于提供自適應(yīng)的、更友好的用戶界面,而并未改變程序的其他功能/業(yè)務(wù)邏輯。人們常用I18N 這個(gè)詞作為“國(guó)際化”的簡(jiǎn)稱,其來源是英文單詞Internationalization 的首末字母I 和N 及它們之間的字符數(shù)18。
2.簡(jiǎn)述Struts2中實(shí)現(xiàn)國(guó)際化流程的過程。答:(1)不同地區(qū)使用操作系統(tǒng)環(huán)境不同,如中文操作系統(tǒng)、英文操作系統(tǒng)、韓文操作系統(tǒng)等,在獲得客戶端地區(qū)的語(yǔ)言環(huán)境后,struts.xml文件會(huì)找國(guó)際化資源文件,當(dāng)時(shí)中文語(yǔ)言環(huán)境,就加載中文國(guó)際化資源文件。所示國(guó)際化需要編寫支持多個(gè)語(yǔ)言的國(guó)際化資源文件,并且配置struts.xml文件。
(2)根據(jù)選擇的語(yǔ)言加載相應(yīng)的國(guó)際化資源文件,視圖通過Struts2標(biāo)簽讀取國(guó)際化資源文件把數(shù)據(jù)輸出到頁(yè)面上,完成頁(yè)面的顯示。
3.什么是攔截器,攔截器的作用是什么?
答:攔截器(Interceptor)體系是Struts2的一個(gè)重要組成部分,正是大量的內(nèi)置攔截器才提供了Struts2的大部分操作。當(dāng)FilterDispatcher攔截到用戶請(qǐng)求后,大量的攔 截器將會(huì)對(duì)用戶請(qǐng)求進(jìn)行處理,然后才調(diào)用用戶自定義的Action類中的方法來處理請(qǐng)求,比如params攔截器將HTTP請(qǐng)求中的參數(shù)解析出來,將這些解析出來參數(shù)設(shè)置為Action的屬性;servlet-config攔截器直接將HTTP請(qǐng)求中的HttpServletRequest實(shí)例和HttpServletResponse實(shí)例傳給Action;國(guó)際化攔截器i18n將國(guó)際化資源進(jìn)行操作;文件上傳攔截器fileUpload將文件信息傳給Action。另外還有數(shù)據(jù)校驗(yàn)攔截器對(duì)數(shù)據(jù)校驗(yàn)信息進(jìn)行攔截。對(duì)于Struts2的攔截器體系而言,當(dāng)需要使用某個(gè)攔截器時(shí),只需在配置文件struts.xml中配置就可以使用;如果不需要使用該攔截器,也是只需在struts.xml配置文件中取消配置即可。Struts2的攔截器可以理解為一種可插拔式的設(shè)計(jì)思想,所以Struts2框架具有非常好的可擴(kuò)展性。
4.簡(jiǎn)述在Java Web應(yīng)用開發(fā)Struts2的輸入校驗(yàn)的作用。
答:在互聯(lián)網(wǎng)上,Web站點(diǎn)是對(duì)外提供服務(wù)的,由于站點(diǎn)的開放性,Web站點(diǎn)保存的數(shù)據(jù)主要都是從客戶端接受過來。輸入數(shù)據(jù)的用戶來自不同的行業(yè),有著不同的教育背景和生活習(xí)慣,從而不能保證輸入內(nèi)容的正確性。例如,用戶操作計(jì)算機(jī)不熟悉、輸入出錯(cuò)、網(wǎng)絡(luò)問題或者惡意輸入等,這些都可能導(dǎo)致數(shù)據(jù)異常。如果對(duì)數(shù)據(jù)不加校驗(yàn),有可能導(dǎo)致系統(tǒng)阻塞或者系統(tǒng)崩潰。
3.6.4 實(shí)訓(xùn)題
略
第5章
Hibernate框架技術(shù)入門
5.5 習(xí)題
5.5.1 選擇題
1.A 2.B 3.A 5.5.2 填空題
1.JDBC和ORM 2.hibernate.cfg.xml和hibernate.properties 3.xxx.hbm.xml或者.hbm.xml 4.臨時(shí)狀態(tài)(transient)、持久化狀態(tài)(persistent)和脫管狀態(tài)(detached)
5.5.3 簡(jiǎn)答題
1.簡(jiǎn)述Hibernate的特點(diǎn)。答:(1)Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC 進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java 程序員可以隨心所欲地使用面向?qū)ο缶幊趟季S來操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在JavaEE框架中取代CMP,完成數(shù)據(jù)持久化的重任。(2)Hibernate的目標(biāo)是成為Java中管理數(shù)據(jù)持久性問題的一種完整解決方案。它協(xié)調(diào)應(yīng)用與關(guān)系數(shù)據(jù)庫(kù)的交互,讓開發(fā)者解放出來專注于手中的業(yè)務(wù)問題。
(3)Hibernate是一種非強(qiáng)迫性的解決方案。開發(fā)者在寫業(yè)務(wù)邏輯與持久化類時(shí),不會(huì)被要求遵循許多Hibernate特定的規(guī)則和設(shè)計(jì)模式。這樣,Hibernate就可以與大多數(shù)新的和現(xiàn)有的應(yīng)用平順地集成,而不需要對(duì)應(yīng)用的其余部分做破壞性的改動(dòng)。
2.簡(jiǎn)述Hibernate的工作原理。
答:首先,Configuration讀取Hibernate的配置文件及映射文件中的信息,即加載配置文件和映射文件,并通過Hibernate配置文件生成一個(gè)多線程的SessionFactory對(duì)象,然后,多線程SessionFactory對(duì)象生成一個(gè)線程Session 對(duì)象,Session對(duì)象生成Query對(duì)象或者Transaction對(duì)象;可通過Session對(duì)象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對(duì)PO進(jìn)行加載、保存、更新、刪除等操作;在查詢的情況下,可通過Session 對(duì)象生成一個(gè)Query對(duì)象,然后利用Query對(duì)象執(zhí)行查詢操作;如果沒有異常,Transaction對(duì)象將提交這些操作結(jié)果到數(shù)據(jù)庫(kù)中。
5.5.4 實(shí)訓(xùn)題
略
第6章
Hibernate核心組件詳解
6.11 習(xí)題 6.11.1 選擇題
1.A 2.A 3.B 6.11.2 填空題
1.hibernate.cfg.xml和hibernate.properties 2.hbm.xml 3.get()和load()6.11.3簡(jiǎn)答題
1.簡(jiǎn)述Hibernate配置文件的作用。
答:Hibernate框架的配置文件用來為程序配置連接數(shù)據(jù)庫(kù)的參數(shù),例如,數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序名,URL,用戶名和密碼等。Hibernate的基本配置文件有兩種:hibernate.cfg.xml和hibernate.properties。前者包含了Hibernate與數(shù)據(jù)庫(kù)的基本連接信息,在Hibernate工作的初始階段,這些信息被先后加載到Configuration和SessionFactory實(shí)例;前者還包含了Hibernate的基本映射信息,即系統(tǒng)中每一個(gè)類與其對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)信息,在Hibernate工作的初始階段,這些信息通過hibernate.cfg.xml的mapping節(jié)點(diǎn)被加載到Configuration和SessionFactory實(shí)例中。這兩種文件信息包含了Hibernate的所有運(yùn)行期參數(shù)。兩者的配置內(nèi)容基本相同,但前者的使用稍微方便一些,例如,在 hibernate.cfg.xml 中可以定義要用到的xxx.hbm.xml 映射文件列表,而使用hibernate.properties 則需要在程序中以硬編碼方式指明。hibernate.cfg.xml是Hibernate的默認(rèn)配置文件。
2.簡(jiǎn)述Hibernate的Configuration類的作用。答:Configuration類的主要作用是解析Hibernate的配置文件和持久化映射文件中的信息,即負(fù)責(zé)管理Hibernate的配置信息。Hibernate運(yùn)行時(shí)需要獲取一些底層實(shí)現(xiàn)的基本信息,如數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類、數(shù)據(jù)庫(kù)的URL等。這些信息定義在Hibernate的配置文件(hibernate.cfg.xml或hibernate.properties)中。然后通過Configuration對(duì)象的buildSessionFactory()方法創(chuàng)建SessionFactory對(duì)象,所以Configuration對(duì)象一般只有在獲取SessionFactory對(duì)象時(shí)需要使用。當(dāng)獲取了SessionFactory對(duì)象之后,由于配置信息已經(jīng)由Hibernate維護(hù)并綁定在返回的SessionFactory中,因此該Configuration已無使用價(jià)值。
3.簡(jiǎn)述Hibernate的Session的作用。
答:Session對(duì)象是Hibernate技術(shù)的核心,持久化化對(duì)象的生命周期、事務(wù)的管理和持久化對(duì)象的查詢、更新和刪除都是通過Session對(duì)象來完成的。Hibernate在操作數(shù)據(jù)庫(kù)之前必須先取得Session對(duì)象,相當(dāng)于JDBC在操作數(shù)據(jù)庫(kù)之前必須先取得Connection對(duì)象一樣。Session對(duì)象不是線程安全的(Thread Safe),一個(gè)Session對(duì)象最好只由一個(gè)單一線程來使用。同時(shí)該對(duì)象的生命周期要比SessionFactory要短,一個(gè)應(yīng)用系統(tǒng)中可以自始至終只使用一個(gè)SessionFactory對(duì)象,其生命通常在完成數(shù)據(jù)庫(kù)的一個(gè)短暫的系列操作之后結(jié)束。
6.11.4實(shí)訓(xùn)題
略
第7章
Hibernate的高級(jí)組件
7.6 習(xí)題 7.6.1 選擇題
1.B 2.A 3.C 7.6.2 填空題
1.一對(duì)一、一對(duì)多和多對(duì)多 2.HQL、CQ、NSQL 3.一級(jí)Cache和二級(jí)Cache 7.6.3簡(jiǎn)答題
1.簡(jiǎn)述一對(duì)一關(guān)聯(lián)關(guān)系兩種方式的區(qū)別
答:一對(duì)一關(guān)聯(lián)關(guān)系分為主鍵關(guān)聯(lián)和外鍵關(guān)聯(lián),主鍵關(guān)聯(lián)共享一個(gè)主鍵,外鍵關(guān)聯(lián) 各自都有自己的主鍵,通過一個(gè)表的外鍵關(guān)聯(lián)起來。
2.簡(jiǎn)述事務(wù)的特性。
答:事務(wù)具備原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)4 個(gè)屬性,簡(jiǎn)稱ACID。下面對(duì)這4 個(gè)特性分別進(jìn)行說明:
? 原子性:將事務(wù)中所做的操作捆綁成一個(gè)原子單元,即對(duì)于事務(wù)所進(jìn)行的數(shù)據(jù)修改等操作,要么全部執(zhí)行,要么全部不執(zhí)行。
? 一致性:事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài),而且在相關(guān)數(shù)據(jù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都應(yīng)該是正確的。
? 隔離性:由并發(fā)事務(wù)所做的修改必須與任何其他事務(wù)所做的修改相隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是被另一并發(fā)事務(wù)修改之前的狀態(tài),要么是被另一并發(fā)事務(wù)修改之后的狀態(tài),即事務(wù)不會(huì)查看由另一個(gè)并發(fā)事務(wù)正在修改的數(shù)據(jù)。這種隔離方式也叫可串行性。
? 持久性:事務(wù)完成之后,它對(duì)系統(tǒng)的影響是永久的,即使出現(xiàn)系統(tǒng)故障也是如此。
7.6.4實(shí)訓(xùn)題
略
第9章 Spring3框架技術(shù)入門
9.5習(xí)題 9.5.1 選擇題 1.B 2.A 3.C 9.5.2 填空題
1.配置文件
2.BeanFactory接口及其相關(guān)類,ApplicationContext接口及其相關(guān)類 3.設(shè)置注入,構(gòu)造注入
9.5.3 簡(jiǎn)答題 9.5.4 實(shí)訓(xùn)題
第10章 Spring3的AOP框架
10.7習(xí)題 10.7.1 選擇題 1.B 2.D 3.C
10.7.2 填空題
1.靜態(tài)AOP,動(dòng)態(tài)AOP 2.通知
3.靜態(tài)代理,動(dòng)態(tài)代理
4.前置通知(Before Advice),后置通知(After Advice)
10.7.3 簡(jiǎn)答題 10.7.4 實(shí)訓(xùn)題