服務(wù)網(wǎng)關(guān)
隨著微服務(wù)的不斷增多蔑鹦,不同的微服務(wù)一般會有不同的網(wǎng)絡(luò)地址夺克,而外部客戶端可能需要調(diào)用多個服務(wù)的接口才能完成一個業(yè)務(wù)需求,如果讓客戶端直接與各個微服務(wù)通信可能出現(xiàn):
客戶端會多次請求不同的微服務(wù)举反,增加了客戶端的復(fù)雜性
存在跨域請求懊直,在一定場景下處理相對復(fù)雜
身份認(rèn)證問題,每個微服務(wù)需要獨立身份認(rèn)證
難以重構(gòu)火鼻,隨著項目的迭代,可能需要重新劃分微服務(wù)
某些微服務(wù)可能使用了防火墻/瀏覽器不友好的協(xié)議雕崩,直接訪問會有一定的困難
針對這些問題魁索,API網(wǎng)關(guān)順勢而生。
API 網(wǎng)關(guān)直面意思是將所有 API 調(diào)用統(tǒng)一接入到 API 網(wǎng)關(guān)層盼铁,由網(wǎng)關(guān)層統(tǒng)一接入和輸出粗蔚。一個網(wǎng)關(guān)的基本功能有:統(tǒng)一接入、安全防護(hù)饶火、協(xié)議適配鹏控、流量管控、長短連接支持肤寝、容錯能力当辐。有了網(wǎng)關(guān)之后,各個 API 服務(wù)提供團(tuán)隊可以專注于自己的的業(yè)務(wù)邏輯處理鲤看,而 API 網(wǎng)關(guān)更專注于安全缘揪、流量、路由等問題义桂。
服務(wù)調(diào)用
在微服務(wù)架構(gòu)中找筝,通常存在多個服務(wù)之間的遠(yuǎn)程調(diào)用的需求。目前主流的遠(yuǎn)程調(diào)用技術(shù)有基于 HTTP 的 RESTful 接口和基于 TCP 的 RPC 協(xié)議慷吊。以上兩種都屬于同步通信袖裕,還有基于隊列模式的異步通信。
REST(Representational State Transfer):一種 HTTP 調(diào)用的格式溉瓶,更標(biāo)準(zhǔn)急鳄,更通用,無論哪種語言都支持 http 協(xié)議嚷闭。
RPC(Remote Promote Call):一種進(jìn)程間通信方式攒岛,允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)。RPC 框架的主要目標(biāo)就是讓遠(yuǎn)程服務(wù)調(diào)用更簡單胞锰、透明灾锯。RPC 框架負(fù)責(zé)屏蔽底層的傳輸方式、序列化方式和通信細(xì)節(jié)嗅榕。開發(fā)人員在使用的時候只需要了解誰在什么位置提供了什么樣的遠(yuǎn)程服務(wù)接口即可顺饮,并不需要關(guān)心底層通信細(xì)節(jié)和調(diào)用過程吵聪。
比較項 | REST | RPC |
---|---|---|
通訊協(xié)議 | HTTP | 一般使用 TCP |
性能 | 略低 | 較高 |
靈活度 | 高 | 低 |
應(yīng)用 | 微服務(wù)架構(gòu) | SOA 架構(gòu) |
服務(wù)治理
服務(wù)治理就是進(jìn)行服務(wù)的自動化管理,其核心是服務(wù)的自動注冊與發(fā)現(xiàn)兼雄。
服務(wù)注冊:服務(wù)實例將自身服務(wù)信息注冊到注冊中心吟逝。
服務(wù)發(fā)現(xiàn):服務(wù)實例通過注冊中心,獲取注冊到其中的服務(wù)實例的信息赦肋,通過這些信息去請求它們提供的服務(wù)块攒。
服務(wù)剔除:服務(wù)注冊中心將出問題的服務(wù)自動剔除到可用列表之外,使其不會被調(diào)用到佃乘。
負(fù)載均衡
服務(wù)高可用的保證手段囱井,為了保證高可用,每一個微服務(wù)都需要部署多個服務(wù)實例來提供服務(wù)趣避,此時就需要根據(jù)不同的負(fù)載均衡策略對服務(wù)進(jìn)行調(diào)用庞呕。
負(fù)載均衡策略
輪詢策略
實現(xiàn)原理:輪詢策略表示每次都順序取下一個 provider,比如一共有 5 個 provider程帕,第 1 次取第 1 個住练,第 2 次取第 2 個,第 3 次取第 3 個愁拭,以此類推讲逛。
權(quán)重輪詢策略
實現(xiàn)原理:
根據(jù)每個 provider 的響應(yīng)時間分配一個權(quán)重,響應(yīng)時間越長敛苇,權(quán)重越小妆绞,被選中的可能性越低。
原理:一開始為輪詢策略枫攀,并開啟一個計時器括饶,每 30 秒收集一次每個 provider 的平均響應(yīng)時間,當(dāng)信息足夠時来涨,給每個 provider 附上一個權(quán)重图焰,并按權(quán)重隨機選擇 provider,高權(quán)越重的 provider 會被高概率選中蹦掐。
隨機策略
實現(xiàn)原理:從 provider 列表中隨機選擇一個技羔。
最少并發(fā)數(shù)策略
實現(xiàn)原理:選擇正在請求中的并發(fā)數(shù)最小的 provider,除非這個 provider 在熔斷中卧抗。
重試策略
實現(xiàn)原理:其實就是輪詢策略的增強版藤滥,輪詢策略服務(wù)不可用時不做處理,重試策略服務(wù)不可用時會重新嘗試集群中的其他節(jié)點社裆。
可用性敏感策略
實現(xiàn)原理:過濾性能差的 provider
第一種:過濾掉在 Eureka 中處于一直連接失敗的 provider拙绊。
第二種:過濾掉高并發(fā)(繁忙)的 provider。
區(qū)域敏感性策略
實現(xiàn)原理:
以一個區(qū)域為單位考察可用性,對于不可用的區(qū)域整個丟棄标沪,從剩下區(qū)域中選可用的 provider榄攀。
如果這個 ip 區(qū)域內(nèi)有一個或多個實例不可達(dá)或響應(yīng)變慢,都會降低該 ip 區(qū)域內(nèi)其他 ip 被選中的權(quán) 重金句。
服務(wù)容錯
在微服務(wù)中檩赢,一個請求經(jīng)常會涉及到調(diào)用多個服務(wù),如果其中某個服務(wù)不可用违寞,沒有做服務(wù)容錯的話贞瞒,極有可能會造成一連串的服務(wù)不可用,這就是雪崩效應(yīng)趁曼。最終的結(jié)果就是:一個服務(wù)不可用憔狞,導(dǎo)致一系列服務(wù)的不可用。
造成雪崩的原因可以歸結(jié)為以下三點:
服務(wù)提供者不可用(硬件故障彰阴,程序 BUG,緩存擊穿拍冠,用戶大量請求等)
重試加大流量(用戶重試尿这,代碼邏輯重試)
服務(wù)消費者不可用(同步等待造成的資源耗盡)
我們沒法預(yù)防雪崩效應(yīng)的發(fā)生,只能盡可能去做好容錯庆杜。服務(wù)容錯的三個核心思想是:
不被外界環(huán)境影響
不被上游請求壓垮
不被下游響應(yīng)拖垮
鏈路追蹤
隨著微服務(wù)架構(gòu)的流行射众,服務(wù)按照不同的維度進(jìn)行拆分,一次請求往往需要涉及到多個服務(wù)晃财∵冻鳎互聯(lián)網(wǎng)應(yīng)用構(gòu)建在不同的軟件模塊集上,這些軟件模塊断盛,有可能是由不同的團(tuán)隊開發(fā)罗洗、可能使用不同的編程語言來實現(xiàn)、有可能布在了幾千臺服務(wù)器钢猛,橫跨多個不同的數(shù)據(jù)中心伙菜。因此,就需要對一次請求涉及的多個服務(wù)鏈路進(jìn)行日志記錄命迈,性能監(jiān)控等等贩绕。單純的理解鏈路追蹤,就是指一次任務(wù)的開始到結(jié)束壶愤,期間調(diào)用的所有系統(tǒng)及耗時(時間跨度)都可以完整記錄下來淑倾。
鏈路追蹤系統(tǒng)做好了,鏈路數(shù)據(jù)有了征椒,借助前端解析和渲染工具娇哆,可以達(dá)到下圖中的效果:
配置中心
配置文件是我們再熟悉不過的,在微服務(wù)系統(tǒng)中,每個微服務(wù)不僅僅只有代碼迂尝,還需要連接其他資源脱茉,例如數(shù)據(jù)庫的配置或功能性的開關(guān) MySQL、Redis 垄开、Security 等相關(guān)的配置琴许。除了項目運行的基礎(chǔ)配置之外,還有一些配置是與我們業(yè)務(wù)有關(guān)系的溉躲,比如說七牛存儲榜田、短信和郵件相關(guān),或者一些業(yè)務(wù)上的開關(guān)锻梳。
但是隨著微服務(wù)系統(tǒng)的不斷迭代箭券,整個微服務(wù)系統(tǒng)可能會成為一個網(wǎng)狀結(jié)構(gòu),這個時候就要考慮整個微服務(wù)系統(tǒng)的擴(kuò)展性疑枯、伸縮性辩块、耦合性等等。其中一個很重要的環(huán)節(jié)就是配置管理的問題荆永。
常規(guī)配置管理解決方案缺點:
硬編碼(需要修改代碼废亭、繁瑣、風(fēng)險大)
properties 或者 yml(集群環(huán)境下需要替換和重啟)
xml(重新打包和重啟)
由于常規(guī)配置管理有很大的缺點具钥,所以采用 Spring Cloud Config 或 Consul 或 Apollo 或 Nacos 等配置中心集中式的來管理每個服務(wù)的配置信息豆村。
安全認(rèn)證
從單體應(yīng)用架構(gòu)到分布式應(yīng)用架構(gòu)再到微服務(wù)架構(gòu),應(yīng)用的安全訪問在不斷的經(jīng)受考驗骂删。為了適應(yīng)架構(gòu)的變化掌动、需求的變化,身份認(rèn)證與鑒權(quán)方案也在不斷的變革宁玫。面對數(shù)十個甚至上百個微服務(wù)之間的調(diào)用粗恢,如何保證高效安全的身份認(rèn)證?面對外部的服務(wù)訪問撬统,該如何提供細(xì)粒度的鑒權(quán)方案适滓?
David Borsos 在倫敦的微服務(wù)大會上提出了四種解決方案:
單點登錄(SSO)
這種方案意味著每個面向用戶的服務(wù)都必須與認(rèn)證服務(wù)交互,這會產(chǎn)生大量非沉底罚瑣碎的網(wǎng)絡(luò)流量和重復(fù)的工作凭迹,隨著微服務(wù)應(yīng)用的增多,這種方案的弊端會更加明顯苦囱。
分布式 Session 方案
分布式會話方案原理主要是將關(guān)于用戶認(rèn)證的信息存儲在共享存儲中嗅绸,且通常由用戶會話作為 Key 來實現(xiàn)的簡單分布式哈希映射。當(dāng)用戶訪問微服務(wù)時撕彤,用戶數(shù)據(jù)可以從共享存儲中獲取鱼鸠。這種方案的缺點在于共享存儲需要一定保護(hù)機制猛拴,因此需要通過安全連接來訪問,這時解決方案的實現(xiàn)就通常具有相當(dāng)高的復(fù)雜性了蚀狰。
客戶端 Token 方案
令牌在客戶端生成愉昆,由身份驗證服務(wù)進(jìn)行簽名,并且必須包含足夠的信息麻蹋,以便可以在所有微服務(wù)中建立用戶身份跛溉。令牌會附加到每個請求上,為微服務(wù)提供用戶身份驗證扮授,這種解決方案的安全性相對較好芳室,但身份驗證注銷是一個大問題,緩解這種情況的方法可以使用短期令牌和頻繁檢查認(rèn)證服務(wù)等刹勃。對于客戶端令牌的編碼方案堪侯,David Borsos 更喜歡使用 JSON Web Tokens(JWT),它足夠簡單且?guī)熘С殖潭纫脖容^好荔仁。
客戶端 Token 與 API 網(wǎng)關(guān)結(jié)合
這個方案意味著所有請求都通過網(wǎng)關(guān)伍宦,從而有效地隱藏了微服務(wù)。 在請求時乏梁,網(wǎng)關(guān)將原始用戶令牌轉(zhuǎn)換為內(nèi)部會話 ID 令牌雹拄。在這種情況下,注銷就不是問題掌呜,因為網(wǎng)關(guān)可以在注銷時撤銷用戶的令牌。
總結(jié)
在微服務(wù)架構(gòu)下坪哄,我們更傾向于 David Borsos 所建議的 JWT 方案质蕉,將 OAuth2 和 JWT 結(jié)合使用,OAuth2 一般用于第三方接入的場景翩肌,管理對外的權(quán)限模暗,所以比較適合和 API 網(wǎng)關(guān)結(jié)合,針對于外部的訪問進(jìn)行鑒權(quán)(當(dāng)然念祭,底層 Token 標(biāo)準(zhǔn)采用 JWT 也是可以的)兑宇。
JWT 更加輕巧,在微服務(wù)之間進(jìn)行認(rèn)證&鑒權(quán)已然足夠粱坤,并且可以避免和身份認(rèn)證服務(wù)直接打交道隶糕。當(dāng)然,從能力實現(xiàn)角度來說站玄,類似于分布式 Session 在很多場景下也是完全能滿足需求,具體怎么去選擇鑒權(quán)方案,還是要結(jié)合實際的需求來偎漫。
今天要說的微服務(wù)架構(gòu)生態(tài)體系篇暫時先說這么多溅固,了解更多技術(shù)干貨,關(guān)注公眾號【樂字節(jié)發(fā)送123可了解我們一起學(xué)習(xí)吖】,我是哩哩锉矢,一個有趣的靈魂梯嗽!下期見!