什么是網關?
兩個獨立的局域網之間通信的橋梁/ 或可以理解為外部所有請求都會打在網關上,網關對請求分發路由等處理,隱藏了內部服務的各種API接口
網關作用及功能
1. 動態路由 根據請求路由到對應的服務上去,如果服務不可用還會有重試機制
2. 負載均衡 多服務器提供同一種服務,網關會從注冊中心拉取各服務注冊信息,然后將請求負載均衡處理
3. 流量控制 限制流量 避免內部系統受到沖擊
4. 統一鑒權 網關對相關權限驗證 (請求者的訪問權限,還可實現SSO單點登錄)
5. 熔斷降級 當服務不可用或者訪問量過大,網關可以將請求做降級 打到其他服務器或者做其他處理,提示用戶暫時不可用
6. 灰度發布 只給少量服務器升級,通過網關將少量的服務打到已升級的服務器用來測試升級的服務器,大量請求還是打在老版本服務器
7. 日志服務 服務訪問情況報表,請求吞吐量,並發數,日常告警
常用網關框架
Zuul SringCloud對應的網關
Kong Nginx + Lua 在Nginx運行的Lua應用程序
網關涉及原理
協議轉換 : 每個系統使用的協議不同(http,grpc,dubbo協議) 通過網關進行協調統一
鏈式處理 : 網關處理請求類似責任鏈模式 經過各個過濾器處理請求
異步請求 : 網關中線程數量有限,每個線程帶着請求去訪問服務 然后等待服務訪問結果返回 這個過程是很浪費時間的,在高並發下無法完成
異步請求 工作線程不必要等待服務返回結果就可以去處理下一個請求,網關的Reactor線程專門負責select輪詢 Socket訪問結果,一旦發現有結果返回 就通知工作線程來處理返回結果
網管實現動態路由:
動態路由(不必要每次服務地址變動都要重新配置網關重新啟動)
原理:
可以在網關數據庫建一張表,用來存儲不同服務對應的配置信息。然后配置一個前端入口,每次動態的在頁面修改配置信息完成數據庫修改。
后端網關路由讀取這張表完成配置
限流概念
高並發架構三要素: 緩存 + 降級 + 限流
限流的類型:
1.並發量限流, 例如每秒限制100個請求,在一定時間范圍內限制和請求頻率
2.請求頻率限流, 例如來自某個ip/某個用戶的請求,限制每秒鍾請求不能超過5次
3.上傳下載速率, 例如限制某個用戶的下載速度最多 100KB/S, 在下載場景下比較常用,比如一些資源下載站會限制普通用戶的下載速度,只有購買會員才能提速,這種限流的做法實際上和請求頻率限流類似,只不過一個限制的是請求量的多少,一個限制的是請求數據報文的大小。
限流后的處理:被限流的請求會如何響應
1.拋棄,直接拋異常或直接跳轉一個友好頁面
2.排隊,利用消息隊列起到消峰和限流作用
3.降級,直接做降級處理,例如商品詳情頁只返回容易查到的最基礎商品數據(兜底數據),復雜數據不再查詢直接返回。
限流方式:
1.接入層限流,如Nginx,網關處入口實現請求路由+限流,如果是及網關集群 還需要利用分布式中間件,將請求數量等信息共享
2.池化技術限流,如利用Hystrix的線程池,線程池+等待隊列這種形式實現限流
限流算法:
1.固定窗口算法,
2.滑動窗口算法,
3.漏桶算法,
4.令牌桶算法