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