程序员修神之路--分布式系统使用网关到底是好还是坏?
靈魂拷問
分布式系統(tǒng)需要統(tǒng)一的網(wǎng)關(guān)嗎?
網(wǎng)關(guān)會(huì)帶來哪些優(yōu)勢(shì)?
引入網(wǎng)關(guān)會(huì)帶來災(zāi)難嗎?
分布式系統(tǒng)的設(shè)計(jì)大體上分為中心化和非中心化,像現(xiàn)在流行的微服務(wù)模式,本質(zhì)上是把各種業(yè)務(wù)拆分為獨(dú)立的進(jìn)程來實(shí)現(xiàn)業(yè)務(wù)的擴(kuò)展性。伴隨著業(yè)務(wù)的不斷被拆分,整體的系統(tǒng)性能也有所提高,但是系統(tǒng)又往往面臨著中心化的需求,這個(gè)世界就是這么有趣,我們不但要非中心化的優(yōu)勢(shì),還要保證中心化的優(yōu)勢(shì)。
統(tǒng)一的需求
說到非中心化需求,最簡(jiǎn)單最常見的就是鑒權(quán),簡(jiǎn)單來說就是判斷用戶是否有執(zhí)行某種動(dòng)作的權(quán)限。以鑒權(quán)為例,當(dāng)有N個(gè)微服務(wù)有同樣的鑒權(quán)需求的時(shí)候,有以下幾種解決方案:
每個(gè)服務(wù)自己實(shí)現(xiàn)一遍
寫一個(gè)公共的服務(wù)接口,每個(gè)服務(wù)都調(diào)用這個(gè)接口
寫到統(tǒng)一的流量入口處,只需要實(shí)現(xiàn)一次
有人說第一種方案沒人用,是嗎?在服務(wù)數(shù)量不是太多的情況下,據(jù)我所知有很多公司初期都是每個(gè)服務(wù)都實(shí)現(xiàn)自己的鑒權(quán),不要說這種做法一無是處,首先在各個(gè)團(tuán)隊(duì)技術(shù)棧不同的情況下,這是一個(gè)團(tuán)隊(duì)可以快速實(shí)現(xiàn)功能的一種解決方案,而且不依賴于任何其他服務(wù),這意味著這個(gè)服務(wù)不會(huì)受到別的服務(wù)的影響,這體現(xiàn)的是非中心化最核心的價(jià)值之一。
至于第二種解決方案是典型的集中式處理的方案之一,他按照業(yè)務(wù)功能把鑒權(quán)獨(dú)立成單獨(dú)的服務(wù),所有使用鑒權(quán)服務(wù)的系統(tǒng)都依賴于這個(gè)服務(wù),所以這個(gè)統(tǒng)一的鑒權(quán)服務(wù)需要保證高可用,而且對(duì)性能比較敏感,稍有不慎,流量高峰就有可能對(duì)整個(gè)系統(tǒng)造成致命打擊。但是,還是有不少公司在用這種架構(gòu)模式,你說奇怪不奇怪,正所謂,存在即合理。
至于第三種使用網(wǎng)關(guān)模式,可以說是目前市面上文章吹捧最多的解決方案。當(dāng)然得到廣大程序員的吹捧自然有它的優(yōu)勢(shì),但是請(qǐng)記住,它并非沒有劣勢(shì)。
image從上圖清晰的可以看到,來自于客戶端的所有流量都經(jīng)過網(wǎng)關(guān),所以理論上來講,所有統(tǒng)一化的需求都可以在網(wǎng)關(guān)進(jìn)行實(shí)現(xiàn),這樣每個(gè)后端的業(yè)務(wù)服務(wù)代碼都不會(huì)有任何的侵入性。至于這些需求最常見的有:
網(wǎng)關(guān)可以屏蔽后端服務(wù)的協(xié)議細(xì)節(jié),比如有的服務(wù)可能采用的rpc方式,有的服務(wù)采用的restful方式,有的甚至可能采用的比較古老的web Service,在網(wǎng)關(guān)這一層我們可以統(tǒng)一通信協(xié)議,這樣客戶端調(diào)用起來會(huì)方便很多。
可以統(tǒng)一整個(gè)系統(tǒng)的認(rèn)證和授權(quán)功能,甚至可以統(tǒng)一不同的客戶端采用的不同認(rèn)證方式,比如Cookie認(rèn)證,Session認(rèn)證等。
可以統(tǒng)一設(shè)置后端服務(wù)的保護(hù)策略,比如:不同的服務(wù)可以設(shè)置不同的白名單系統(tǒng),不同的服務(wù)可以采用不同的限流策略等。
在網(wǎng)關(guān)這個(gè)統(tǒng)一的入口,更容易做日志的收集工作。
雖然網(wǎng)關(guān)很香,但是一旦整個(gè)系統(tǒng)引入網(wǎng)關(guān),就會(huì)隨之帶來一些問題:
增加了網(wǎng)關(guān),在請(qǐng)求的整個(gè)過程中就至少多了一層轉(zhuǎn)發(fā),性能會(huì)有稍微下降。
網(wǎng)關(guān)如果出現(xiàn)問題,降造成整個(gè)系統(tǒng)不穩(wěn)定,甚至down機(jī),這就是網(wǎng)關(guān)的單點(diǎn)問題。所以一般網(wǎng)關(guān)都會(huì)有多個(gè)節(jié)點(diǎn)。
如何引入網(wǎng)關(guān)
在沒有網(wǎng)關(guān)的時(shí)候,系統(tǒng)一般都會(huì)有一個(gè)無狀態(tài)的web層,這一層的主要作用是根據(jù)業(yè)務(wù)組織后端服務(wù)結(jié)果來響應(yīng)客戶端的請(qǐng)求,例如:一個(gè)訂單詳情的請(qǐng)求,web層會(huì)同時(shí)請(qǐng)求訂單服務(wù)來查詢訂單信息,請(qǐng)求用戶服務(wù)來查詢下單人信息,請(qǐng)求商戶服務(wù)來查詢商家信息,然后把這些信息組合成客戶端想要的數(shù)據(jù)格式,然后返回客戶端數(shù)據(jù)。
image如果做鑒權(quán),限流等操作,同樣也是做在這個(gè)web層,在引入了網(wǎng)關(guān)之后,這個(gè)web層到底還要不要呢?不同的公司有不同的做法,不過我還是建議保留web層,用它來做服務(wù)的聚合層,這樣整體架構(gòu)就變成了這樣
image網(wǎng)關(guān)和負(fù)載均衡
通過以上闡述可以看到,網(wǎng)關(guān)在部署架構(gòu)上和負(fù)載均衡器很像,但是它們其實(shí)是兩種東西。雖然它們都會(huì)承載統(tǒng)一的入口流量,但是負(fù)載均衡器只是單純的對(duì)請(qǐng)求的轉(zhuǎn)發(fā),而網(wǎng)關(guān)除了對(duì)請(qǐng)求的轉(zhuǎn)發(fā)之外,更重要的職責(zé)是統(tǒng)一的業(yè)務(wù)處理,就像鑒權(quán),限流,降級(jí)等。
所以從功能角度來說,網(wǎng)關(guān)幾乎可以代替負(fù)載均衡器。
寫在最后
你的系統(tǒng)是否需要網(wǎng)關(guān)不僅僅要看系統(tǒng)的需求,還要看公司的整體技術(shù)運(yùn)維能力,畢竟一旦引入網(wǎng)關(guān),它對(duì)技術(shù)上的要求比較高,而且對(duì)高可用和性能比較敏感。但是網(wǎng)關(guān)對(duì)于那些統(tǒng)一化的需求有著天然的優(yōu)勢(shì),無論是鑒權(quán),還是服務(wù)的治理,所以很多公司引入了網(wǎng)關(guān)。無論是采用自建還是開源來實(shí)現(xiàn)網(wǎng)關(guān),我們都要考慮它的擴(kuò)展性。現(xiàn)在比較流行的網(wǎng)關(guān)有:Kong,Zuul,Tyk 等,詳細(xì)信息可以參見它們的官網(wǎng)。
總結(jié)
以上是生活随笔為你收集整理的程序员修神之路--分布式系统使用网关到底是好还是坏?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发项目Java是标配?.NET Co
- 下一篇: .NET Core开源任务调度平台Sch