最近再看阮一峰的一篇博客提到了一本書《Software Architecture Patterns》(PDF)
,寫的不錯,雖然英語很屎,過年找點事干,試著翻(gu)譯(ge)一下.以下為翻譯的內(nèi)容奥溺,祝我能夠翻譯完,并借此機(jī)會能夠加深對架構(gòu)的認(rèn)識励七。
ps:建議看英文原著接箫。
ps:[ ]中的話是我說的矩距。
ps:好吧,我找到已經(jīng)有一個翻譯版本了(https://github.com/hehonghui/android-tech-frontier/tree/master/software-architecture-patterns)
早看到就不翻譯了......
介紹
開發(fā)人員在沒有合適架構(gòu)的情況下開始編寫程序是非常普遍的情況. 在這種情況下,大多數(shù)開發(fā)人員和架構(gòu)師會采用傳統(tǒng)分層架構(gòu)模式(也稱為n層架構(gòu)),通過將源碼模塊分成各種包來表示抽象層。不幸的是,這種做法經(jīng)常導(dǎo)致的是一個混亂的源碼結(jié)構(gòu)蒸走,它們?nèi)狈γ鞔_的角色,職責(zé)和彼此之間的關(guān)系貌嫡。 這通常被稱為反模式的大泥球比驻。
沒有通過架構(gòu)設(shè)計的應(yīng)用程序通常緊密耦合,脆弱岛抄,難以改變别惦,沒有清晰結(jié)構(gòu)。如果沒有完全理解系統(tǒng)中的每個組件和模塊的內(nèi)部工作原理的情況下夫椭,確定程序的架構(gòu)特性會是非常困難的事情掸掸。關(guān)于程序部署和維護(hù)的基本問題也會很難回答:架構(gòu)是否具有可擴(kuò)展性?應(yīng)用程序的性能如何蹭秋? 程序是否能夠應(yīng)對變化扰付?程序如何部署?架構(gòu)的響應(yīng)能力如何感凤?
架構(gòu)模式有助于定義應(yīng)用程序的基本特征和行為悯周。 例如,一些架構(gòu)模式非常適合需要高可擴(kuò)展性的應(yīng)用程序陪竿,一些架構(gòu)模式則適用于非常靈活的應(yīng)用程序禽翼。 只有了解各種架構(gòu)模式的優(yōu)勢和弱點屠橄,才能夠選擇出滿足自己業(yè)務(wù)特點和目標(biāo)的架構(gòu)模式。
作為一個架構(gòu)師闰挡,你必須證明你的架構(gòu)決策锐墙,特別是當(dāng)涉及到選擇一個特定的架構(gòu)模式或方法。 這篇文正的目的是為您提供足夠的信息长酗,以證明你的選擇是OK的溪北。
1.分層架構(gòu)(Layered Architecture)
分層架構(gòu)是最常見的架構(gòu),也是javaee應(yīng)用程序的標(biāo)準(zhǔn)模式夺脾,并被多數(shù)開發(fā)人員了解之拨。這種架構(gòu)適合于傳統(tǒng)IT通信和組織結(jié)構(gòu),成為大多數(shù)業(yè)務(wù)應(yīng)用程序開發(fā)工作的自然選擇咧叭。
模式描述(Pattern Description)
該架構(gòu)中每一層都包含多個組件并且擁有具體的職責(zé)(例如顯示邏輯蚀乔、業(yè)務(wù)邏輯)。該架構(gòu)并不嚴(yán)格規(guī)定層的類型和層數(shù)菲茬,多數(shù)分層架構(gòu)包含視圖層吉挣、業(yè)務(wù)層、持久化層和數(shù)據(jù)庫層(圖1-1)婉弹。有時睬魂,業(yè)務(wù)層和持久層被合并為單個業(yè)務(wù)層,特別是當(dāng)持久性邏輯(例如镀赌,生成SQL或HSQL)嵌入到業(yè)務(wù)層組件中氯哮。因此,較小的應(yīng)用可以僅具有三個層佩脊,而大的應(yīng)用可以包含五個或更多個層[對于多數(shù)應(yīng)用四層足以]蛙粘。
分層架構(gòu)模式的每一層在應(yīng)用程序中都有特定的角色和職責(zé)。例如威彰,表示層將負(fù)責(zé)處理所有的用戶界面邏輯出牧,而業(yè)務(wù)層負(fù)責(zé)響應(yīng)表示層的請求并執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。架構(gòu)中的每一層都圍繞需要完成的工作形成抽象歇盼,以滿足特定的業(yè)務(wù)請求舔痕。例如,表示層不需要知道或擔(dān)心如何獲得客戶數(shù)據(jù);它只需要在特定格式的屏幕上顯示該信息豹缀。類似地伯复,業(yè)務(wù)層不需要關(guān)心如何格式化客戶數(shù)據(jù)以在屏幕上顯示或者甚至在客戶數(shù)據(jù)來自哪里;它只需要從持久層獲得數(shù)據(jù),對數(shù)據(jù)執(zhí)行業(yè)務(wù)邏輯(例如邢笙,計算值或聚合數(shù)據(jù))啸如,并將該信息傳遞到表示層。
分層架構(gòu)模式的一個強(qiáng)大的功能是組件之間的關(guān)注點分離(separation of concerns)氮惯。 特定層中的組件僅處理與該層相關(guān)的邏輯叮雳。 例如想暗,表示層中的組件只處理表示邏輯,而業(yè)務(wù)層的組件只處理業(yè)務(wù)邏輯帘不。 這種組件分類方式使您可以輕松地在您的架構(gòu)中構(gòu)建有用的模型说莫,并且由于定義明確的組件接口和有限的組件范圍,還可以輕松地使用此架構(gòu)模式開發(fā)寞焙,測試储狭,管理和維護(hù)應(yīng)用程序。
關(guān)鍵概念(Key Concepts)
在圖1-2中捣郊,架構(gòu)中的每個層都標(biāo)記為封閉辽狈。這是分層架構(gòu)模式中非常重要的概念。 關(guān)閉意味著當(dāng)請求從一個層移動到另一個層時呛牲,它必須經(jīng)過它的下層稻艰,才能到達(dá)目的層。 例如侈净,一個請求從表示層要到數(shù)據(jù)庫層就必須經(jīng)過業(yè)務(wù)層和持久層。
那么為什么不允許表示層直接訪問持久層或數(shù)據(jù)庫層僧凤? 畢竟畜侦,從表示層的直接數(shù)據(jù)庫訪問比通過一堆不必要的層來檢索或保存數(shù)據(jù)庫信息要快得多。 這個問題的答案在于一個被稱為隔離層(layers of isolation)的關(guān)鍵概念躯保。
隔離層意味著在一個層的變化通常不會影響到其它層的組件旋膳。 如果你允許表示層直接訪問持久層,那么持久層的變化將會同時影響業(yè)務(wù)層和表示層途事, 從而產(chǎn)生了非常緊密耦合和組件之間的依賴性验懊。當(dāng)需求發(fā)生變化時,這種架構(gòu)將會付出較大的代價尸变。
隔離概念的層還意味著每個層獨(dú)立于其他層义图,并且不需要知道其它層是如何工作的。 為了理解這個概念的重要性召烂,考慮一個大規(guī)模的重構(gòu)碱工,將展示框架從JSP(Java服務(wù)器頁面)修改為JSF(Java服務(wù)器面。假設(shè)在表示層和業(yè)務(wù)層之間使用的契約(contracts)(例如奏夫,模型)保持相同怕篷,則業(yè)務(wù)層不受重構(gòu)的影響并且完全和表示層保持獨(dú)立。
雖然封閉的層有助于層次之間的隔離酗昼,從而提高了架構(gòu)的低耦合設(shè)計廊谓,但有時候某些層被打開是有意義的。 例如麻削,假設(shè)您要增加一個共享服務(wù)層向業(yè)務(wù)層的組件提供服務(wù)(例如蒸痹,數(shù)據(jù)和字符串實用程序類或?qū)徲嫼腿罩居涗涱悾?在這種情況下創(chuàng)建服務(wù)層通常是一個好主意春弥,因為在體系結(jié)構(gòu)上,它將對共享服務(wù)的訪問限制為業(yè)務(wù)層(而不是表示層)电抚。 沒有單獨(dú)的層惕稻,在架構(gòu)上沒有限制表示層訪問這些公共服務(wù),使得難以管理該訪問限制[這句話沒看懂蝙叛,回頭再看]俺祠。
在該示例中,新服務(wù)層可能駐留在業(yè)務(wù)層之下借帘,同時表明該服務(wù)層中的組件不能被表示層訪問蜘渣。 然而,這衍生出一個新的問題肺然,業(yè)務(wù)層需要經(jīng)過服務(wù)層以到達(dá)持久層蔫缸,但這根本沒有意義。 這是分層架構(gòu)的一個古老的問題际起,需要通過在架構(gòu)內(nèi)創(chuàng)建開放層來解決拾碌。
如圖1-3所示,在這種情況下街望,服務(wù)層被標(biāo)記為打開校翔,意味著改層可以被繞過。 在以下示例中灾前,由于服務(wù)層是打開的防症,因此業(yè)務(wù)層現(xiàn)在允許繞過它,并直接轉(zhuǎn)到持久層哎甲,這是完全合理的蔫敲。
利用開放層和封閉層的概念有助于定義層次和請求流之間的關(guān)系,并且向設(shè)計者和開發(fā)者提供理解架構(gòu)內(nèi)的各種層訪問限制的必要信息炭玫。如果不能確定架構(gòu)中的哪些層是開放和封閉的(以及為什么)通常會導(dǎo)致架構(gòu)難以測試奈嘿,維護(hù)和部署的緊密耦合和脆弱。
架構(gòu)例子(Pattern Example)
為了說明分層架構(gòu)的工作原理吞加,考慮一個來自用戶檢索客戶信息的請求指么,如圖1-4所示。 黑色箭頭顯示請求流向數(shù)據(jù)庫以檢索客戶數(shù)據(jù)榴鼎,紅色箭頭顯示響應(yīng)返回到屏幕以顯示數(shù)據(jù)伯诬。 在該示例中,客戶信息包括客戶數(shù)據(jù)和訂單數(shù)據(jù)(由客戶下達(dá)的訂單)巫财。
如圖所示盗似,customer screen模塊負(fù)責(zé)接受用戶請求并顯示客戶信息,它不知道數(shù)據(jù)在哪里平项,如何檢索赫舒,也不了解數(shù)據(jù)庫悍及,該模塊收到查詢客戶信息的請求后,將該請求轉(zhuǎn)發(fā)到customer delegate模塊接癌,該模塊負(fù)責(zé)了解業(yè)務(wù)層中哪些模塊可以處理該請求心赶,以及如何獲取該模塊需要的數(shù)據(jù)(例如合同數(shù)據(jù))。業(yè)務(wù)層中的custom object負(fù)責(zé)收集(aggregating)業(yè)務(wù)請求所需的所有信息(該例子中是指客戶信息)缺猛。該模塊調(diào)用customer dao(數(shù)據(jù)訪問對象)模塊在持久層中獲取客戶數(shù)據(jù)缨叫,并且還通過order dao模塊獲取訂單信息。這些模塊又執(zhí)行SQL語句來檢索相應(yīng)的數(shù)據(jù)荔燎,并將其傳回給業(yè)務(wù)層中的customer object模塊耻姥。一旦customer object接收到數(shù)據(jù),它整合數(shù)據(jù)并將該信息傳遞回customer delegate有咨,然后將該數(shù)據(jù)傳遞到customer screen以呈現(xiàn)給用戶琐簇。
從技術(shù)的角度來看,這些模塊可以有很多實現(xiàn)方式座享。 例如婉商,在Java平臺中,customer screen模塊可以是(JSF) Java Server Faces screen渣叛,它和customer delegage可以作為被管理的bean組件 据某。業(yè)務(wù)層中的customer object可以是本地Spring bean對象或遠(yuǎn)程EJB3 bean對象。 之前示例中的客戶和訂單數(shù)據(jù)可以由POJO诗箍,MyBatis XML Mapper,甚至可以是JDBC調(diào)用或Hibernate查詢返回的數(shù)據(jù)封裝挽唉。 在Microsoft平臺中滤祖,customer screen可以是基于.net技術(shù)體系A(chǔ)SP(活動服務(wù)器頁面)模塊,客戶和訂單數(shù)據(jù)可以由為ADO(ActiveX數(shù)據(jù)對象)實現(xiàn)瓶籽。
注意事項(Considerations)
分層架構(gòu)是比較實用并且通用的模式匠童,對于多數(shù)程序是一個良好起點,尤其是當(dāng)您不確定哪種架構(gòu)模式最適合您的應(yīng)用程序時塑顺。 當(dāng)選擇這種模式時汤求,你需要從架構(gòu)的角度來考慮一下幾點。
要注意的第一件事是所謂的污水池反模式(architecture
sinkhole anti-pattern)[誰能解釋一下這是啥意思]严拒。 這個反模式是這樣的扬绪,請求流簡單的穿過幾個層,每層里面基本沒有做任何業(yè)務(wù)邏輯裤唠,或者做了很少的業(yè)務(wù)邏輯挤牛。 例如,假設(shè)表示層響應(yīng)來自用戶的檢索客戶數(shù)據(jù)的請求种蘸。 表示層將請求傳遞給業(yè)務(wù)層墓赴,業(yè)務(wù)層簡單地將請求傳遞給持久層竞膳,然后對數(shù)據(jù)庫層進(jìn)行簡單的SQL調(diào)用以檢索客戶數(shù)據(jù)。 然后诫硕,數(shù)據(jù)一路返回坦辟,沒有用于聚集(aggregate),計算或變換數(shù)據(jù)的額外處理或邏輯章办。
每個分層架構(gòu)將具有至少一些落入反模式(architecture
sinkhole anti-pattern)的情況锉走。 這里面的關(guān)鍵是分析出屬于此類別的請求的百分比。 80-20規(guī)則通常是一個良好的做法纲菌,以確定是否正在經(jīng)歷這種情況挠日。通常將大約20%的請求作為簡單傳遞處理,80%的請求具有與請求相關(guān)聯(lián)的某些業(yè)務(wù)邏輯翰舌。 但是嚣潜,如果您發(fā)現(xiàn)此比例相反,并且大多數(shù)請求是簡單的直通處理椅贱,您可能需要考慮使一些架構(gòu)層打開懂算,需要注意的是這樣會讓層次的耦合度提高,使軟件變得不易改變庇麦。
分層體系結(jié)構(gòu)模式需要注意的另一個問題是计技,它會使得應(yīng)用程序變得monolithic[這個詞不知道怎么翻譯合適],即使你將表示層和業(yè)務(wù)層分成單獨(dú)的可部署單元山橄。 雖然某些應(yīng)用程序不在乎這些問題[規(guī)模小的程序]垮媒,但它的確會帶來部署,通用魯棒性和可靠性航棱,性能和可擴(kuò)展性等方面的一些潛在問題睡雇。
模式分析(Pattern Analysis)
以下內(nèi)容包含分層架構(gòu)模式的常見架構(gòu)特性的評級和分析。每個特性的評級基于適用于該模式的普通場景饮醇。 對于此模式與本報告中其他模式如何相關(guān)的并行比較它抱,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:低
- 分析:靈活性是針對不斷變化的環(huán)境做出快速反應(yīng)的能力。 雖然可以通過該模式的層次隔離特點來應(yīng)對變化朴艰,但是由于monolithic性質(zhì)和這種模式帶來的組件間緊耦合的特性观蓄,在該體系結(jié)構(gòu)模式中進(jìn)行改變?nèi)匀皇欠爆嵑秃臅r的。
可部署性(Ease of deployment)
- 級別:低
- 分析:對于由該模式實現(xiàn)的大型應(yīng)用程序來講祠墅,部署可能會是一個問題 侮穿。對組件的一個小改變可能需要重新部署整個應(yīng)用程序(或應(yīng)用程序的大部分),導(dǎo)致需要加班進(jìn)行規(guī)劃毁嗦,調(diào)度和執(zhí)行的部署撮珠。因此,此模式不適合進(jìn)行可持續(xù)部署,進(jìn)一步降低了部署的總體評級芯急。
可測試性(Testability)
- 級別:高
- 分析:因為組件都隸屬于某層勺届,而且其他層可以被插樁或者模擬,所以該模式相對容易測試娶耍。 開發(fā)人員可以通過模擬展示層中的組件中進(jìn)行業(yè)務(wù)層中組件的測試免姿,或者模擬業(yè)務(wù)層以測試某些展示層組件的功能。
性能(Performance)
級別:低
分析:雖然一些分層架構(gòu)可以很好地執(zhí)行榕酒,但是由于必須經(jīng)歷架構(gòu)的多個層以滿足業(yè)務(wù)請求胚膊,效率較低,所以該模式不適用于高性能應(yīng)用想鹰。
可擴(kuò)展性(Scalability)
- 級別:低
- 分析:由于這種模式的緊密耦合和monolithic特點紊婉,使用此架構(gòu)模式的應(yīng)用程序構(gòu)建通常難以擴(kuò)展。 您可以通過將層拆分為單獨(dú)的物理部署或?qū)⒄麄€應(yīng)用程序復(fù)制到多個節(jié)點來擴(kuò)展分層體系結(jié)構(gòu)辑舷,但總體來說喻犁,粒度太分散,這使其擴(kuò)展成本昂貴何缓。
開發(fā)容易度(Ease of development)
- 級別:高
- 分析:易于開發(fā)獲得相對高的分?jǐn)?shù)肢础,主要是因為這種模式是如此眾所周知的,并且實現(xiàn)起來不太復(fù)雜碌廓。 因為大多數(shù)公司通過分層(界面传轰,業(yè)務(wù),數(shù)據(jù)庫)分離技能集來開發(fā)應(yīng)用程序谷婆,所以這種模式成為大多數(shù)業(yè)務(wù)應(yīng)用程序開發(fā)的自然選擇慨蛙。 公司的溝通和組織結(jié)構(gòu)之間的聯(lián)系以及開發(fā)軟件的方式被概述了所謂的 Conway’s law。
2.事件驅(qū)動架構(gòu)(Event-Driven Architecture)
事件驅(qū)動架構(gòu)模式是一個構(gòu)建高擴(kuò)展性程序的分布式異步架構(gòu)模式纪挎。 它還具有高度適應(yīng)性期贫,可用于小型應(yīng)用和大型大型應(yīng)用或者是復(fù)雜的應(yīng)用。事件驅(qū)動架構(gòu)由異步接收廷区、處理事件的組件構(gòu)成,這些組件是高度解耦和職責(zé)單一的贾铝。
事件驅(qū)動的架構(gòu)模式由兩種拓?fù)?topology)方式隙轻,即mediator和broker。當(dāng)你想要在事件內(nèi)編排一些步驟時需要mediator拓?fù)鋄wtf這句話]垢揩,而當(dāng)您想要將事件鏈接在一起而不使用中央mediator時玖绿,你需要broker拓?fù)洹R驗檫@兩種拓?fù)浣Y(jié)構(gòu)的架構(gòu)特性和實現(xiàn)策略不同叁巨,所以了解每一種拓?fù)浣Y(jié)構(gòu)最適合您的特定情況是非常重要的斑匪。
Mediator拓?fù)?Mediator Topology)
Mediator拓?fù)溥m用于事件需要經(jīng)過多個步驟處理的情況。 例如锋勺,進(jìn)行股票交易的一個事件可能需要您首先驗證交易蚀瘸,然后檢查該股票交易是否符合各種合規(guī)規(guī)則狡蝶,將交易分配給經(jīng)紀(jì)人,計算傭金贮勃,最后完成交易贪惹。 所有這些步驟需要進(jìn)行精心的安排,從而可以順序的執(zhí)行.
在Mediator拓?fù)溆炙牟糠纸M成:事件隊列,事件mediator,事件通道和事件處理器.事件流從客戶端向事件隊列發(fā)送事件開始,事件隊列用于將事件傳輸?shù)绞录ediator.事件mediator接收事件后,通過向事件通道發(fā)送異步事件來執(zhí)行該事件的每個處理步驟.事件處理器監(jiān)聽事件通,并執(zhí)行特定的業(yè)務(wù)邏輯來處理事件寂嘉。 圖2-1說明了事件驅(qū)動架構(gòu)模式的Mediator拓?fù)?
在事件驅(qū)動架構(gòu)中奏瞬,通常有十幾到幾百個事件隊列。 該模式不指定事件隊列組件的實現(xiàn); 它可以是消息隊列泉孩,web服務(wù)端點或者其他什么東西硼端。
該模式中有兩種類型的事件:初始事件和處理事件.初始事件是由調(diào)解器接收的原始事件设联,而處理事件是由調(diào)解器生成并且由事件處理組件接收的事件顽冶。
事件mediator 組件負(fù)責(zé)協(xié)調(diào)初始事件中包含的步驟。 對于初始事件中的每一步破喻,事件mediator將特定的處理事件發(fā)送到事件通道订咸,然后由事件處理器接收并處理曼尊。 重要的是注意事件mediator實際上不執(zhí)行處理初始事件所必需的業(yè)務(wù)邏輯; 它只知道處理初始事件所需的步驟。
事件通道被事件mediator異步地將初始事傳遞給事件處理模塊. 事件通道可以是消息隊列或消息topics脏嚷,盡管消息topics和mediator拓?fù)渫ǔ7旁谝黄鹗褂玫母嘁恍┞嫫玻沟锰幚硎录梢杂啥鄠€事件處理器(每個事件處理器基于接收到的處理事件執(zhí)行不同的任務(wù))來處理[我感覺這里消息隊列和消息topics是兩個并列的概念,消息topics是指的是每個事件都能被處理模塊得到,有點像pub/sub,而消息隊列指的是每個事件只能又一個處理模塊得到,有點像pipeline]。
事件處理器組件包含處理處理事件所需的業(yè)務(wù)邏輯代碼父叙。 事件處理器是在應(yīng)用或系統(tǒng)中執(zhí)行特定任務(wù)的自包含的(self-contained)神郊,獨(dú)立的,低耦合的架構(gòu)組件[就是指業(yè)務(wù)模塊]趾唱。盡管事件處理器組件的粒度可以從細(xì)粒度(例如涌乳,計算訂單上的銷售稅)到 粗粒度(例如,處理保險索賠),重要的是每個事件處理器組件應(yīng)該執(zhí)行單個業(yè)務(wù)任務(wù)甜癞,而不依賴于其他事件處理器完成其特定任務(wù)[業(yè)務(wù)模塊之間不應(yīng)該產(chǎn)生相互依賴]夕晓。
事件mediator可以以多種方式實現(xiàn). 作為架構(gòu)師,您應(yīng)該了解每個細(xì)節(jié)悠咱,以確保該模式的解決方案符合您的需求蒸辆。
事件mediator的最簡單和最常見的實現(xiàn)是通過開源框架,例如Spring Integration析既,Apache Camel或Mule ESB.這些開源集成中心中的事件流通常通過Java代碼或DSL(領(lǐng)域?qū)S谜Z言)實現(xiàn)躬贡。 對于更復(fù)雜的中介和編排,您可以使用BPEL(domain-specific language)以及BPEL引擎(如開放源代碼Apache ODE)眼坏。 BPEL是一種標(biāo)準(zhǔn)的類似XML的語言拂玻,它描述了處理初始事件所需的數(shù)據(jù)和步驟。 對于需要更復(fù)雜的編排(包括涉及人員交互的步驟)的非常大的應(yīng)用程序,您可以使用業(yè)務(wù)流程管理器(BPM)(如jBPM)實現(xiàn)事件仲裁器檐蚜。
理解您的需求并選擇合適的事件mediator實現(xiàn)魄懂,對使用此拓?fù)涞娜魏问录?qū)動成功至關(guān)重要。 使用開源集成中心來執(zhí)行非常復(fù)雜的業(yè)務(wù)流程管理編排是不正確的熬甚,就像實施一個BPM解決方案來執(zhí)行簡單的路由邏輯一樣[宰牛不能用殺雞刀,殺雞不能用宰牛刀]逢渔。
為了說明mediator拓?fù)涫侨绾喂ぷ鞯模僭O(shè)你通過保險公司投保乡括,并決定修改肃廓。 在這種情況下,初始事件可能被稱為重定位事件(relocation
event)诲泌。 處理重定位事件涉及的步驟包含在事件mediator中盲赊,如圖2-2所示。 對于每個初始事件步驟敷扫,事件中介器創(chuàng)建處理事件(例如哀蘑,改變地址,重新計算報價等)葵第,將該處理事件發(fā)送到事件信道绘迁,并等待由相應(yīng)的事件處理器處理的處理事件(例如 ,客戶過程卒密,報價過程等)缀台。 該過程繼續(xù),直到初始事件中的所有步驟都已被處理哮奇。 在Event Mediator中,Recalc Quate和Update Claims上面的箭頭代表這兩個步驟可同時進(jìn)行膛腐。
Broker拓?fù)浼軜?gòu)[broker就是代理的意思]
Broker拓?fù)洳煌趍ediator拓?fù)洌驗闆]有中心事件mediator,消息通過輕量級消息代理(例如鼎俘,ActiveMQ哲身,HornetQ等)[Rabbitmq,zeromq]發(fā)布給業(yè)務(wù)組件。 當(dāng)您具有相對簡單的事件處理流贸伐,并且您不需要中心mediator去安排更上層的業(yè)務(wù)流程勘天,此拓?fù)浞浅S杏肹適合多數(shù)業(yè)務(wù)不太復(fù)雜的系統(tǒng)]。
該拓?fù)渲杏袃煞N主要類型的架構(gòu)組件:代理組件和事件處理器組件捉邢。 代理組件可以是一個或者好幾個(centralized or federated)脯丝,并且包含了所有的事件通道,這些通道涵蓋在事件流內(nèi)。代理組件中包含的事件通道可以是消息隊列歌逢,消息主題發(fā)布或兩者的組合巾钉。
此拓?fù)淙鐖D2-3所示翘狱。 從圖中可以看出秘案,沒有event-mediator組件來控制和編排初始事件; 相反,每個事件處理器組件負(fù)責(zé)處理事件并發(fā)布事件處理結(jié)果。 例如阱高,平衡股票投資組合的事件處理器可以接收稱為股票分割的初始事件赚导。 基于該初始事件,事件處理器可以進(jìn)行一些組合重新平衡赤惊,然后向代理發(fā)布稱為重新平衡組合的新事件吼旧,其然后將由不同的事件處理器拾取。 注意未舟,可能存在事件由事件處理器發(fā)布但是沒有別的處理器接受的情況出現(xiàn)圈暗。這是常見的,尤其是當(dāng)您正在開發(fā)應(yīng)用程序或提供未來的功能和擴(kuò)展。
為了說明代理拓?fù)淙绾喂ぷ髟0颍覀儗⑹褂门cmediator拓?fù)渲邢嗤氖纠贝S捎跊]有中央事件mediator來接收代理拓?fù)渲械某跏际录蛻暨^程組件直接接收事件昼扛,改變客戶地址寸齐,并且發(fā)出該地址改變事件。在此示例中,有兩個對更改地址事件感興趣的事件處理器:報價過程和聲明過程抄谐。報價處理器組件根據(jù)地址更改重新計算新的自動保險率渺鹦,并向系統(tǒng)的其余部分發(fā)布事件指示它做的事情(例如,重新計算報價事件)蛹含。另一方面毅厚,聲明處理組件接收相同的改變地址事件,但是在這種情況下挣惰,它更新未完成的保險聲明并且向系統(tǒng)發(fā)布事件作為更新聲明事件卧斟。這些新事件隨后被其他事件處理器組件拾取,并且事件鏈繼續(xù)通過系統(tǒng)憎茂,直到不再有針對該特定啟動事件發(fā)布的事件.[這不就是pr系統(tǒng)的設(shè)計嘛]
從圖2-4中可以看出珍语,代理拓?fù)浣Y(jié)構(gòu)都是關(guān)于執(zhí)行業(yè)務(wù)功能的事件總線。 理解代理拓?fù)涞淖詈梅椒ㄊ菍⑵湟暈橹欣^競賽竖幔。在接力賽中板乙,跑步者持有接力棒并運(yùn)行一定距離,然后將指揮棒交給下一個跑步者拳氢,依此類推 直到最后一個運(yùn)動員穿過終點線募逞。 在接力賽中,一旦運(yùn)動員交出指揮棒馋评,她就完成了比賽放接。 這對于代理拓?fù)湟彩侨绱耍阂坏┦录幚砥髑袚Q事件,它不再參與該特定事件的處理留特。
注意事項(Considerations)
事件驅(qū)動的架構(gòu)模式是一個相對復(fù)雜的模式實現(xiàn)纠脾,主要是由于它的異步的特點玛瘸。當(dāng)實現(xiàn)這種模式時,您必須解決各種分布式架構(gòu)問題苟蹈,如遠(yuǎn)程進(jìn)程可用性糊渊,缺乏響應(yīng)性和代理重新連接邏輯 事件代理或mediator失敗。
這種架構(gòu)模式適用于缺少原子性事務(wù)的業(yè)務(wù)流程慧脱。 因為事件處理器組件是高度去耦合和分布式的渺绒,所以很難跨越多個業(yè)務(wù)組件的同時去維護(hù)業(yè)務(wù)的事務(wù)特點[ACID]。 因此菱鸥,在使用此模式設(shè)計應(yīng)用程序時宗兼,必須不斷考慮哪些事件可以獨(dú)立運(yùn)行或者不單獨(dú)運(yùn)行,并相應(yīng)地計劃事件處理器的粒度氮采。 如果您發(fā)現(xiàn)由多個事件處理器構(gòu)成一個工作單元针炉,換句話說,如果您使用分散的處理器來處理不可分割的事務(wù),在這種情況下,該模式可能不適合您的應(yīng)用程序扳抽。
事件驅(qū)動的架構(gòu)模式的最困難的方面之一可能是事件處理器組件之間契約(contracts)的創(chuàng)建篡帕,維護(hù)和管理。 每個事件通常具有與它相關(guān)聯(lián)的契約形式(例如贸呢,數(shù)據(jù)值和數(shù)據(jù)格式).使用此模式來建立標(biāo)準(zhǔn)數(shù)據(jù)格式(例如镰烧,XML,JSON楞陷,Java對象等)并從一開始就建立契約的版本控制策略至關(guān)重要[業(yè)務(wù)模塊之間的接口很重要,也非常容易發(fā)生變化!!!]怔鳖。
模式分析(Pattern Analysis)
該章節(jié)包含事件驅(qū)動架構(gòu)模式的常見架構(gòu)特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力固蛾,以及通常已知的圖案结执。 對于此模式與本報告中其他模式如何相關(guān)的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:靈活性是指軟件應(yīng)對變化的能力艾凯。 由于事件處理器組件是職責(zé)單一的的并且與其他事件處理器組件完全解耦献幔,因此改變通常被隔離到一個或幾個事件處理器內(nèi),并且可以快速地做出改變而不影響其他組件.
易部署性(Ease of deployment)
- 級別:高
- 分析:總得來說趾诗,由于事件處理器組件的去耦特性蜡感,這種模式相對容易部署。 代理拓?fù)溱呄蛴诒戎薪槠魍負(fù)涓子诓渴鹗牙幔饕且驗槭录薪槠鹘M件和事件處理組件是緊耦合的:事件處理器組件中的更改也可能需要事件介體進(jìn)行更改郑兴,兩者都要進(jìn)行重新部署.
可測試性(Testability)
- 級別:低
- 分析:雖然單個單元測試不是特別困難,但它需要某種專門的測試客戶端或測試工具來生成事件贝乎。 這種模式的異步性質(zhì)也使測試復(fù)雜化情连。
性能(Performance)
- 級別:高
- 分析:雖然該架構(gòu)的效率很大程度上取決于消息發(fā)送基礎(chǔ)結(jié)構(gòu),但是通常來說览效,該模式通過其異步能力實現(xiàn)高性能; 換句話說却舀,執(zhí)行解耦球榆,并行異步操作的能力勝過入隊和出隊消息的成本。
可擴(kuò)展性(Scalability)
- 級別:高
- 分析:由于擁有獨(dú)立和低耦合的事件處理器,該架構(gòu)天生的具有高可擴(kuò)展性禁筏。 每個事件處理器可以單獨(dú)縮放,允許細(xì)粒度可伸縮性衡招。
開發(fā)容易度(Ease of development)
- 級別:低
- 分析:由于該模式異步的特性,需要建立契約,以及需要考慮針對代理錯誤以及異常事件的處理,該架構(gòu)不同意上手.
3.微內(nèi)核架構(gòu) (Microkernel Architecture)
微內(nèi)核架構(gòu)模式(有時稱為插件架構(gòu)模式)是實現(xiàn)基于產(chǎn)品的應(yīng)用程序所使用的模式篱昔。 基于產(chǎn)品的應(yīng)用程序是作為典型的第三方產(chǎn)品被打包并提供下載的應(yīng)用程序。 然而始腾,許多公司也開發(fā)和發(fā)布其內(nèi)部業(yè)務(wù)應(yīng)用程序州刽,如軟件產(chǎn)品,完整版本浪箭,發(fā)行說明和可插拔功能穗椅。 這些也是這種模式的典型應(yīng)用。 微內(nèi)核架構(gòu)模式允許您將附加應(yīng)用程序功能作為插件添加到核心應(yīng)用程序奶栖,提供可擴(kuò)展性以及功能分離和隔離匹表。
架構(gòu)描述
微內(nèi)核架構(gòu)模式由兩種類型的架構(gòu)組件組成:核心系統(tǒng)和插件模塊。業(yè)務(wù)邏輯分開在獨(dú)立插件模塊和基本核心系統(tǒng)之間宣鄙,這種方式提供功能和業(yè)務(wù)邏輯的可擴(kuò)展性袍镀,靈活性和隔離的特點。 圖3-1說明了基本微內(nèi)核架構(gòu)模式.
微內(nèi)核架構(gòu)模式的核心系統(tǒng)僅包含使系統(tǒng)運(yùn)行所需的最小功能集.許多操作系統(tǒng)實現(xiàn)了微內(nèi)核架構(gòu)模式冻晤,因此是該模式名稱的起源苇羡。從業(yè)務(wù)程序的角度來看,核心系統(tǒng)通常被定義為通用業(yè)務(wù)邏輯鼻弧,不包含針對特殊情況或者復(fù)雜情況的自定義代碼.
插件模塊是獨(dú)立的獨(dú)立組件设江,包含特殊的處理,附加的功能和自定義代碼攘轩,用于增強(qiáng)或擴(kuò)展核心系統(tǒng)以產(chǎn)生額外的業(yè)務(wù)功能叉存。 通常,插件模塊應(yīng)該獨(dú)立于其他插件模塊,但是您當(dāng)然可以設(shè)計需要其他插件的插件度帮。 無論哪種方式鹉胖,重要的是保持插件之間的通信最小化,以避免依賴性問題够傍。
核心系統(tǒng)需要知道哪些插件模塊可用以及如何獲取它們甫菠。 一種常見的實現(xiàn)方式是通過某種插件注冊表。 此注冊表包含有關(guān)每個插件模塊的信息,包括其名稱,數(shù)據(jù)結(jié)構(gòu)和遠(yuǎn)程訪問協(xié)議詳細(xì)信息(取決于插件如何連接到核心系統(tǒng)). 例如,用于標(biāo)記高風(fēng)險稅務(wù)審計項目的稅務(wù)軟件的插件可能具有包含服務(wù)名稱(AuditChecker)冕屯,數(shù)據(jù)結(jié)構(gòu)(輸入數(shù)據(jù)和輸出數(shù)據(jù))和合同格式的注冊表項 (XML).如果插件通過SOAP訪問寂诱,它還可能包含WSDL(Web服務(wù)定義語言).
插件模塊可以通過各種方式連接到核心系統(tǒng),包括OSGi(開放服務(wù)網(wǎng)關(guān)倡議),消息安聘,web服務(wù)或甚至直接點對點綁定(即對象實例化)痰洒。 您使用的連接類型取決于您正在構(gòu)建的應(yīng)用程序類型(小型產(chǎn)品或大型業(yè)務(wù)應(yīng)用程序)和您的特定需求(例如瓢棒,單一部署或分布式部署)。 架構(gòu)模式本身不指定任何這些實現(xiàn)細(xì)節(jié)丘喻,只有插件模塊必須保持彼此獨(dú)立脯宿。
插件模塊可以通過各種方式連接到核心系統(tǒng),包括OSGi(開放服務(wù)網(wǎng)關(guān)倡議),消息泉粉,web服務(wù)或甚至直接點對點綁定(即對象實例化). 您使用的連接類型取決于您正在構(gòu)建的應(yīng)用程序類型(小型產(chǎn)品或大型業(yè)務(wù)應(yīng)用程序)和您的特定需求(例如连霉,單一部署或分布式部署).架構(gòu)模式本身不指定任何這些實現(xiàn)細(xì)節(jié),只有插件模塊必須保持彼此獨(dú)立嗡靡。
插件模塊和核心系統(tǒng)之間的契約范圍可以從標(biāo)準(zhǔn)契約到自定義契約. 自定義契約通常在插件組件由第三方開發(fā)的情況下建立跺撼,其中您無法控制插件使用的契約。 在這種情況下,在插件契約和標(biāo)準(zhǔn)契約之間插入一個適配器讨彼,以便核心系統(tǒng)不需要每個插件都有專門的代碼歉井。 在創(chuàng)建標(biāo)準(zhǔn)契約(通常通過XML或Java Map實現(xiàn))時,務(wù)必記住從開始就創(chuàng)建版本控制策略哈误。
模式例子(Pattern Examples)
內(nèi)核架構(gòu)的最好的例子是Eclipse IDE.下載基本的Eclipse產(chǎn)品只是一個漂亮的編輯器哩至。 然而,一旦你開始添加插件,它就成為一個高度可定制和有用的產(chǎn)品蜜自『┠迹互聯(lián)網(wǎng)瀏覽器是另一個常見的產(chǎn)品示例使用微內(nèi)核架構(gòu):查看器和其他插件添加額外的功能,在基本的瀏覽器 即核心系統(tǒng))袁辈。
類似這種基于產(chǎn)品軟件的例子是挺多的菜谣,但是大型企業(yè)應(yīng)用程序呢? 微內(nèi)核架構(gòu)也適用于這些情況晚缩。 為了說明這一點尾膊,讓我們使用另一個保險公司的例子,但這次涉及保險索賠處理荞彼。
索賠處理是一個非常復(fù)雜的過程冈敛。 每個地區(qū)對保險索賠中的內(nèi)容都有不同的規(guī)則和的規(guī)定。 例如鸣皂,當(dāng)您的擋風(fēng)玻璃被巖石損壞,一些地區(qū)允許更換擋風(fēng)玻璃抓谴,而其他地區(qū)則不會。 這為標(biāo)準(zhǔn)索賠創(chuàng)建了一個很大的條件集合寞缝。
毫不奇怪癌压,大多數(shù)保險索賠應(yīng)用程序利用大型和復(fù)雜的規(guī)則引擎來處理這種復(fù)雜性。 然而荆陆,這些規(guī)則引擎可以成長為一個復(fù)雜的大泥球滩届,其中改變一個規(guī)則影響其它規(guī)則,或者做一個簡單的規(guī)則改變就需要一支分析師被啼,開發(fā)人員和測試人員的隊伍帜消。 使用微內(nèi)核架構(gòu)模式可以解決許多這些問題棠枉。
圖3-2中顯示的文件夾堆棧表示聲明處理的核心系統(tǒng)。 它包含保險公司處理索賠所需的基本業(yè)務(wù)邏輯,不包含任何定制處理泡挺。 每個插件模塊包含該地區(qū)的特定規(guī)則辈讶。 在該示例中,可以使用定制源代碼或單獨(dú)的規(guī)則引擎實例來實現(xiàn)插件模塊娄猫。 不管實現(xiàn)如何贱除,關(guān)鍵點是地區(qū)特定的規(guī)則和處理與核心聲明系統(tǒng)分離,并且可以進(jìn)行添加,刪除和修改,并且對核心系統(tǒng)或其他插件模塊幾乎沒有影響.
結(jié)論(Considerations)
微內(nèi)核架構(gòu)模式的一個好處是它可以嵌入或用作另一個架構(gòu)模式的一部分稚新。例如,如果此模式解決了應(yīng)用程序的特定易失性區(qū)域中存在的特定問題跪腹,您可能會發(fā)現(xiàn)不能使用這種模式實現(xiàn)整個架構(gòu)褂删。 在這種情況下,您可以將微服務(wù)架構(gòu)模式嵌入您正在使用的另一個模式(例如冲茸,分層架構(gòu)).類似地,可以使用微服務(wù)架構(gòu)模式來實現(xiàn)在先前關(guān)于事件驅(qū)動架構(gòu)的部分中描述的事件處理器組件.
微服務(wù)架構(gòu)模式為進(jìn)化設(shè)計和增量開發(fā)提供了極大的支持.您可以首先生成一個堅實的核心系統(tǒng)屯阀,隨著應(yīng)用程序的不斷發(fā)展,添加功能和功能轴术,而不必對核心系統(tǒng)進(jìn)行重大更改难衰。
對于基于產(chǎn)品的應(yīng)用程序,微內(nèi)核架構(gòu)模式應(yīng)始終是您的首選架構(gòu)逗栽,特別是對于那些將隨著時間的推移發(fā)布其他功能盖袭,并希望控制不同用戶獲得不同的功能。 如果您發(fā)現(xiàn)該模式不能滿足您的所有需求彼宠,您可以隨時將您的應(yīng)用程序重構(gòu)為更適合您的特定需求的另一個架構(gòu)模式鳄虱。
模式分析(Pattern Analysis)
該章節(jié)包含事件驅(qū)動架構(gòu)模式的常見架構(gòu)特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力凭峡,以及通常已知的圖案拙已。 對于此模式與本報告中其他模式如何相關(guān)的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環(huán)境做出快速反應(yīng)的能力.通過松散耦合的插件模塊.可以在很大程度上隔離和實現(xiàn)更改摧冀。 一般來說倍踪,大多數(shù)微內(nèi)核架構(gòu)的核心系統(tǒng)趨于快速穩(wěn)定,因此相當(dāng)穩(wěn)健索昂,并且很少需要隨時間變化建车。
可部署性(Ease of deployment)
- 級別:高
- 分析:根據(jù)如何實現(xiàn)模式,插件模塊可以在運(yùn)行時動態(tài)地添加到核心系統(tǒng)(例如椒惨,熱部署)癞志,從而最小化部署期間的停機(jī)時間。
可測試性(Testability)
- 級別:高
- 分析:插件模塊可以進(jìn)行隔離測試框产,并且可以很容易地被核心系統(tǒng)模仿以論證或原型化特定特征凄杯,而對核心系統(tǒng)的改變很少或沒有改變错洁。
性能(Performance)
- 級別:高
- 分析:雖然微內(nèi)核模式不適合高性能應(yīng)用程序,但一般來說戒突,使用微內(nèi)核架構(gòu)模式構(gòu)建的大多數(shù)應(yīng)用程序性能良好屯碴,因為您可以自定義和簡化應(yīng)用程序,僅包含您需要的功能. JBoss應(yīng)用服務(wù)器就是一個很好的例子:使用它的插件架構(gòu)膊存,你可以將應(yīng)用服務(wù)器修剪到你需要的那些特性导而,消除昂貴的未使用的功能,例如遠(yuǎn)程訪問隔崎,消息傳遞和消耗內(nèi)存的緩存 今艺,CPU和線程等并減慢應(yīng)用程序服務(wù)器.
可擴(kuò)展性(Scalability)
- 級別:低
- 分析:因為大多數(shù)微內(nèi)核架構(gòu)實現(xiàn)是基于產(chǎn)品的,并且通常規(guī)模較小爵卒,所以它們被實現(xiàn)為單個單元虚缎,因此不是高度可擴(kuò)展的。根據(jù)如何實現(xiàn)插件模塊钓株,有時可以在插件功能級別提供可擴(kuò)展性 实牡,但總的來說,這種模式對于生產(chǎn)高度可擴(kuò)展的應(yīng)用程序比較少轴合。
開發(fā)容易度(Ease of development)
- 級別:低
- 分析:微內(nèi)核架構(gòu)需要周密的設(shè)計和合同管理,使其實現(xiàn)起來相當(dāng)復(fù)雜.契約版本控制创坞,內(nèi)部插件注冊表,插件粒度以及可用于插件連接的廣泛選擇都有助于實現(xiàn)此模式所涉及的復(fù)雜性受葛。
4.微服務(wù)架構(gòu)(Microservices Architecture Pattern)
微服務(wù)架構(gòu)模式作為單體應(yīng)用程序和面向服務(wù)的架構(gòu)的可行替代方案题涨,正在業(yè)界迅速獲得成功。 因為這種架構(gòu)模式一直在發(fā)展,所以業(yè)界對這個模式是什么以及如何實現(xiàn)有很多困惑.本章節(jié)將向您提供了解這種重要架構(gòu)模式的優(yōu)點(和權(quán)衡)所必需的關(guān)鍵概念和基礎(chǔ)知識总滩,以及它是否適合您的應(yīng)用程序携栋。
無論您選擇的拓?fù)浣Y(jié)構(gòu)或?qū)崿F(xiàn)風(fēng)格如何,都有一些常見的核心概念適用于一般的架構(gòu)模式咳秉。 首先是單獨(dú)部署單元的概念婉支。 如圖4-1所示,微服務(wù)架構(gòu)的每個組件都作為一個單獨(dú)的單元部署澜建,允許通過有效和簡化的交付管道更容易地部署向挖,提高可擴(kuò)展性,以及在應(yīng)用程序中實現(xiàn)高度的應(yīng)用程序和組件解耦炕舵。
從單體應(yīng)用到微服務(wù)架構(gòu)風(fēng)格的演進(jìn)路徑主要是通過開發(fā)持續(xù)交付,從開發(fā)到生產(chǎn)的連續(xù)部署的概念何之,這簡化了應(yīng)用程序的部署.單體應(yīng)用通常由多個緊密耦合的組件構(gòu)成,這些組件是部署單元的一部分,這使得改變,測試和部署應(yīng)用變得麻煩和困難(因此,大多數(shù)大型IT商店中常見的“每月部署”周期的興起 ). 這些因素通常導(dǎo)致脆弱的應(yīng)用程序咽筋,每次部署新的東西時容易被破壞.微服務(wù)架構(gòu)模式通過將應(yīng)用程序分為多個可部署單元(服務(wù)組件)來解決這些問題溶推,這些可單獨(dú)開發(fā),測試和部署,而與其他服務(wù)組件無關(guān)蒜危。
理解這個模式最重要的概念是服務(wù)組件的概念虱痕。 相比考慮微服務(wù)架構(gòu)中的服務(wù),最好還是考慮服務(wù)組件辐赞,服務(wù)組件從單個模塊到大塊應(yīng)用的粒度可能有所不同部翘。 服務(wù)組件包含表示單一用途功能(例如,為特定城市或城鎮(zhèn)提供天氣)或大型商業(yè)應(yīng)用的獨(dú)立部分(例如响委,股票交易放置或 確定汽車保險費(fèi)率)新思。 設(shè)計正確級別的服務(wù)組件粒度是微服務(wù)架構(gòu)中最大的挑戰(zhàn)之一。 此挑戰(zhàn)在以下服務(wù)組件編排子部分中有更詳細(xì)的討論赘风。
微服務(wù)架構(gòu)模式內(nèi)的另一個關(guān)鍵概念是其是分布式架構(gòu)夹囚,意味著架構(gòu)內(nèi)的所有組件彼此完全解耦并且通過某種遠(yuǎn)程訪問協(xié)議(例如JMS,AMQP邀窃,REST苇经,SOAP绵载, RMI等)鞭衩。 這種架構(gòu)模式的分布式特性有助于實現(xiàn)其一些卓越的可擴(kuò)展性和部署特性充包。
微服務(wù)架構(gòu)的一個吸引人的地方在于它是從與其他通用架構(gòu)模式相關(guān)的問題演變而成,而不是作為等待問題發(fā)生的解決方案來創(chuàng)建.微服務(wù)架構(gòu)風(fēng)格自然地從兩個主要來源演變而來:使用分層架構(gòu)模式開發(fā)的單體應(yīng)用程序和通過面向服務(wù)的架構(gòu)模式開發(fā)的分布式應(yīng)用程序.
從單體應(yīng)用到微服務(wù)架構(gòu)風(fēng)格的演進(jìn)路徑主要是通過開發(fā)持續(xù)交付位谋,從開發(fā)到生產(chǎn)的連續(xù)部署管道的概念山析,這簡化了應(yīng)用程序的部署。 單片應(yīng)用通常包含緊密耦合的組件,使得改變包含改變,測試和部署應(yīng)用變得麻煩和困難(因此,大多數(shù)大型IT商店中常見的“每月部署”周期的興起 )掏父。 這些因素通常導(dǎo)致脆弱的應(yīng)用程序笋轨,每次部署新的東西時都會產(chǎn)生風(fēng)險。 微服務(wù)架構(gòu)模式通過將應(yīng)用程序分為多個可部署單元(服務(wù)組件)來解決這些問題赊淑,這些可單獨(dú)開發(fā)爵政,測試和部署,而與其他服務(wù)組件無關(guān)陶缺。
導(dǎo)致微服務(wù)體系結(jié)構(gòu)模式的另一個來源是來自實現(xiàn)面向服務(wù)的體系結(jié)構(gòu)模式(SOA)的應(yīng)用程序出現(xiàn)的問題.雖然SOA模式非常強(qiáng)大,提供了強(qiáng)大的抽象級別,異構(gòu)連接,服務(wù)編排,以及將業(yè)務(wù)目標(biāo)與IT功能對齊的承諾,但是它是復(fù)雜钾挟,昂貴,分散的饱岸,難以理解和實施的掺出,而且對于大多數(shù)應(yīng)用是過度的. 微服務(wù)架構(gòu)風(fēng)格通過簡化服務(wù)概念,消除編排需求以及簡化連接和訪問服務(wù)組件來解決這種復(fù)雜性苫费。
模式拓?fù)?Pattern Topologies)
雖然有幾十種方法來實現(xiàn)微服務(wù)架構(gòu)模式汤锨,但其中三個主要拓?fù)浣Y(jié)構(gòu)是最常見和最受歡迎的:基于API REST的拓?fù)?API REST-based),基于應(yīng)用程序REST的拓?fù)?API REST-based)和集中式消息傳遞拓?fù)?centralized messaging)。
基于API REST的拓?fù)渫ㄟ^一些API(應(yīng)用程序編程接口)暴露的較少百框,獨(dú)立的單獨(dú)服務(wù),這對于一些網(wǎng)站是有用的闲礼。 此拓?fù)洌ㄈ鐖D4-2所示)由非常細(xì)粒度的服務(wù)組件(因此稱為微服務(wù))組成,其中包含一個或兩個模塊,這些模塊獨(dú)立于其他服務(wù)執(zhí)行特定的業(yè)務(wù)功能柬泽。 在這種拓?fù)渲猩鞣疲@些細(xì)粒度的服務(wù)組件通常使用通過單獨(dú)部署的基于web的API層實現(xiàn)的基于REST的接口來訪問。該拓?fù)涞氖纠ㄓ蒠ahoo,Google和Amazon建立的單一職責(zé)的RESTful web服務(wù).
應(yīng)用程序基于REST的拓?fù)渑c基于API REST的方法不同的,它是通過傳統(tǒng)的基于Web或胖客戶端的業(yè)務(wù)應(yīng)用程序界面接收客戶端請求,而不是通過簡單的API層. 如圖4-3所示聂抢,應(yīng)用程序的用戶界面層被部署為單獨(dú)的Web應(yīng)用程序钧嘶,通過簡單的基于REST的接口遠(yuǎn)程訪問單獨(dú)部署的服務(wù)組件(業(yè)務(wù)功能)。 此拓?fù)渲械姆?wù)組件與基于API-REST的拓?fù)渲械姆?wù)組件不同琳疏,這些服務(wù)組件往往更大有决,更粗略,并且代表整體業(yè)務(wù)應(yīng)用程序的一小部分空盼,而不是細(xì)粒度的單一服務(wù) 书幕。 這種拓?fù)鋵τ诰哂邢鄬^低復(fù)雜度的小到中等規(guī)模的業(yè)務(wù)應(yīng)用是常見的。
微服務(wù)架構(gòu)模式中的另一種常見方法是集中式消息傳遞拓?fù)洹?此拓?fù)洌ㄈ鐖D4-4所示)類似于之前基于REST的應(yīng)用程序拓?fù)淅恐海瞬皇褂肦EST進(jìn)行遠(yuǎn)程訪問台汇,此拓?fù)涫褂幂p量級集中式消息代理(例如ActiveMQ,HornetQ等).當(dāng)查看此拓?fù)鋾r篱瞎,不要將其與面向服務(wù)的架構(gòu)模式混淆或?qū)⑵湟暈椤癝OA-Lite”苟呐,這是至關(guān)重要的.在此拓?fù)渲姓业降妮p量級消息代理不會執(zhí)行任何編排,轉(zhuǎn)換或復(fù)雜路由,它只是一個輕量級的傳輸來訪問遠(yuǎn)程服務(wù)組件.
集中式消息拓?fù)溥m用于在需要對用戶接口和服務(wù)組件之間的傳輸層進(jìn)行更復(fù)雜控制的更大的業(yè)務(wù)應(yīng)用或應(yīng)用.與先前討論的簡單的基于REST的拓?fù)湎啾壤睿送負(fù)涞膬?yōu)點是高級排隊機(jī)制牵素,異步消息傳遞,監(jiān)視澄者,錯誤處理以及更好的總體負(fù)載平衡和可擴(kuò)展性笆呆。 通常通過代理群集和代理聯(lián)合(將單個代理實例分成多個代理實例,以根據(jù)系統(tǒng)的功能區(qū)域劃分消息吞吐量負(fù)載)來解決通常與集中式代理相關(guān)聯(lián)的單點故障和架構(gòu)瓶頸問題粱挡。
避免依賴和編排(Avoid Dependencies and Orchestration)
微服務(wù)架構(gòu)模式的主要挑戰(zhàn)之一是為服務(wù)組件確定正確的粒度級別赠幕。 如果服務(wù)組件過粗,您可能無法實現(xiàn)這種架構(gòu)模式(部署询筏,可擴(kuò)展性榕堰,可測試性和松耦合)帶來的好處。 然而嫌套,過于細(xì)粒度的服務(wù)組件將導(dǎo)致服務(wù)編排的需求逆屡,這會將精簡的微服務(wù)架構(gòu)轉(zhuǎn)變?yōu)橹亓考壍拿嫦蚍?wù)的架構(gòu),并且會包含在SOA所特有的復(fù)雜性灌危,混亂康二,昂貴和瑕疵.
如果您發(fā)現(xiàn)需要從應(yīng)用程序的用戶界面層或API層中編排您的服務(wù)組件,那么您的服務(wù)組件可能太細(xì)粒度勇蝙。 同樣沫勿,如果您發(fā)現(xiàn)需要在服務(wù)組件之間執(zhí)行服務(wù)間通信來處理單個請求挨约,則您的服務(wù)組件可能過于細(xì)粒度,或者從業(yè)務(wù)功能的角度來看产雹,它們沒有正確分區(qū).
可以通過共享數(shù)據(jù)庫來處理可能強(qiáng)制組件之間不期望的耦合的服務(wù)間通信诫惭。 例如,如果處理因特網(wǎng)訂單的服務(wù)組件需要客戶信息蔓挖,則它可以去到數(shù)據(jù)庫以檢索必要的數(shù)據(jù)夕土,而不是調(diào)用客戶 - 服務(wù)組件內(nèi)的功能。
共享數(shù)據(jù)庫可以提供所需的信息瘟判,但是共享功能怎么辦怨绣? 如果服務(wù)組件需要包含在另一個服務(wù)組件中或所有服務(wù)組件都共用的功能,您有時可以跨服務(wù)組件復(fù)制共享功能(從而違反DRY原則:不要重復(fù)自己).在大多數(shù)實現(xiàn)微服務(wù)架構(gòu)模式的業(yè)務(wù)應(yīng)用程序中拷获,這是相當(dāng)常見的做法,為了保持服務(wù)組件獨(dú)立和分離其部署篮撑,需要將業(yè)務(wù)邏輯小部分的冗余.小型實用程序類可能屬于此類重復(fù)的代碼。
如果您發(fā)現(xiàn)無論服務(wù)組件粒度級別如何匆瓜,您仍然無法避免服務(wù)組件編排赢笨,那么這是一個好的跡象,這可能不是您的應(yīng)用程序的正確的架構(gòu)模式.由于此模式的分布式特性,很難在服務(wù)組件之間(和之間)維護(hù)單個事務(wù)性工作單元. 這種做法將需要某種用于回滾事務(wù)的事務(wù)補(bǔ)償框架驮吱,這為這種相對簡單和優(yōu)雅的架構(gòu)模式增加了顯著的復(fù)雜性[事物不能跨組件來完成]茧妒。
注意事項(Considerations)
微服務(wù)架構(gòu)模式解決了在單片應(yīng)用程序以及面向服務(wù)的架構(gòu)中發(fā)現(xiàn)的許多常見問題.由于主要應(yīng)用程序組件被拆分成更小的,單獨(dú)部署的單元,使用微服務(wù)架構(gòu)模式構(gòu)建的應(yīng)用程序通常更健壯左冬,提供更好的可擴(kuò)展性桐筏,并且可以更容易地支持連續(xù)傳遞。
這種模式的另一個優(yōu)點是它提供了進(jìn)行實時生產(chǎn)部署的能力又碌,從而顯著減少對傳統(tǒng)的每月或周末“大爆炸”生產(chǎn)部署的需求九昧。 由于更改通常與特定服務(wù)組件隔離绊袋,因此只需要部署需要更改的服務(wù)組件毕匀。 如果您只有一個服務(wù)組件的一個實例,您可以在用戶界面應(yīng)用程序中編寫專門的代碼來檢測活動的熱部署癌别,并將用戶重定向到錯誤頁面或等待頁面皂岔。 或者,您可以在實時部署期間交換服務(wù)組件的多個實例展姐,從而在部署周期內(nèi)實現(xiàn)連續(xù)可用性(這對于分層架構(gòu)模式非常困難)躁垛。
要考慮的最后一個考慮因素是,由于微服務(wù)架構(gòu)模式是分布式架構(gòu)圾笨,它分享了在事件驅(qū)動架構(gòu)模式中發(fā)現(xiàn)的一些相同的復(fù)雜問題教馆,包括契約創(chuàng)建,維護(hù)和治理擂达,遠(yuǎn)程系統(tǒng)可用性土铺, 遠(yuǎn)程訪問認(rèn)證和授權(quán)。
模式分析(Pattern Analysis)
該章節(jié)包含常見架構(gòu)特性的評級和分析。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力悲敷,以及通常已知的圖案究恤。 對于此模式與本報告中其他模式如何相關(guān)的并行比較,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環(huán)境做出快速反應(yīng)的能力.由于單獨(dú)部署的單元這個特點后德,改變通常被隔離到單獨(dú)的服務(wù)組件部宿,這允許快速和容易的部署。此外瓢湃,使用這種模式的應(yīng)用建立趨于非常松散耦合理张,這也有助于促進(jìn)改變。
可部署性(Ease of deployment)
- 級別:高
- 分析:總體上绵患,由于事件處理器組件的去耦特性涯穷,這種模式相對容易部署.代理拓?fù)溱呄蛴诒戎薪槠魍負(fù)涓菀撞渴?主要是因為事件中介器組件在某種程度上緊密耦合到事件處理器:事件處理器組件的變化也可能需要事件中介器的改變, 被部署為任何給定的變化藏雏。
可測試性(Testability)
- 級別:高
- 分析:由于將業(yè)務(wù)功能分離和隔離為獨(dú)立應(yīng)用程序拷况,因此可以對測試進(jìn)行限定,從而實現(xiàn)更有針對性的測試工作掘殴。 特定服務(wù)組件的回歸測試比整個單片應(yīng)用程序的回歸測試容易得多且更可行赚瘦。此外,由于此模式中的服務(wù)組件松散耦合奏寨,因此從進(jìn)行變更的開發(fā)角度看的很少能夠影響應(yīng)用程序的另一部分起意,減輕了測試整個應(yīng)用程序的一個小的變化的測試負(fù)擔(dān)。
性能(Performance)
- 級別:低
- 分析:雖然您可以創(chuàng)此模式實現(xiàn)的應(yīng)用程序執(zhí)行非常好病瞳,但由于微服務(wù)架構(gòu)模式的分布式特性揽咕,這種模式本身并不適合高性能應(yīng)用程序。
可擴(kuò)展性(Scalability)
- 級別:高
- 分析:由于應(yīng)用程序分為單獨(dú)部署的單元,每個服務(wù)組件可以單獨(dú)縮放,允許對應(yīng)用程序進(jìn)行微調(diào)縮放. 例如,由于該功能的低用戶量套菜,股票交易應(yīng)用的管理區(qū)域可能不需要縮放亲善,但是交易布置組件需要包含縮放功能,由于大多數(shù)交易應(yīng)用為此所需的高吞吐量.
開發(fā)容易度(Ease of development)
- 級別:高
- 分析:由于功能被隔離到單獨(dú)的和不同的服務(wù)組件中,由于較小和隔離的范圍,開發(fā)變得更容易. 開發(fā)人員對一個服務(wù)組件進(jìn)行更改會影響其他服務(wù)組件的機(jī)會少得多,從而減少了開發(fā)人員或開發(fā)團(tuán)隊之間的協(xié)調(diào)逗柴。
5.云架構(gòu)(Space-Based Architecture)
大多數(shù)基于Web的業(yè)務(wù)應(yīng)用程序都遵循相同的一般請求流:一個來自瀏覽器的請求發(fā)送至Web服務(wù)器,然后是應(yīng)用程序服務(wù),最后是數(shù)據(jù)庫服務(wù).雖然此模式對于一小部分用戶非常有用蛹头,但是隨著用戶負(fù)載的增加,瓶頸開始首先出現(xiàn)在Web服務(wù)器層戏溺,然后在應(yīng)用程序服務(wù)器層渣蜗,最后在數(shù)據(jù)庫服務(wù)器層】趸觯基于用戶負(fù)載增加的瓶頸的應(yīng)對方案通常是是向外擴(kuò)展web服務(wù)器.這是相對容易和便宜的,通常能順利解決問題.但是,在大多數(shù)用戶負(fù)載較高的情況下耕拷,擴(kuò)展Web服務(wù)器層只是將瓶頸移動到應(yīng)用程序服務(wù)器.縮放應(yīng)用程序服務(wù)器可能比Web服務(wù)器更復(fù)雜和昂貴,通常只是將瓶頸移動到數(shù)據(jù)庫服務(wù)器托享,這是更加困難和昂貴的擴(kuò)展骚烧。即使你可以擴(kuò)展數(shù)據(jù)庫控淡,你最終得到的是一個三角形拓?fù)?triangleshaped),三角形的最寬部分是Web服務(wù)器(最容易擴(kuò)展)止潘,最小的部分是數(shù)據(jù)庫(最難以擴(kuò)展).
在任何具有極大并發(fā)用戶負(fù)載的大容量應(yīng)用程序中掺炭,數(shù)據(jù)庫能夠同時處理多少事務(wù)是最終限制因素.雖然各種緩存技術(shù)和數(shù)據(jù)庫擴(kuò)展產(chǎn)品有助于解決這些問題,但事實仍然是,擴(kuò)展正常應(yīng)用程序解決極端負(fù)載問題是一個非常困難的命題.
基于云的架構(gòu)模式專門設(shè)計用于處理和解決可擴(kuò)展性和并發(fā)性問題.對于具有可變和不可預(yù)測的并發(fā)用戶卷的應(yīng)用程序,它也是一種有用的體系結(jié)構(gòu)模式.在架構(gòu)上解決極端和可變的可伸縮性問題通常是比將數(shù)據(jù)庫擴(kuò)展或?qū)⒕彺婕夹g(shù)改進(jìn)更好。
模式描述(Pattern Description)
基于空間的模式(有時也稱為云架構(gòu)模式)將限制應(yīng)用程序縮放的因素將至最低. 這個模式顧名思義,來源于從元組空間( tuple space)的概念和分布式共享內(nèi)存的概念得凭戴。 通過去掉中央數(shù)據(jù)庫約束并使用復(fù)制的內(nèi)存數(shù)據(jù)網(wǎng)格實現(xiàn)高可擴(kuò)展性涧狮。 應(yīng)用數(shù)據(jù)保存在內(nèi)存中并在所有活動處理單元之間復(fù)制.當(dāng)用戶負(fù)載增加和減少時,處理單元可以動態(tài)地啟動和關(guān)閉,從而解決可變的可擴(kuò)展性么夫。 因為沒有中央數(shù)據(jù)庫,所以去掉了數(shù)據(jù)庫瓶頸,在應(yīng)用程序中提供了近乎無限的可擴(kuò)展性.
大多數(shù)符合此模式的應(yīng)用程序是從瀏覽器接收請求并執(zhí)行某種操作的標(biāo)準(zhǔn)網(wǎng)站. 招標(biāo)拍賣網(wǎng)站就是一個很好的例子. 該網(wǎng)站通過瀏覽器請求不斷接收互聯(lián)網(wǎng)用戶的出價. 應(yīng)用程序?qū)⒔邮諏μ囟椖康某鰞r者冤,記錄具有時間戳的出價,并且更新項目的最新出價信息档痪,并將信息發(fā)送回瀏覽器涉枫。
此架構(gòu)模式中有兩個主要組件:處理單元(processing unit)和虛擬中間件(virtualized middleware). 圖5-1說明了基本的基于空間的架構(gòu)模式及其主要架構(gòu)組件。
處理單元組件包含應(yīng)用組件(或應(yīng)用組件的部分). 這包括基于web的組件以及后端業(yè)務(wù)邏輯.處理單元的內(nèi)容基于應(yīng)用的類型而變化 - 較小的基于web的應(yīng)用可能被部署到單個處理單元中腐螟,而較大的應(yīng)用可基于應(yīng)用的功能區(qū)域?qū)?yīng)用功能分割成多個處理單元愿汰。 處理單元通常包含應(yīng)用程序模塊,以及內(nèi)存中數(shù)據(jù)網(wǎng)格和可選的異步持久存儲器,防止異常丟失數(shù)據(jù). 它還包含復(fù)制引擎乐纸,虛擬化中間件使用復(fù)制引擎將一個處理單元所做的數(shù)據(jù)更改復(fù)制到其他活動處理單元衬廷。
虛擬化中間件組件處理管理和通信.它包含控制數(shù)據(jù)同步和請求處理的各個方面的組件.虛擬化中間件中包含消息傳遞網(wǎng)格,數(shù)據(jù)網(wǎng)格,處理網(wǎng)格和部署管理器. 這些組件在下一節(jié)中有詳細(xì)描述,可以定制或作為第三方產(chǎn)品購買汽绢。
Pattern Dynamics
基于空間的架構(gòu)模式的魔力在于虛擬化的中間件組件和包含在每個處理單元內(nèi)的內(nèi)存數(shù)據(jù)網(wǎng)格.圖5-2顯示了典型的處理單元架構(gòu),包含應(yīng)用程序模塊,內(nèi)存數(shù)據(jù)網(wǎng)格,用于故障轉(zhuǎn)移的可選異步持久存儲以及數(shù)據(jù)復(fù)制引擎.
虛擬化中間件本質(zhì)上是架構(gòu)的控制器吗跋,并且管理請求,會話,數(shù)據(jù)復(fù)制,分布式請求處理和過程單元部署.在虛擬化中間件中有四個主要的架構(gòu)組件:消息傳遞網(wǎng)格,數(shù)據(jù)網(wǎng)格,處理網(wǎng)格和部署管理器.
消息網(wǎng)格(Messaging Grid)
消息網(wǎng)格(如圖5-3所示)管理輸入請求和會話信息。 當(dāng)一個請求進(jìn)入虛擬化中間件組件時,消息傳遞網(wǎng)格組件確定哪些活動處理組件可用于接收請求,并將請求轉(zhuǎn)發(fā)到這些處理單元之一.消息網(wǎng)格的復(fù)雜性可以從簡單的循環(huán)算法到更復(fù)雜的 臨近可用算法(next-available algorithm)宁昭,保持跟蹤由哪個處理單元處理哪個請求跌宛。
數(shù)據(jù)網(wǎng)絡(luò)(Data Grid)
數(shù)據(jù)網(wǎng)格組件可能是這種模式中最重要和最重要的組件. 數(shù)據(jù)網(wǎng)格利用每個處理單元中的數(shù)據(jù)復(fù)制引擎,當(dāng)數(shù)據(jù)更新發(fā)生時,管理單元之間的數(shù)據(jù)復(fù)制. 由于消息傳送網(wǎng)格可以向任何可用的處理單元轉(zhuǎn)發(fā)請求,因此每個處理單元在其內(nèi)存數(shù)據(jù)網(wǎng)格中包含完全相同的數(shù)據(jù)是必要的. 雖然圖5-4顯示了處理單元之間的同步數(shù)據(jù)復(fù)制,但實際上這是以異步和非常快速的并行方式完成的,有時在幾微秒(百萬分之一秒)內(nèi)完成數(shù)據(jù)同步.
處理網(wǎng)格(Processing Grid)
如圖5-5所示积仗,處理網(wǎng)格是虛擬化中間件中的一個可選組件疆拘,當(dāng)存在多個處理單元(每個單元處理應(yīng)用程序的一部分)時管理分布式請求處理.如果進(jìn)入需要處理單元類型(例如,訂單處理單元和客戶處理單元)之間的協(xié)調(diào)的請求,則是在這兩個處理單元之間中介和協(xié)調(diào)請求的處理網(wǎng)格斥扛。
部署管理(Deployment Manager)
部署管理器組件根據(jù)負(fù)載條件管理處理單元的動態(tài)啟動和關(guān)閉.該組件持續(xù)監(jiān)視響應(yīng)時間和用戶負(fù)載,并在負(fù)載增加時啟動新的處理單元,并在負(fù)載減少時關(guān)閉處理單元.它是在應(yīng)用程序中實現(xiàn)可變可擴(kuò)展性需求的關(guān)鍵組件.
注意事項(Considerations)
基于云架構(gòu)模式是一個實現(xiàn)復(fù)雜和昂貴的模式. 對于具有可變負(fù)載且規(guī)模較小的基于網(wǎng)絡(luò)的應(yīng)用(例如入问,社交媒體網(wǎng)站丹锹,競價和拍賣網(wǎng)站),這是一種良好的架構(gòu)選擇稀颁。 然而,它不太適合具有大量操作數(shù)據(jù)的傳統(tǒng)大規(guī)模關(guān)系數(shù)據(jù)庫應(yīng)用程序楣黍。
盡管基于空間的架構(gòu)模式不需要集中式數(shù)據(jù)存儲匾灶,但是需要用于執(zhí)行初始內(nèi)存數(shù)據(jù)網(wǎng)格加載和異步保持由處理單元進(jìn)行的數(shù)據(jù)更新。 常見的做法是創(chuàng)建將易失性和廣泛使用的事務(wù)數(shù)據(jù)與非活動數(shù)據(jù)隔離的單獨(dú)分區(qū)租漂,以便減少每個處理單元內(nèi)的內(nèi)存數(shù)據(jù)網(wǎng)格的存儲器占用阶女。
需要著重注意的是颊糜,雖然這種模式的替代名稱是基于云的架構(gòu),但是處理單元(以及虛擬化中間件)不一定要駐留在基于云的托管服務(wù)或PaaS(平臺即服務(wù))上秃踩, 它可以很容易駐留在本地服務(wù)器上衬鱼,這是我更喜歡名為“基于空間的架構(gòu)”的原因之一。
從產(chǎn)品實現(xiàn)的角度來看,您可以通過第三方產(chǎn)品(如GemFire憔杨,JavaSpaces鸟赫,GigaSpaces,IBM Object Grid消别,nCache和Oracle Coherence)實現(xiàn)此模式中的許多架構(gòu)組件.由于此模式的實施在成本和功能(特別是數(shù)據(jù)復(fù)制時間)方面有很大差異抛蚤,因此作為架構(gòu)師,您應(yīng)首先確定具體目標(biāo)和需求寻狂,然后再進(jìn)行任何產(chǎn)品選擇.
模式分析(Pattern Analysis)
該章節(jié)包含事件驅(qū)動架構(gòu)模式的常見架構(gòu)特性的評級和分析岁经。 每個特性的評級基于自然趨勢或該特性作為基于圖案的典型實施的能力,以及通常已知的圖案蛇券。 對于此模式與本報告中其他模式如何相關(guān)的并行比較缀壤,請參見本報告末尾的附錄A.
靈活性(Overall agility)
- 級別:高
- 分析:總體靈活性是對不斷變化的環(huán)境做出快速反應(yīng)的能力.因為處理單元(應(yīng)用的所部署的實例)可以快速進(jìn)行調(diào)整,所以應(yīng)用對于與用戶負(fù)載(環(huán)境變化)的變化能夠很好的地響應(yīng).使用該模式創(chuàng)建的結(jié)構(gòu)通常對由于應(yīng)用程序的大小和模式的動態(tài)特性。
可部署性(Ease of deployment)
- 級別:高
- 分析:雖然基于空間的架構(gòu)通常不是解耦和分布式的纠亚,但它們是動態(tài)的诉位,復(fù)雜的基于云的工具允許應(yīng)用程序輕松地“推送”到服務(wù)器,簡化部署菜枷。
可測試性(Testability)
- 級別:低
- 分析:在測試環(huán)境中實現(xiàn)非常高的用戶負(fù)載既昂貴又耗時苍糠,使得難以測試應(yīng)用的可擴(kuò)展性方面。
性能(Performance)
- 級別:高
- 分析:通過內(nèi)存數(shù)據(jù)訪問和緩存機(jī)制構(gòu)建到此模式中來實現(xiàn)高性能啤誊。
可擴(kuò)展性(Scalability)
- 級別:高
- 分析:高可擴(kuò)展性來自于對集中式數(shù)據(jù)庫的依賴很少或沒有依賴性岳瞭,因此基本上從可擴(kuò)展性方程中去除了這個限制性瓶頸。
開發(fā)容易度(Ease of development)
- 級別:低
- 分析:復(fù)雜的緩存和內(nèi)存數(shù)據(jù)網(wǎng)格產(chǎn)品使得這種模式開發(fā)起來相對復(fù)雜,主要是因為缺乏對用于創(chuàng)建這種類型的架構(gòu)的工具和產(chǎn)品的熟悉.此外,在開發(fā)這些類型的體系結(jié)構(gòu)時必須特別小心蚊锹,以確保源代碼中不會影響性能和可伸縮性
附錄A
- 文/潘曉璐 我一進(jìn)店門掸刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赢乓,你說我怎么就攤上這事忧侧∈ぃ” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵蚓炬,是天一觀的道長松逊。 經(jīng)常有香客問我,道長肯夏,這世上最難降的妖魔是什么棺棵? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮熄捍,結(jié)果婚禮上烛恤,老公的妹妹穿的比我還像新娘。我一直安慰自己余耽,他們只是感情好缚柏,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碟贾,像睡著了一般币喧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袱耽,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洪唐!你這毒婦竟也來了钻蹬?” 一聲冷哼從身側(cè)響起,我...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡顺献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 年R本政府宣布,位于F島的核電站存捺,受9級特大地震影響槐沼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捌治,卻給世界環(huán)境...
- 文/蒙蒙 一岗钩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肖油,春花似錦兼吓、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽县袱。三九已至浑娜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間式散,已是汗流浹背筋遭。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理那伐,服務(wù)發(fā)現(xiàn)踏施,斷路器,智...
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
- 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
- 云應(yīng)用設(shè)計模式 下面的章節(jié)詳細(xì)介紹了一些設(shè)計模式罕邀,這些現(xiàn)有的設(shè)計模式可以有效地應(yīng)用到云服務(wù)應(yīng)用程序設(shè)計中去畅形。 電路...
- 一路奔波,直奔斷橋诉探。 無它日熬,只因為白娘子的感召。誰小時候沒有看過《新白娘子傳奇》肾胯? 一竖席、錢塘湖春行 真正面對西湖的...