淺析常用軟件架構(gòu)的三種架構(gòu)模型

常用的軟件架構(gòu)模型可以歸類(lèi)為三種架構(gòu)模型:3/N層架構(gòu)、“框架+插件”架構(gòu)初橘、地域分布式架構(gòu)蚀狰。

一.三種架構(gòu)模型

1.3/N層架構(gòu)

這是經(jīng)典的多層架構(gòu)模型,對(duì)于稍微復(fù)雜一點(diǎn)或特別復(fù)雜的系統(tǒng)歇僧,不使用分層架構(gòu)是很難想象的。下圖是經(jīng)典的3層架構(gòu):

image

如今锋拖,凡是個(gè)程序員都能侃侃而談3/N層架構(gòu)馏慨,這確實(shí)是解決系統(tǒng)復(fù)雜性的一種主流模式,但是姑隅,只要采用了3/N層架構(gòu)是不是就一定能解決系統(tǒng)的復(fù)雜性了?不一定倔撞,關(guān)鍵在于你在你的系統(tǒng)中如何實(shí)作你的3/N層結(jié)構(gòu)讲仰。

在采用了3/N層架構(gòu)后,我們還是要解決以下非常重要的問(wèn)題:系統(tǒng)的可擴(kuò)展性(能從容地應(yīng)對(duì)變化)痪蝇、系統(tǒng)的可維護(hù)性(因?yàn)橄到y(tǒng)并不是使用一次就被拋 棄)鄙陡、方便部署(在需求變化時(shí),方便部署新的業(yè)務(wù)功能)躏啰、還有等等其它系統(tǒng)質(zhì)量屬性趁矾。然而系統(tǒng)的可擴(kuò)展性和可維護(hù)性是大多數(shù)軟件系統(tǒng)必須解決的重中之重, 這是由于當(dāng)前需求復(fù)雜多變的軟件環(huán)境決定的给僵。就像實(shí)現(xiàn)功能需求是最基本的毫捣,采用3/N層架構(gòu)也只是萬(wàn)里長(zhǎng)征的第一步。

我采用“框架+插件”架構(gòu)來(lái)解決與系統(tǒng)的可擴(kuò)展性帝际、可維護(hù)性和部署相關(guān)的難題蔓同。

2. “框架+插件”架構(gòu)

經(jīng)典的3/N層架構(gòu)是對(duì)系統(tǒng)進(jìn)行“縱向”分層,而“框架+插件”架構(gòu)對(duì)系統(tǒng)進(jìn)行“橫向”分解蹲诀。3/N層架構(gòu)和“框架+插件”架構(gòu)處于一個(gè)平等的位置斑粱,它們沒(méi)有任何依賴(lài)關(guān)系。

image

但是我經(jīng)常將它們結(jié)合在一起使用脯爪,我們的系統(tǒng)在經(jīng)過(guò)3/N層架構(gòu)的縱向分層和“框架+插件”架構(gòu)的橫向分層后则北,可以被看作一個(gè)“網(wǎng)格”結(jié)構(gòu),其中的 某些網(wǎng)格可以看作是“擴(kuò)展點(diǎn)”痕慢,我們可以在這些擴(kuò)展點(diǎn)處掛接“插件”尚揣。也就是說(shuō)我們可以在3/N層架構(gòu)的每一層都掛接適當(dāng)?shù)牟寮?lái)完成該層的一些功能。 如:

image

插件最主要的特點(diǎn)是可以實(shí)現(xiàn)“熱插拔”掖举,也就是說(shuō)可以在不停止服務(wù)的情況下惑艇,動(dòng)態(tài)加載/移除/更新插件。所以,采用插件技術(shù)可以實(shí)現(xiàn)以下功能:

(1)在UI層滨巴,我們可以在運(yùn)行時(shí)思灌,替換掉某些用戶(hù)界面、或加載與新的業(yè)務(wù)相關(guān)的用戶(hù)界面恭取。在業(yè)務(wù)邏輯層泰偿,我們可以在運(yùn)行時(shí)加載、替換或者刪除某項(xiàng)業(yè)務(wù)服務(wù)蜈垮。在數(shù)據(jù)訪問(wèn)層耗跛,通過(guò)使用插件技術(shù)我們可以動(dòng)態(tài)地添加對(duì)新的數(shù)據(jù)庫(kù)類(lèi)型(如MySQL)的支持。

插件的“熱插拔”功能使得我們的系統(tǒng)有非常好的可擴(kuò)展性攒发。

(2)如果我們需要升級(jí)系統(tǒng)调塌,很多情況下,只要升級(jí)我們的插件(比如業(yè)務(wù)插件)就可以了惠猿,我們可以做到在服務(wù)運(yùn)行的時(shí)候進(jìn)行插件的自動(dòng)升級(jí)羔砾。

(3)要想將系統(tǒng)做成“框架+插件”的結(jié)構(gòu),要求我們需要在系統(tǒng)的各層進(jìn)行“松耦合”設(shè)計(jì)偶妖,只有松耦合的組件才可以被做成“插件”姜凄。

在3/N層架構(gòu)中融合“框架+插件”架構(gòu),最難的是對(duì)業(yè)務(wù)邏輯層的松耦合處理趾访,這需要我們細(xì)致分析業(yè)務(wù)需求之間的關(guān)聯(lián)态秧,將耦合度緊密的業(yè)務(wù)封裝在一個(gè)組件中,如此得到的相互獨(dú)立的業(yè)務(wù)組件便可以有機(jī)會(huì)成為插件扼鞋。這個(gè)過(guò)程可能需要不斷的重構(gòu)申鱼、設(shè)計(jì)的重構(gòu)。

我們知道云头,相比于那些緊密耦合的組件润讥,松耦合的組件更加清晰明確、更加容易維護(hù)盘寡。另外楚殿,在該架構(gòu)模型中引入了AOP框架進(jìn)行Aspect焦點(diǎn)的集中 編程(比如處理日志記錄、權(quán)限管理等方面)竿痰,使得Aspect代碼不會(huì)摻雜在正常的業(yè)務(wù)邏輯代碼中脆粥,使得代碼的的清晰性、可維護(hù)性進(jìn)一步增強(qiáng)影涉。

從上述介紹可以看出变隔,采用3/N層架構(gòu)和“框架+插件”架構(gòu)相結(jié)合,我們可以增強(qiáng)系統(tǒng)的可擴(kuò)展性蟹倾、可維護(hù)性和簡(jiǎn)單部署升級(jí)的能力匣缘。

3. 地域分布式架構(gòu)

我無(wú)意中發(fā)明了“地域分布式架構(gòu)”這個(gè)詞猖闪,呵呵,不知道意思是否表達(dá)得準(zhǔn)確肌厨。地域分布式架構(gòu)主要針對(duì)類(lèi)似LBS(基于位置的服務(wù))的需要進(jìn)行地域分布的應(yīng)用培慌。 地域分布式架構(gòu)基于上述的3/N層架構(gòu)和“框架+插件”架構(gòu),它們的關(guān)系如下:

image

現(xiàn)在我對(duì)地域分布式架構(gòu)作個(gè)簡(jiǎn)單的介紹柑爸。假設(shè)我們需要為全國(guó)的各個(gè)大城市提供我們的業(yè)務(wù)功能服務(wù)吵护,假設(shè)每個(gè)城市的客戶(hù)量很大,而且每個(gè)城市訪問(wèn)的數(shù) 據(jù)可能是不一樣的(如每個(gè)城市的地圖數(shù)據(jù))表鳍、訪問(wèn)的功能也不盡相同(如有的城市提供天氣查詢(xún)服務(wù)馅而,而另一些城市不提供)∑┦ィ客戶(hù)除了跟我們的系統(tǒng)請(qǐng)求服務(wù)之 外瓮恭,可能還想通過(guò)我們的系統(tǒng)與他的好朋友進(jìn)行即時(shí)通信,而它們好朋友可能與他在同一個(gè)城市厘熟,也可能位于另外一個(gè)城市屯蹦。

好了,我們看地域分布式架構(gòu)是如何解決類(lèi)似上述的需求的盯漂。

首先,地域分布式架構(gòu)將用戶(hù)管理和業(yè)務(wù)功能服務(wù)分開(kāi)笨农,分別由應(yīng)用服務(wù)器(AS)和功能服務(wù)器(FS)負(fù)責(zé)就缆,然后將它們部署到不同的節(jié)點(diǎn)上。AS和FS都采用了3/N層架構(gòu)和“框架+插件”架構(gòu)相結(jié)合的架構(gòu)谒亦,比如竭宰,F(xiàn)S通過(guò)功能插件提供功能服務(wù)。

image

比如份招,對(duì)于武漢這個(gè)地域切揭,我們部署了一臺(tái)AS和一臺(tái)FS,客戶(hù)端通過(guò)連接到AS進(jìn)行服務(wù)請(qǐng)求锁摔。假設(shè)有一天廓旬,我們?cè)谖錆h的客戶(hù)急劇增加,這是壓力最大的是FS谐腰,因?yàn)樗械臉I(yè)務(wù)計(jì)算都是在FS上完成的孕豹。

這時(shí),地域分布式架構(gòu)將允許我們?cè)诓煌V谷魏畏?wù)的情況下十气,動(dòng)態(tài)的添加FS服務(wù)器励背,新添加的FS服務(wù)器會(huì)自動(dòng)注冊(cè)到AS。

image

AS可以監(jiān)控每個(gè)FS的負(fù)載(如CPU消耗砸西、內(nèi)存消耗)叶眉,再有客戶(hù)端請(qǐng)求到來(lái)時(shí)址儒,AS會(huì)將請(qǐng)求交給負(fù)載最低的FS處理,這就實(shí)現(xiàn)了FS的負(fù)載均衡衅疙。

如果Client A需要與Client B進(jìn)行即時(shí)通信莲趣,那么這些通信消息將通過(guò)AS中轉(zhuǎn)。

上面看到的是我們的系統(tǒng)在武漢的部署炼蛤,而在其他城市部署情況也一樣妖爷。

image

在這種情況下,AS和AS之間是相互獨(dú)立的理朋,但是經(jīng)常會(huì)發(fā)生AS之間需要相互通信的情況絮识,比如:Client A需要與Client E進(jìn)行即時(shí)通信,或者Client A需要請(qǐng)求上海地區(qū)獨(dú)有的服務(wù)嗽上,等等次舌。

地域分布式架構(gòu)使用跨區(qū)域的應(yīng)用服務(wù)器(IRAS)來(lái)解決AS之間的通信問(wèn)題。所有AS在啟動(dòng)的時(shí)候兽愤,將自動(dòng)向IRAS注冊(cè)彼念。

image

如果,我們想在長(zhǎng)沙市也提供我們的服務(wù)浅萧,那么我們只需要在長(zhǎng)沙部署我們的AS和FS逐沙,這樣就可以融入到上圖表示的整個(gè)地域分布式架構(gòu)中。

關(guān)于地域分布式架構(gòu)洼畅,就簡(jiǎn)單的介紹這么多吩案,更多的內(nèi)容,讀者可以自己去分析挖掘帝簇。

二.對(duì)架構(gòu)模型的支持

如果沒(méi)有自己的一套工具對(duì)上述的架構(gòu)模型作支持徘郭,那么你可能會(huì)認(rèn)為我是在這里胡扯、夸夸其談丧肴。在這幾年的開(kāi)發(fā)中残揉,我積累了幾套框架和類(lèi)庫(kù)用于對(duì)上述架構(gòu)模型提供支持。

(1)DataRabbit 提供了基于關(guān)系和基于ORM(輕量)的數(shù)據(jù)訪問(wèn)芋浮,通過(guò)插件的方式來(lái)支持新的數(shù)據(jù)庫(kù)類(lèi)型抱环。

(2)ESFramework 解決了分布式系統(tǒng)(如上述的地域分布式架構(gòu))之間的底層通信(直接基于TCP和UDP)。

(3)AddinsFramework 為“框架+插件”架構(gòu)模型提供支持纸巷。

(4)ESAspect 通過(guò)Proxy方式實(shí)現(xiàn)的AOP框架江醇,對(duì)方面編程提供支持。

(5)EsfDRArchitecture 為地域分布式架構(gòu)模型提供支持何暇。比如支持陶夜,F(xiàn)S的動(dòng)態(tài)添加/移除;FS的負(fù)載均衡裆站;AS與FS条辟、AS與IRAS之間的通信黔夭;跨區(qū)域的服務(wù)請(qǐng)求等等。

感覺(jué)以上的架構(gòu)設(shè)計(jì)主要偏向于J2EE方面的系統(tǒng)設(shè)計(jì)羽嫡,如果是其他的如通信系統(tǒng)的設(shè)計(jì)本姥,可能就得另當(dāng)別論。

如果有想學(xué)架構(gòu)技術(shù)的朋友可以加我的QQ群725219329杭棵,里面分享了我從業(yè)十年的編程心得婚惫,包括一些經(jīng)典的源碼分析,看看大牛的代碼是如何設(shè)計(jì)的魂爪,為什么要這樣設(shè)計(jì)先舷。還有目前最主流的分布式架構(gòu)技術(shù),微服務(wù)架構(gòu)技術(shù)等滓侍。這些技術(shù)都錄制成視頻分享在群里蒋川,大家可以免費(fèi)下載。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撩笆,一起剝皮案震驚了整個(gè)濱河市捺球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夕冲,老刑警劉巖氮兵,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異歹鱼,居然都是意外死亡泣栈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)醉冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秩霍,“玉大人篙悯,你說(shuō)我怎么就攤上這事蚁阳。” “怎么了鸽照?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵螺捐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我矮燎,道長(zhǎng)定血,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任诞外,我火速辦了婚禮澜沟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峡谊。我一直安慰自己茫虽,他們只是感情好刊苍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著濒析,像睡著了一般正什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上号杏,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天婴氮,我揣著相機(jī)與錄音,去河邊找鬼盾致。 笑死主经,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绰上。 我是一名探鬼主播旨怠,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜈块!你這毒婦竟也來(lái)了鉴腻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤百揭,失蹤者是張志新(化名)和其女友劉穎爽哎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體器一,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课锌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祈秕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渺贤。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖请毛,靈堂內(nèi)的尸體忽然破棺而出志鞍,到底是詐尸還是另有隱情,我是刑警寧澤方仿,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布湃番,位于F島的核電站谭胚,受9級(jí)特大地震影響锣杂,放射性物質(zhì)發(fā)生泄漏翔悠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一委粉、第九天 我趴在偏房一處隱蔽的房頂上張望呜师。 院中可真熱鬧,春花似錦贾节、人聲如沸汁汗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碰酝。三九已至霎匈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送爸,已是汗流浹背铛嘱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袭厂,地道東北人墨吓。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纹磺,于是被迫代替她去往敵國(guó)和親帖烘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • 源起 從C#轉(zhuǎn)java橄杨,寫(xiě)了一段時(shí)間之后覺(jué)得超級(jí)啰嗦秘症,借著Kotlin成為了android開(kāi)發(fā)的官方語(yǔ)言的契機(jī)發(fā)現(xiàn)...
    TarsL閱讀 971評(píng)論 0 0
  • 白駒過(guò)隙乡摹,時(shí)間從指縫之間悄悄溜過(guò),現(xiàn)在的我已然是一名大三即將升入大四的學(xué)生采转,大學(xué)里有很多東西都會(huì)給你留下深刻的回憶...
    廣漂男孩大明閱讀 435評(píng)論 3 4
  • 只要一想到這個(gè)主題,一部電影名字就會(huì)出現(xiàn)在我的腦海里察绷,“He is not that into you”干签。當(dāng)時(shí)看這...
    迎刃閱讀 751評(píng)論 5 7
  • 十五歲那年,當(dāng)全班同學(xué)都在瘋狂傳寫(xiě)同學(xué)錄的時(shí)候,我買(mǎi)了一本當(dāng)時(shí)覺(jué)得很漂亮的本子, 然后用五顏六色的熒光筆工工整整地...
    木洛Mlo閱讀 181評(píng)論 0 1