分佈式系統使用網關到底是好還是壞?

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"靈魂拷問"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分佈式系統需要統一的網關嗎?"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網關會帶來哪些優勢?"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"引入網關會帶來災難嗎?"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分佈式系統的設計大體上分爲中心化和非中心化,像現在流行的微服務模式,本質上是把各種業務拆分爲獨立的進程來實現業務的擴展性。伴隨着業務的不斷被拆分,整體的系統性能也有所提高,但是系統又往往面臨着中心化的需求,這個世界就是這麼有趣,我們不但要非中心化的優勢,還要保證中心化的優勢。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"link","attrs":{"href":"#統一的需求","title":null}},{"type":"text","text":"統一的需求"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說到非中心化需求,最簡單最常見的就是鑑權,簡單來說就是判斷用戶是否有執行某種動作的權限。以鑑權爲例,當有N個微服務有同樣的鑑權需求的時候,有以下幾種解決方案:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個服務自己實現一遍"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"寫一個公共的服務接口,每個服務都調用這個接口"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"寫到統一的流量入口處,只需要實現一次"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有人說第一種方案沒人用,是嗎?在服務數量不是太多的情況下,據我所知有很多公司初期都是每個服務都實現自己的鑑權,不要說這種做法一無是處,首先在各個團隊技術棧不同的情況下,這是一個團隊可以快速實現功能的一種解決方案,而且不依賴於任何其他服務,這意味着這個服務不會受到別的服務的影響,這體現的是非中心化最核心的價值之一。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"至於第二種解決方案是典型的集中式處理的方案之一,他按照業務功能把鑑權獨立成單獨的服務,所有使用鑑權服務的系統都依賴於這個服務,所以這個統一的鑑權服務需要保證高可用,而且對性能比較敏感,稍有不慎,流量高峯就有可能對整個系統造成致命打擊。但是,還是有不少公司在用這種架構模式,你說奇怪不奇怪,正所謂,存在即合理。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"至於第三種使用網關模式,可以說是目前市面上文章吹捧最多的解決方案。當然得到廣大程序員的吹捧自然有它的優勢,但是請記住,它並非沒有劣勢。"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/99/9913f07787c9eb3b9296bae7c40a14de.jpeg","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從上圖清晰的可以看到,來自於客戶端的所有流量都經過網關,所以理論上來講,所有統一化的需求都可以在網關進行實現,這樣每個後端的業務服務代碼都不會有任何的侵入性。至於這些需求最常見的有:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網關可以屏蔽後端服務的協議細節,比如有的服務可能採用的rpc方式,有的服務採用的restful方式,有的甚至可能採用的比較古老的web Service,在網關這一層我們可以統一通信協議,這樣客戶端調用起來會方便很多。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以統一整個系統的認證和授權功能,甚至可以統一不同的客戶端採用的不同認證方式,比如Cookie認證,Session認證等。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以統一設置後端服務的保護策略,比如:不同的服務可以設置不同的白名單系統,不同的服務可以採用不同的限流策略等。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在網關這個統一的入口,更容易做日誌的收集工作。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然網關很香,但是一旦整個系統引入網關,就會隨之帶來一些問題:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"增加了網關,在請求的整個過程中就至少多了一層轉發,性能會有稍微下降。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網關如果出現問題,降造成整個系統不穩定,甚至down機,這就是網關的單點問題。所以一般網關都會有多個節點。"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"link","attrs":{"href":"#如何引入網關","title":null}},{"type":"text","text":"如何引入網關"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在沒有網關的時候,系統一般都會有一個無狀態的web層,這一層的主要作用是根據業務組織後端服務結果來響應客戶端的請求,例如:一個訂單詳情的請求,web層會同時請求訂單服務來查詢訂單信息,請求用戶服務來查詢下單人信息,請求商戶服務來查詢商家信息,然後把這些信息組合成客戶端想要的數據格式,然後返回客戶端數據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ca/caafdfff596794806a0cc08878133434.jpeg","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果做鑑權,限流等操作,同樣也是做在這個web層,在引入了網關之後,這個web層到底還要不要呢?不同的公司有不同的做法,不過我還是建議保留web層,用它來做服務的聚合層,這樣整體架構就變成了這樣"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4a/4a828a62bd9b682bd80e6363f2ee82fb.jpeg","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"link","attrs":{"href":"#網關和負載均衡","title":null}},{"type":"text","text":"網關和負載均衡"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過以上闡述可以看到,網關在部署架構上和負載均衡器很像,但是它們其實是兩種東西。雖然它們都會承載統一的入口流量,但是負載均衡器只是單純的對請求的轉發,而網關除了對請求的轉發之外,更重要的職責是統一的業務處理,就像鑑權,限流,降級等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以從功能角度來說,網關幾乎可以代替負載均衡器。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"link","attrs":{"href":"#寫在最後","title":null}},{"type":"text","text":"寫在最後"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你的系統是否需要網關不僅僅要看系統的需求,還要看公司的整體技術運維能力,畢竟一旦引入網關,它對技術上的要求比較高,而且對高可用和性能比較敏感。但是網關對於那些統一化的需求有着天然的優勢,無論是鑑權,還是服務的治理,所以很多公司引入了網關。無論是採用自建還是開源來實現網關,我們都要考慮它的擴展性。現在比較流行的網關有:Kong,Zuul,Tyk 等,詳細信息可以參見它們的官網。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"更多精彩文章"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1342955119549267969&__biz=MzIwNTc3OTAxOA==#wechat_redirect","title":null},"content":[{"type":"text","text":"分佈式大併發系列"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1342959003139227648&__biz=MzIwNTc3OTAxOA==#wechat_redirect","title":null},"content":[{"type":"text","text":"架構設計系列"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1342962375443529728&__biz=MzIwNTc3OTAxOA==#wechat_redirect","title":null},"content":[{"type":"text","text":"趣學算法和數據結構系列"}]}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1342964237798391808&__biz=MzIwNTc3OTAxOA==#wechat_redirect","title":null},"content":[{"type":"text","text":"設計模式系列"}]}]}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f8/f8af5984765a267892bf1a1272272625.png","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章