SpringSide開發(fā)實(shí)戰(zhàn)(八):不是結(jié)局的結(jié)局,談?wù)劤绦騿T的境界
Posted on 2007-03-28 22:40 京山游俠 閱讀(5051) 評(píng)論(23) 編輯 收藏 所屬分類: SpringSide開發(fā)實(shí)戰(zhàn) SpringSide是個(gè)好東西,對(duì)我來(lái)說(shuō),它的好主要體現(xiàn)在兩個(gè)方面:一、它提供了一個(gè)敏捷開發(fā)的框架,省去了我自己整合Spring、Hibernate、Struts、ActiveMQ等等開源組件的時(shí)間,而且還是最佳實(shí)踐;二、它指導(dǎo)了我的學(xué)習(xí)目標(biāo),在SpringSide中整合的各種組件,都是在同一類組件中最優(yōu)秀的,而且要想熟練使用這些組件,都必須對(duì)它們進(jìn)行深入的系統(tǒng)的學(xué)習(xí)。
本來(lái)以為我會(huì)在SpringSide開發(fā)實(shí)戰(zhàn)系列中寫更多的文章,但是寫到現(xiàn)在,我認(rèn)為應(yīng)該要寫結(jié)局了,為什么呢?因?yàn)樵谑褂肧pringSide進(jìn)行項(xiàng)目開發(fā)的過(guò)程中,我越來(lái)越感覺(jué)到項(xiàng)目絕對(duì)不是各種組件的簡(jiǎn)單堆砌,而是程序員要不斷有自己的想法和創(chuàng)意,并能夠抽象到一個(gè)高度。這也正是為什么我的文章從第一篇到第八篇越來(lái)越偏離SpringSide的核心了。在這里,我主要想談?wù)劤绦騿T的境界。以下觀點(diǎn)純屬個(gè)人看法,歡迎大家探討。
第一層境界:從不能到能。
可以這么說(shuō),早在7年前我就已經(jīng)熟練掌握C語(yǔ)言、Visual FoxPro數(shù)據(jù)庫(kù)、HTML、CSS和JavaScript,C語(yǔ)言和Visual FoxPro是學(xué)校教的,HTML、CSS和JavaScript是自學(xué)的,同時(shí),我還自學(xué)了Flash動(dòng)畫制作和Photoshop圖像處理。但是,我那時(shí)候還不知道應(yīng)用程序開發(fā),學(xué)的這些東西無(wú)非就是好玩,偶爾參加一次學(xué)校主辦的網(wǎng)頁(yè)設(shè)計(jì)大賽而已。
我開發(fā)的第一個(gè)應(yīng)用是《銀符英語(yǔ)在線》,使用的是ASP + SQL Server 2000,時(shí)間是2004年,那時(shí)我剛考過(guò)軟件設(shè)計(jì)師(原高級(jí)程序員),有人找我做程序,他說(shuō)想做一個(gè)英語(yǔ)四六級(jí)的在線考試系統(tǒng),問(wèn)我能不能做到,我毫不猶豫就說(shuō)能。我想我確實(shí)是具有軟件設(shè)計(jì)方面的天賦,用了一個(gè)星期設(shè)計(jì)出數(shù)據(jù)庫(kù),再用一個(gè)星期寫了一個(gè)Demo,一下子就把他征服了,于是,他當(dāng)老板,我當(dāng)程序員,一起進(jìn)行在線英語(yǔ)考試方面的開發(fā)。
在這段時(shí)間,我覺(jué)得我不折不扣就是處于這第一層境界。JScript我早已是滾瓜亂熟,ASP教程更隨處可得。在這段時(shí)間里,我用全JScript代碼實(shí)現(xiàn)了用戶認(rèn)證和權(quán)限管理,用Visual C++寫了個(gè)COM組件進(jìn)行數(shù)據(jù)的加密和解密,還在網(wǎng)上到處搜索文件上傳和動(dòng)態(tài)圖片生成方面的解決辦法。當(dāng)時(shí),我覺(jué)得我的開發(fā)過(guò)程充實(shí)而滿足;現(xiàn)在看來(lái),我只不過(guò)是一個(gè)重復(fù)發(fā)明輪子的傻冒。
在10個(gè)月的時(shí)間里,我把這個(gè)程序從1.0版開發(fā)到3.0版,功能上進(jìn)行了不少升級(jí)。但是我認(rèn)為升級(jí)最大的還是我的技術(shù),我盡我最到的能力將代碼與網(wǎng)頁(yè)分離,盡我最到的能力減少代碼的重復(fù),甚至已經(jīng)基本做到使用模式來(lái)讓程序更加容易擴(kuò)充和維護(hù)。我所做的一切,與現(xiàn)代的一些Web開發(fā)框架已經(jīng)不謀而合。但是,以我當(dāng)時(shí)的內(nèi)力,確實(shí)沒(méi)有辦法將之抽象為一個(gè)框架。我的程序中依然充滿了意大利面條式的代碼,而且在在線人數(shù)多的時(shí)候,網(wǎng)頁(yè)會(huì)慢得象蝸牛爬。
第二層境界:從能做到做得漂亮
2005年,我開始接觸Java,以我的基礎(chǔ),自然是很快就學(xué)會(huì)了Java的語(yǔ)法并進(jìn)軍J2EE。我覺(jué)得Java開源世界給了我不少能量,在這兩年里,我的進(jìn)步速度是呈指數(shù)式的。以我現(xiàn)在的水平,僅使用JSP和Servlet,已經(jīng)足以解決絕大部分的需求。然而,僅使用JSP和Servlet就是全部嗎?
這個(gè)時(shí)候,我們不僅僅要能夠完成應(yīng)用程序的編寫,更重要的要讓應(yīng)用程序便于維護(hù)和便于擴(kuò)充。這時(shí)候,沒(méi)有足夠的抽象能力是不夠的。要能夠理解和應(yīng)用分層架構(gòu),要知道MVC、IoC、AOP、ORM,要了解聲明式事務(wù)處理,還要學(xué)會(huì)最流行了AJAX。所有的這一切,不僅能夠讓我們的應(yīng)用便于維護(hù),合理使用各開源組件還能加快開發(fā)的速度,但是最重要的,它們能使我們的應(yīng)用充滿藝術(shù)的美感。
在SpringSide社區(qū),現(xiàn)在最流行的是Acegi,這也是對(duì)安全與權(quán)限功能的一種抽象。本來(lái)我也想寫一篇Acegi方面的文章,但是cac寫的文檔是在是太完美、太經(jīng)典了,我無(wú)法超越。我們應(yīng)該讓我們的應(yīng)用盡量向Acegi靠攏,因?yàn)?,它代表的就是安全與權(quán)限領(lǐng)域的最佳實(shí)踐。
第三層境界:從程序員到架構(gòu)師
架構(gòu)師可以干什么?如何讓應(yīng)用在性能,伸縮性,擴(kuò)展性、可靠性,容災(zāi),可恢復(fù)性,可管理性等方面做到最好,就是架構(gòu)師的職責(zé),同時(shí),架構(gòu)師要能夠把握軟件開發(fā)的整個(gè)周期。由于我還只是一個(gè)程序員,也沒(méi)有精力去學(xué)習(xí)架構(gòu)師方面的只是,因此上面的論述可能不準(zhǔn)確。但是,作為一個(gè)程序員,上升到一個(gè)境界之后,確實(shí)應(yīng)該考慮編碼之外的東西了。
舉例說(shuō)明,cnblogs的博客程序算式比較完善的了,我個(gè)人對(duì)站長(zhǎng)dudu也是充滿了仰慕。cnblogs的1.0Beta2版本我也下載得有,本打算使用它建一個(gè)自己的博客網(wǎng)站,但是卻不行,因?yàn)樗谛阅埽炜s性,擴(kuò)展性方面都達(dá)不到我的要求。
不信?看看現(xiàn)在www.cnblogs.com吧,注冊(cè)用戶已經(jīng)2萬(wàn)多了,速度也是越來(lái)越慢,經(jīng)過(guò)我一nslookup,發(fā)現(xiàn)它還只是一臺(tái)主機(jī)在運(yùn)行,而www.tianya.cn則是一個(gè)服務(wù)器集群。如下圖:
造成這個(gè)問(wèn)題的原因,主要就是架構(gòu)的問(wèn)題。cnblogs是基于.net的,.net運(yùn)行于IIS之上,而IIS又是那么的簡(jiǎn)單,更本不具備配置Cluster的功能。而cnblogs的程序在設(shè)計(jì)的時(shí)候也沒(méi)有往集群方面考慮,甚至是想多配置幾個(gè)數(shù)據(jù)庫(kù)都是困難的。
解決網(wǎng)站性能的辦法有幾種,一是向上擴(kuò)展,也就是不斷增加服務(wù)器的CPU和內(nèi)存,但是這種擴(kuò)展價(jià)格非常昂貴;二是向外擴(kuò)展,也就是多增加幾臺(tái)廉價(jià)的Web服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,但是由于cnblogs在設(shè)計(jì)的時(shí)候沒(méi)有考慮到集群功能,就必須得重構(gòu)所有的代碼,這個(gè)工作量實(shí)在是太大了;三是垂直分割,也就是目前博客園所采用的方法,就是讓一臺(tái)主機(jī)負(fù)責(zé).net博客,一臺(tái)主機(jī)負(fù)責(zé)java博客等等,把不同的應(yīng)用分開。這樣帶來(lái)的負(fù)面影響是我們就沒(méi)有辦法在同一個(gè)博客上面同時(shí)寫.net、java、c++方面的隨筆了,這確實(shí)讓我感覺(jué)不爽,此外,在.net領(lǐng)域這樣訪問(wèn)量大的領(lǐng)域,一樣會(huì)使服務(wù)器不堪重負(fù)。
我不能讓我的程序重蹈覆轍,因此,在架構(gòu)階段就應(yīng)該考慮到Cluster,考慮到負(fù)載均衡,考慮到可擴(kuò)充性,并同時(shí)使用水平分割策略。水平分割策略和垂直分割策略不同,是讓每一個(gè)Web服務(wù)器都應(yīng)該能夠使用程序的所有功能,而讓不同的用戶使用不同的服務(wù)器,比如id為0-10000的用戶和www1.cnblogs.com交互,10001-20000的用戶和www2.cnblogs.com交互,等等,如下圖所示:
這個(gè)時(shí)候,服務(wù)器www.cnblogs.com作為負(fù)載均衡服務(wù)器,它根據(jù)登錄用戶的ID將該用戶請(qǐng)求重定向到www1.cnblogs.com或者www2.cnblogs.com,對(duì)于匿名用戶,它把用戶請(qǐng)求隨機(jī)重定向到www1.cnblogs.com或者www2.cnblogs.com。
同時(shí),為了能夠讓負(fù)載均衡服務(wù)器能夠根據(jù)不同的用戶來(lái)重定向到不同的Web服務(wù)器,又要讓每個(gè)Web服務(wù)器上的應(yīng)用都能夠得到所有各個(gè)數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)的總的索引,需要有一個(gè)索引數(shù)據(jù)庫(kù)服務(wù)器,如下圖:
此外,我們還應(yīng)該讓W(xué)eb服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器可以動(dòng)態(tài)增加,也就是當(dāng)某一個(gè)服務(wù)器負(fù)載到達(dá)極限時(shí),我們可以添加一臺(tái)服務(wù)器,只需要修改配置文件即可,無(wú)需更改代碼,如下圖:
同時(shí)配合使用動(dòng)態(tài)頁(yè)面靜態(tài)化技術(shù),靜態(tài)化后的html頁(yè)面和圖片文件都保存在Web服務(wù)器上,此時(shí)Web服務(wù)器有同時(shí)擔(dān)當(dāng)了緩存服務(wù)器的功能。當(dāng)達(dá)到IO瓶頸的限制后,又可以通過(guò)服務(wù)器加大內(nèi)存或?yàn)榉?wù)器配置SAN(存儲(chǔ)區(qū)域網(wǎng)絡(luò))來(lái)解決問(wèn)題。
好了,SpringSide系列的文章就寫這么多吧。期待SpringSide 2.0正式版的發(fā)布。我會(huì)把它用到實(shí)際的項(xiàng)目開發(fā)中。