請求進入網關會碰到三類過濾器:當前路由過濾器、DefaultFilter、GlobalFilter。
請求路由后,會將當前路由過濾器和DefaultFilter、GlobalFilter,合並到一個過濾器鏈(集合)中,排序后依次執行每個過濾器
過濾器執行順序
1.每一個過濾器都必須指定一個int類型的order值,order值越小,優先級越高,執行順序越靠前。
2.GlobalFilter通過實現Ordered接口,或者添加@Order注解來指定order值,由我們自己指定
3.路由過濾器和defaultFilter的order由Spring指定,默認是按照聲明順序從1遞增。
default-filters: - AddRequestHeader=Truth,lisi is freaking awesome! #ordered 1
- AddXxxxHeader=Truth,lisi is freaking awesome! #ordered 2
4.當過濾器的order值一樣時,會按照 defaultFilter > 路由過濾器 > GlobalFilter的順序執行。
可以參考下面幾個類的源碼來查看:
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加載defaultFilters,然后再加載某個route的filters,然后合並。
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法會加載全局過濾器,與前面的過濾器合並后根據order排序,組織過濾器鏈
總結
路由過濾器、defaultFilter、全局過濾器的執行順序?
1.order值越小,優先級越高
2.當order值一樣時,順序是defaultFilter最先,然后是局部的路由過濾器,最后是全局過濾器