目前為止,我們已經實現了一個基於微服務,前后端分離的架構(前端服務使用SpringBoot模擬),如上圖;並且在網關上做了限流、認證、審計、授權等安全機制;在前端做了SSO單點登陸。
但是目前的架構還是有一些問題的:
1、限流:
在前面網管安全我們也說過網關上不要做細粒度的限流,主要為服務器硬件設備的並發處理能力做限流。但是對於各位服務之間,比如說訂單限流100,庫存限流100,訂單調用了庫存。網關轉發100到訂單,轉發100到庫存,並且這訂單的100各請求也調用庫存,庫存請求達到200,服務可能就會掛掉。
2、認證:
目前的做法是,經過OAuth2流程以后,給前端發送令牌。每次前端請求都會帶着這個令牌,在網關上,回調用認證服務器校驗這個令牌。通過后再請求頭中放入username,再轉發到其他微服務,其他微服務從請求頭中獲取username,得到當前用戶。
改流程存在以下問題:
2.1、效率低:網關上每個請求都要取認證服務器校驗令牌。多一次網絡開銷,認證服務器壓力也會變大,並且如果認證服務器掛了,所有的請求都無法訪問微服務了。
2.2、不安全:傳遞用戶信息,是再請求頭中添加username,網關轉發到訂單服務,訂單服務從請求頭中獲取用戶信息,那么如果再有一個別的服務,直接調用訂單服務,在請求頭中添加一個username,訂單服務也會認為是該用戶請求的,不安全。我們不能通過請求或請求頭中的一個明文參數來判斷一個用戶是誰。
3、授權:
只能控制當前請求是否能調用某個微服務,而不能控制微服務之間的調用。
4、服務雪崩:
如果某個微服務因為網絡或數據庫等問題,導致服務響應變慢,再有別的服務對他進行調用,別的服務也會變慢。僅僅是因為一個服務除了問題,而導致大量的服務不可用。
接下來,我們就來解決這些問題。