與許多人認為的不同,微服務(wù)的概念已有相當(dāng)長的歷史,SOA(面向服務(wù)的體系架構(gòu))也不是90年代才被提出的。在最近舉辦的倫敦微服務(wù)大會上,Greg Young就微服務(wù)核心概念的前世今生進行了演講。其中他表示,在過去的50年間,我們一直在使用服務(wù)這一概念背后的核心思想。
Young引用了Martin Fowler對微服務(wù)主要特性的描述,最重要的是其獨立替換系統(tǒng)中單個服務(wù)的能力、對業(yè)務(wù)能力的組織以及智能端點(smart endpoint)與啞管道(dumb pipes)的使用,Young提到的這些特性SOA也同樣具備。
Young提及,在1970年代最初提出的面向?qū)ο竽P椭校梢詫⒁粋€對象理解為一個小型的計算機,用戶通過向它發(fā)送信息使其工作。同時期的參與者(Actor)模式也是基于相似的概念,將參與者作為一個小計算機,用戶向參與者的郵箱發(fā)送信息。它們都是微服務(wù)核心概念的前身,雖然使用的工具或消息傳遞方式不盡相同,但是內(nèi)在的思想并沒有改變。如今我們認為SOA已經(jīng)失敗了,而微服務(wù)將會成功,但Young表示SOA的基礎(chǔ)概念并沒有任何錯誤,微服務(wù)的優(yōu)點在SOA架構(gòu)中也早已存在。
回顧近50年的經(jīng)驗教訓(xùn),Young引用了分布式計算第一定律來概括:如果不是真正需要就不要讓系統(tǒng)分布式。將應(yīng)用分成多個服務(wù),再將它們部署在同一臺服務(wù)器上,甚至在同一個進程上,這樣做并沒有不對。Young表示,大部分系統(tǒng),尤其是小型業(yè)務(wù)系統(tǒng),并不需要分布式來提供可伸縮性,但是可以通過分布式來提升可用性。
我們真正需要的是服務(wù)間的隔離。當(dāng)各個服務(wù)在同一服務(wù)器的各自進程中運行時,我們可以確保服務(wù)間遵循相互的協(xié)議。進一步隔離的方式是將各個服務(wù)運行在獨立的Docker容器中。這樣減少了各服務(wù)間內(nèi)容的共享,從而達到更好的隔離性。再進一步可以將每個服務(wù)運行在獨立的節(jié)點上。
選擇一定層級隔離的原因之一是為了處理相關(guān)的錯誤。當(dāng)在同一個進程中運行所有的微服務(wù)時,如果進程重啟,所有的服務(wù)會被停止。而將服務(wù)運行在各自的進程中的話,單個進程重啟只會影響一個服務(wù)。當(dāng)然重啟服務(wù)器會停止所有服務(wù),所以將各個服務(wù)部署在獨立的服務(wù)器上或雙服務(wù)器雙實例,會大大減少重啟給服務(wù)可用性帶來的影響。
當(dāng)然每一種隔離層級都伴隨著相應(yīng)的成本。使用一臺服務(wù)器多個進程相對于每個服務(wù)一個節(jié)點更容易實現(xiàn)。這其中并沒有誰對誰錯,有的只是各因素間的權(quán)衡。在提升系統(tǒng)的隔離級別的同時,你也會相應(yīng)增加系統(tǒng)的成本和復(fù)雜度。Young同時引用Simon Brown的話:
如果你無法在單進程的獨立應(yīng)用上實現(xiàn)構(gòu)建,那你如何確信在引入網(wǎng)絡(luò)通信后問題可以得到解決?
Young認為,使用不同的隔離策略的一個優(yōu)勢是我們不需要提前做出一些決定,我們也不需要保持生產(chǎn)環(huán)境和開發(fā)環(huán)境使用一樣的隔離級別。他表示這也是使用微服務(wù)架構(gòu)的一個主要好處。
明年的倫敦微服務(wù)大會將與2017年11月6至7日舉辦。
查看英文原文:The Long History of Microservices