網(wǎng)關(guān)的作用
1.提供統(tǒng)一的鑒權(quán)、限流、協(xié)議轉(zhuǎn)換等非業(yè)務(wù)基礎(chǔ)的能力,減少業(yè)務(wù)研發(fā)對非業(yè)務(wù)基礎(chǔ)能力的建設(shè)投入
2.提供快速配置化的接口管理部署能力,提升接口開放的研發(fā)效率
3.統(tǒng)一流量入口,有利于流量的統(tǒng)一安全管控以及基礎(chǔ)架構(gòu)升級
4.業(yè)務(wù)統(tǒng)一托管API接口,根據(jù)流量分配資源,提升資源利用率
接收網(wǎng)絡(luò)請求以及處理網(wǎng)絡(luò)情況
在高并發(fā)大流量的情況下,往往客戶端存在每秒數(shù)十萬的請求,因此服務(wù)器如何高效的接收網(wǎng)絡(luò)以及處理網(wǎng)絡(luò)請求是非常重要的一項能力。為了達(dá)到這一性能要求,我們選用epoll IO多路復(fù)用機(jī)制,IO模型采用同步非阻塞模式,即NIO模式,這樣便能使用較小的系統(tǒng)開銷處理較大的網(wǎng)絡(luò)請求
java nio
加解密與簽名
為了增加請求響應(yīng)的安全性,往往會對請求響應(yīng)進(jìn)行加解密以及參數(shù)簽名處理,以進(jìn)行驗證用戶身份,加解密的密鑰可以采用靜態(tài)或動態(tài)兩種方式,靜態(tài)時密鑰不變且統(tǒng)一,動態(tài)可以采用用戶登錄后發(fā)放,實現(xiàn)一用戶一密鑰的方式,加解密算法可采用常見的加解密算法,如RSA、AES、DES等。簽名時首先對參數(shù)進(jìn)行排序,以便客戶端與服務(wù)端驗證一致,后將排序后的參數(shù)進(jìn)行拼接,最后生成簽名串,簽名算法可采用HmacSHA256、HmacSHA1等算法
鑒權(quán)認(rèn)證
鑒權(quán)認(rèn)證是對用戶身份及操作權(quán)限的安全檢查,是安全的重要保障。網(wǎng)關(guān)鑒權(quán)類型有Basic認(rèn)證(基本認(rèn)證)、Digest認(rèn)證(摘要認(rèn)證)、JWT認(rèn)證、OAuth2認(rèn)證、自建鑒權(quán)認(rèn)證等方式
1.Basic認(rèn)證:將username和password使用冒號(:)拼起來,使用base64編碼,將編碼后的字符串放在HTTP頭Authorization中,發(fā)送給服務(wù)端
2.Digest認(rèn)證:在Basic認(rèn)證的基礎(chǔ)上,增加了:1. 請求方需要對用戶名、密碼和域進(jìn)行md5傳輸,保證不明文。2. 增加了隨機(jī)數(shù)(nonce)和 qop(quality of protection),保證md5不固定
3.JWT認(rèn)證:用戶使用用戶名和口令到認(rèn)證服務(wù)器上請求認(rèn)證。認(rèn)證服務(wù)器驗證用戶名和口令后生成JWT Token(HMAC-SHA256對稱加密),然后將 base64(header).base64(payload).signature 作為 JWT Token返回客戶端??蛻舳嗽谡埱髴?yīng)用服務(wù)器資源時,帶上JWT Token。應(yīng)用服務(wù)器將JWT Token傳給認(rèn)證服務(wù)器檢查 JWT Token,確認(rèn)簽名是正確的。認(rèn)證服務(wù)器檢查JWT Payload 和 簽名,驗證通過后,告訴應(yīng)用服務(wù)器。應(yīng)用服務(wù)認(rèn)為請求合法,返回請求的資源。
4.OAuth2認(rèn)證:OAuth2.0有兩種主要的方式:授權(quán)碼模式和憑證模式。授權(quán)碼模式是最常使用的OAuth 2.0的授權(quán)許可類型,它適用于用戶給第三方應(yīng)用授權(quán)訪問自己信息的場景。憑證模式是一個簡化版的API認(rèn)證,主要是用于認(rèn)證服務(wù)器到服務(wù)器的調(diào)用,也就是沒有用戶參與的的認(rèn)證流程。
5.客戶端請求攜帶的憑證信息(即Token)的形式是業(yè)務(wù)方自定義的格式,服務(wù)端收到請求后對Token進(jìn)行鑒權(quán)驗證,Token為登錄用戶身份后發(fā)放
訪問日志與鏈路追蹤
網(wǎng)關(guān)作為流量的入口,是追蹤用戶操作的入口,因而從網(wǎng)關(guān)打印訪問日志,建立訪問日志搜索,從訪問日志追蹤鏈路是一項對于研發(fā)提升排查問題效率的重要手段。對于鏈路追蹤的建立,業(yè)界中受到Google Dapper論文影響最大,后續(xù)隨著標(biāo)準(zhǔn)規(guī)范的發(fā)展,鏈路追蹤逐漸遵循OpenTracing的標(biāo)準(zhǔn),OpenTracing 是一個中立的(廠商無關(guān)、平臺無關(guān))分布式追蹤的 API 規(guī)范,提供了統(tǒng)一接口方便開發(fā)者在自己的服務(wù)中集成一種或者多種分布式追蹤的實現(xiàn)。
鏈路追蹤的一種呈現(xiàn)
限流
1.網(wǎng)關(guān)在超額流量下,首先要對網(wǎng)關(guān)的總請求量進(jìn)行控制,同時也要對同時處理的請求進(jìn)行線程控制,避免請求被積壓堆積造成大量的超時
2.對單個網(wǎng)關(guān)接口進(jìn)行限流,避免下游服務(wù)被超額流量沖擊壓垮
3.對用戶、ip、設(shè)備維度進(jìn)行限流,降低機(jī)器刷接口的可能
限流通常有單機(jī)限流與集群限流兩種方式,限流算法包含有固定窗口限流算法、滑動窗口限流算法、漏桶算法、令牌桶算法等。集群限流一般實現(xiàn)方式基于令牌桶算法思想,我們建立一個token server,從token server獲取令牌,達(dá)到集群限流的目的,但在限流設(shè)計時我們需考慮token server不穩(wěn)定的因素,當(dāng)token server不穩(wěn)定時,我們應(yīng)當(dāng)首先保障請求的正常,因此當(dāng)token server不穩(wěn)定時,我們需將限流從集群限流退化到單機(jī)限流的模式,以保障網(wǎng)關(guān)的穩(wěn)定可用
協(xié)議轉(zhuǎn)換與路由
隨著微服務(wù)的普及落地,內(nèi)部系統(tǒng)間采用著RPC協(xié)議進(jìn)行著通訊,外部的請求通常為HTTP協(xié)議,因此網(wǎng)關(guān)承擔(dān)著將HTTP協(xié)議轉(zhuǎn)換為內(nèi)部RPC協(xié)議的作用,網(wǎng)關(guān)需要完成的工作包括:獲取HTTP請求參數(shù)、Context本地參數(shù),拼裝后端服務(wù)參數(shù),完成HTTP協(xié)議到后端服務(wù)的協(xié)議轉(zhuǎn)換,調(diào)用后端服務(wù)獲取響應(yīng)結(jié)果并轉(zhuǎn)換為HTTP響應(yīng)結(jié)果。路由策略采用RPC路由策略即可,因此我們需要接入注冊中心這樣的應(yīng)用,緩存服務(wù)器目標(biāo)
熔斷降級
網(wǎng)關(guān)的下游服務(wù)處于隨時可能發(fā)生故障的狀態(tài),當(dāng)下游發(fā)生故障時,網(wǎng)關(guān)rpc請求耗時增加,引起請求失敗與積壓,正在請求的用戶面臨失敗的請求可能會進(jìn)行不斷的重試,造成處理量增加,請求排隊的情況,從而引起網(wǎng)關(guān)負(fù)載的上升,因此我們需要在下游發(fā)生故障時,具備熔斷降級的能力,屏蔽掉下游服務(wù)故障,避免網(wǎng)關(guān)發(fā)生負(fù)載陡升。熔斷降級限于篇幅這里也不詳細(xì)講述了,后續(xù)再詳細(xì)進(jìn)行介紹,常見的開源熔斷降級方案包含有hystrix、sentinel等
實時監(jiān)控
一個系統(tǒng)的運行情況需要建立一套實時監(jiān)控面板來進(jìn)行觀察,避免黑盒情況的運行,因此我們需要對網(wǎng)關(guān)的各種運行狀態(tài)進(jìn)行觀察,其中應(yīng)當(dāng)包括:請求量、請求耗時、請求狀態(tài)碼、正在處理的請求數(shù)、處理的請求異常量、流量、rpc轉(zhuǎn)發(fā)量、rpc異常量與分布、rpc耗時、鑒權(quán)認(rèn)證熔斷降級限流量等等
內(nèi)部調(diào)試與灰度發(fā)布
在研發(fā)過程時,往往存在著多人研發(fā)同一服務(wù)的場景,或者研發(fā)與測試共同進(jìn)行驗證到同一服務(wù)的場景,此時便產(chǎn)生了使用的沖突,導(dǎo)致研發(fā)測試效率的沖突,團(tuán)隊還經(jīng)常產(chǎn)生爭議。因此在內(nèi)部調(diào)試與測試時,我們需要支持多泳道部署的能力,不同場景使用不同的泳道,如下圖:
泳道部署運行
這樣便能支持不同人群不同的使用場景驗證,解決掉內(nèi)部調(diào)試、測試之間的沖突,提升研發(fā)效率。同樣對于線上發(fā)布時,我們需要驗證一部分人群,這時需要使用泳道的方式將部分人群灰度到新發(fā)布的集群,達(dá)到灰度發(fā)布的能力。網(wǎng)關(guān)作為鏈路中的節(jié)點,需要支持泳道的能力,常見的方案是使用上下文中攜帶染色路由tag的方式,tag在鏈路中傳遞,路由時根據(jù)tag優(yōu)先找到同一tag的服務(wù)注冊節(jié)點進(jìn)行路由選擇
管理能力
1.域管理能力。我們在面臨多業(yè)務(wù)場景時,應(yīng)當(dāng)具備多業(yè)務(wù)域場景的管理能力,因此需要支持多域的快速配置管理的能力,支持域場景的能力
2.接口配置能力。在業(yè)務(wù)場景內(nèi),需要將對外發(fā)布的接口配置在網(wǎng)關(guān)內(nèi),也需將對外接口與內(nèi)部RPC的映射關(guān)系配置在內(nèi),以便內(nèi)部路由轉(zhuǎn)發(fā)時使用
3.多環(huán)境部署能力。在研發(fā)過程中研發(fā)人員在測試環(huán)境中配置了大量的待上線接口,待到上線時我們需要將測試環(huán)境要上線的接口快速導(dǎo)入到線上環(huán)境中,而非手工重新錄入,手工重新錄入通常存在操作失誤的情況,我們要像代碼部署一樣,接口配置同樣具備持續(xù)集成能力
4.發(fā)布管控能力。任何部署上線的變動應(yīng)當(dāng)都在管控范圍內(nèi),降低隨意操作變動造成大范圍故障的風(fēng)險,其中應(yīng)當(dāng)包含發(fā)布權(quán)限控制、發(fā)布審批、灰度發(fā)布、發(fā)布時間控制等
網(wǎng)關(guān)高可用設(shè)計
1.采用集群部署隔離能力,將不同域分配在不同的集群上,避免域故障時的相互影響
2.使用請求隔離,將核心接口獨立線程池隔離處理,非核心接口必要時可快速降級
3.自身穩(wěn)定性保障手段,使用總量限流保障自身最大正常運行,熔斷降級減少下游故障對網(wǎng)關(guān)產(chǎn)生的影響
4.超時管理,對下游接口請求進(jìn)行超時管理,對超時的接口請求進(jìn)行資源釋放
-
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
4444瀏覽量
51056 -
API
+關(guān)注
關(guān)注
2文章
1499瀏覽量
61961 -
流量
+關(guān)注
關(guān)注
0文章
245瀏覽量
23891
發(fā)布評論請先 登錄
相關(guān)推薦
評論