軟件架構(gòu)那點(diǎn)事兒(一)
關(guān)于標(biāo)題,我也開(kāi)始附庸文雅了。哈哈!話(huà)說(shuō)軟件架構(gòu)是本人這些年的一些積累,在此做一點(diǎn)分享,希望對(duì)即將做架構(gòu)或者是正在架構(gòu)的 ITer 一些參考,也許見(jiàn)解淺薄,還望大家多多包涵,如有異議,可私聊,禁止拍磚。說(shuō)起架構(gòu)可不是一件簡(jiǎn)單的事情,他是一個(gè)很龐大的系統(tǒng)骨架,但是面對(duì)到手的軟件需求,你是如何設(shè)計(jì)一個(gè)合理的架構(gòu)呢?原來(lái)架構(gòu)這玩意也是分第一步、第二步、第三步 ........ 以此類(lèi)推,不能急于求成,這樣容易扯著蛋。要做到手中無(wú)劍,心中有劍的境界,并非一朝一夕的努力,需要長(zhǎng)期項(xiàng)目的實(shí)踐,經(jīng)歷無(wú)數(shù)次的失敗與重構(gòu)之后再能叩開(kāi)“軟件架構(gòu)”這個(gè)大門(mén)的一絲門(mén)縫,從來(lái)一窺汪洋。
拿到一個(gè)軟件的合同或者是用戶(hù)的最原始的需求,很多架構(gòu)師的第一直覺(jué)就是關(guān)注軟件本身的功能,有哪些功能,適合采用哪些技術(shù)選型。這對(duì)于大多數(shù)人而言,的確是沒(méi)有錯(cuò)誤。但是在這之前還一點(diǎn)需要去做的事情 ...... 不知道大家想到了嗎?架構(gòu)是基于什么環(huán)境呢?這一點(diǎn)在架構(gòu)之前不知道讀者現(xiàn)在是否思考過(guò)這個(gè)問(wèn)題。所謂的架構(gòu)首先要了解軟件運(yùn)行的軟硬件以及網(wǎng)絡(luò)環(huán)境。之后明確了這一點(diǎn)才能考慮下一步的事情,否則就有點(diǎn)閉門(mén)造車(chē)的感覺(jué)了。
好了,說(shuō)到運(yùn)行環(huán)境,這是就要從硬件環(huán)境與軟件環(huán)境分別對(duì)待了,例如:
1、硬件是采用幾層架構(gòu)啊,是采用集群還是單機(jī)部署呢? 典型的網(wǎng)絡(luò)架構(gòu)是Http服務(wù)器 + Web服務(wù)器 + 數(shù)據(jù)庫(kù)服務(wù)器 。比較厲害的就是這些都放在一個(gè)機(jī)器上 哈哈~~~
2、軟件運(yùn)行的網(wǎng)絡(luò)環(huán)境如何,是基于局域網(wǎng)還是公網(wǎng)呢?是否存在隔離的情況
3、硬件是什么機(jī)器呢?IBM刀片 還是 AIX系列呢
4、系統(tǒng)的災(zāi)備設(shè)備是什么,如何運(yùn)作
......... 等等諸如此類(lèi)的硬件環(huán)境首先要了解。
硬件明確了,下來(lái)考慮軟件環(huán)境
1、軟件運(yùn)行的環(huán)境是 Window 、Linux、Unix ,是32位 /還是 64位
2、軟件運(yùn)行的Web服務(wù)器神碼 WebSphere?Weblogic、Jboss、Tomcat、GlashFish還是別的?版本號(hào)是多少,支持的J2EE規(guī)范是多少。
3、JVM是什么版本,是全新部署 還是復(fù)用甲方已經(jīng)存在的軟件環(huán)境呢?
4、軟件是否與其他軟件有數(shù)據(jù)交互,交互采用什么介質(zhì)
5、采用什么數(shù)據(jù)庫(kù),版本是多少?
.......... 這些是作為軟件環(huán)境需要考慮的一些基礎(chǔ)性的問(wèn)題
通過(guò)上述簡(jiǎn)單的文字,好像大家有點(diǎn)明白了吧,其實(shí)這種事情,很簡(jiǎn)單的,只要平時(shí)多注意點(diǎn)就OK了,否則等開(kāi)發(fā)后去現(xiàn)場(chǎng)實(shí)施才發(fā)現(xiàn)什么都不配套啊。如果在架構(gòu)開(kāi)始之前,你已經(jīng)關(guān)注這一點(diǎn)了,恭喜了 說(shuō)明你已經(jīng)具備作為架構(gòu)師最起碼的嗅覺(jué)了。
上述的那些問(wèn)題或多或少影響架構(gòu)本身,架構(gòu)是基于單機(jī)還是基于集群,這是兩種迥然不同的架構(gòu)模式,很多天真的童鞋認(rèn)為 單機(jī)與集群架構(gòu)差不多,復(fù)制一套在部署一臺(tái)機(jī)器就OK了。其實(shí)則不然。二者存在太多的不同了,我舉一些簡(jiǎn)單的例子哈:
在Java行業(yè),很多開(kāi)源軟件使用很頻繁,這些開(kāi)源軟件本身集成了Cache,用于提高性能,單系統(tǒng)是單機(jī)運(yùn)行的時(shí)候,一切都正常,做了集群出現(xiàn)問(wèn)題了。Cache 惹得禍,因?yàn)槟愕募翰](méi)有把框架內(nèi)部自帶的緩存集群化,還是保持各自獨(dú)立的狀態(tài),一用戶(hù)通過(guò)A服務(wù)器修改了內(nèi)容,并且刷新了Cache,但是作為集群的B服務(wù)器感知不到A對(duì)Cache的變化,依舊從自身的緩存中獲取“臟數(shù)據(jù)”,這時(shí)其他用訪(fǎng)問(wèn)B服務(wù)器讀到的值,其實(shí)是A用戶(hù)通過(guò)A服務(wù)器修改之前的值。很繞吧。希望能理解。瓦咔咔~~~這是架構(gòu)如果采用cache 需要重寫(xiě)自己的Cache框架,必須屏蔽開(kāi)源項(xiàng)目中自帶的Cached,否則出了問(wèn)題都讓你莫名其妙?
數(shù)據(jù)庫(kù)部署是單機(jī)還是雙機(jī),是熱備還是冷備,數(shù)據(jù)訪(fǎng)問(wèn)需要讀寫(xiě)分離嗎?如果硬件不支持?jǐn)?shù)據(jù)庫(kù)熱切換,如何采用程序?qū)崿F(xiàn)數(shù)據(jù)庫(kù)的熱切換?這些都是架構(gòu)層次的需要直接面對(duì)的問(wèn)題? 架構(gòu)師們 你們心里有底嗎?
與甲方內(nèi)部的其他系統(tǒng)是采用什么通信方式?Socket、WS、RMI,訪(fǎng)問(wèn)的系統(tǒng)之間是否有防火墻隔離,采用什么技術(shù)可以穿透防火墻阻攔呢?
以后的系統(tǒng)如何快速部署到對(duì)甲方的真實(shí)環(huán)境中,是手動(dòng)部署還是Ant自動(dòng)部署?如何做到持續(xù)集成?發(fā)送錯(cuò)誤如何回退?
......................... 現(xiàn)在是不是覺(jué)得有點(diǎn)復(fù)雜呢?其實(shí)沒(méi)關(guān)系,成長(zhǎng)有兩種,一種是汲取別人成功的經(jīng)驗(yàn)轉(zhuǎn)為為自己的能力,另外一種是嘗試失敗,從經(jīng)歷失敗中成長(zhǎng),本人呢二者兼有,前幾年都是從失敗中成長(zhǎng),但是隨著時(shí)間的推移,發(fā)現(xiàn)這樣的代價(jià)真的是很大。開(kāi)始虛心學(xué)習(xí)前人的經(jīng)驗(yàn),從而轉(zhuǎn)化為自己的知識(shí)。
掌握軟件運(yùn)行的軟硬件環(huán)境是作為架構(gòu)的第一步,切記切記!
上述文字,僅僅是作為軟件架構(gòu)之前需要考慮的一些大概,還有很多細(xì)節(jié)其實(shí)我也不是很了解,如有補(bǔ)充請(qǐng)回帖瓦咔咔~~~~ 軟件架構(gòu) 是一件藝術(shù)品~~~ 這是我對(duì)架構(gòu)的感性認(rèn)識(shí)。
每次架構(gòu)完我都會(huì)在一段時(shí)間把它當(dāng)作是完美的藝術(shù)品去欣賞,過(guò)了新鮮期后,發(fā)現(xiàn)很多問(wèn)題,直接重構(gòu) 這樣循環(huán)不已 ............. 每次的迭代 都讓自己收獲很多!
posted on 2012-02-26 20:44 paulwong 閱讀(310) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): SOFTWARE ARCHITECTURE