2021-02-06

服務(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í)吖】,我是哩哩锉矢,一個有趣的靈魂梯嗽!下期見!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沽损,一起剝皮案震驚了整個濱河市灯节,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缠俺,老刑警劉巖显晶,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壹士,居然都是意外死亡磷雇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門躏救,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯笙,“玉大人,你說我怎么就攤上這事盒使”谰颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵少办,是天一觀的道長苞慢。 經(jīng)常有香客問我,道長英妓,這世上最難降的妖魔是什么挽放? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蔓纠,結(jié)果婚禮上辑畦,老公的妹妹穿的比我還像新娘。我一直安慰自己腿倚,他們只是感情好纯出,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敷燎,像睡著了一般暂筝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硬贯,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天乖杠,我揣著相機與錄音,去河邊找鬼澄成。 笑死胧洒,一個胖子當(dāng)著我的面吹牛畏吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卫漫,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菲饼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了列赎?” 一聲冷哼從身側(cè)響起宏悦,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎包吝,沒想到半個月后饼煞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡诗越,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年砖瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷狞。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡块促,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出床未,到底是詐尸還是另有隱情竭翠,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布薇搁,位于F島的核電站斋扰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啃洋。R本人自食惡果不足惜褥实,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裂允。 院中可真熱鬧,春花似錦哥艇、人聲如沸绝编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十饥。三九已至,卻和暖如春祖乳,著一層夾襖步出監(jiān)牢的瞬間逗堵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工眷昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜒秤,地道東北人汁咏。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像作媚,于是被迫代替她去往敵國和親攘滩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容