Zuul之身份認證
微服務架構所面臨的問題?
1)針對某個功能,客戶端在微服務架構的情況下需要請求多個模塊接口
2)針對於身份認證、日誌、流量控制等公共模塊每個微服務都需要做一遍,不利於業務與非業務的拆分
Zuul可以做什麼
1)客戶端只需要知道網關而不需要知道具體模塊的地址,所有服務由網關對外提供
2)身份認證類的東西單獨抽象出來,業務模塊只做業務
3)易於監控。可在微服務網關收集監控數據並將其推送到外部系統進行分析。
Zuul如何進行身份認證?
1)filterType生命週期介紹圖
2) 如何對請求參數授權、驗籤和解密?
通過繼承ZuulFilter指定filterType爲pre, RequestContext.getCurrentContext()獲取當前請求的上下文,並獲取到對應的請求參數,通過請求的appKey和對應的方法判斷用戶是否有訪問該服務的權限、請求次數等。根據參數進行驗籤和解密,將解密後的參數重寫請求上下文HttpServletRequestWrapper,再通過routing發送到對應的springcloud服務中,在服務方中獲取到的請求參數是明文,服務方無需關注調用方請求信息的解密操作。因後續需要再次獲取到部分調用方基礎信息,需將請求的入參存放到request的Attribute裏面。前置處理部分代碼如下
3) 如何對返回結果加密和加簽?
可以通過繼承ZuulFilter指定filterType爲post
通過獲取request裏面的request.getAttribute(“”)獲取到調用方的基礎信息,根據這些信息把微服務返回的body進行加簽和加密,返回至調用方。
部分代碼如下: