當後端接收到一次http請求後,最先會由tomcat伺服器接受到,首先建立“HttpServletRequest”和“HttpServletResponse”物件,然後tomcat將請求交給servlet容器處理,servlet容器根據請求的url路徑和配置確定應該由哪一個Servlet來處理該請求(也就是應該例項哪一個servlet物件),注意:每一次請求都會重新建立一個servlet物件,然後呼叫servlet物件的service方法,service方法根據具體的請求型別(GET,POST)呼叫適當的“doget”,“dopost”方法來處理請求。如果說是spring專案,那麼當tomcat需要將請求轉交給servlet容器的時候,會轉而轉交給spring的dispatchservlet容器。注意,這是不會在有選擇的建立servlet例項物件,因為spring的所有請求都會交給dispatchservlet一個來接管。
gateway的執行流程:
1. 接受請求: 當有一個請求來到spring cloud gateway 時,閘道器會使用spring handle mapping來匹配請求路徑(匹配請求規則: 根據配置檔案中的路由規則,閘道器會檢查每一個路由的斷言規則(predicates))
2. 執行Pre-Filters:在請求被路由之前,Pre-Filter會被執行。這些過濾器可以訪問控制-黑白名單,進行鑑權,日誌記錄操作。
3. 轉發請求:如果匹配成功並且成功執行完了Pre-Filter過濾器後,網管會根據匹配路由的url轉發到對應的後端服務。注意:這裡的chain.filter(exchange);的執行是一個非同步的操作。在執行完前置過濾器後,非同步執行chain.filter(exchange);無需等待,便開始執行後置過濾器。我們可以在其後新增chain.filter(exchange).then();來有序的執行後置過濾器。
它的執行流程是:
Client Request -> [Pre-filter 1] -> [Pre-filter 2] -> ... -> [Pre-filter N] -> Route to Service
Service Response -> [Post-filter N] -> ... -> [Post-filter 2] -> [Post-filter 1] -> Client Response
4. 執行Post-Filter: 在後端完成響應服務之後,響應返回給客戶端之前,Post-Filter會被執行,這些過濾器可以 修改響應,日誌記錄
5. 響應返回。
gateway非同步操作的影響:
因為chain.filter(exchange)是一個非同步操作,他會出發過濾器鏈的下一個過濾器,並立刻返回Mono<Void>。如果沒有.then(),你在chain.filter(exchange)後面的程式碼都會被立刻執行,而不是等待過濾器鏈執完成。這會導致你嘗試獲取響應狀態碼時,響應還沒有執行或者完成。
返回結果可能是null或者不正確的狀態碼。