詳解Spring Cloud Gateway應用2內置過濾器
環境:springboot2.3.7 + spring cloud Hoxton.SR9
路由過濾器允許以某種方式修改傳入的HTTP請求或輸出HTTP響應。路由過濾器的作用域為特定路由。Spring Cloud Gateway包括許多內置的GatewayFilter工廠。
1.AddRequestHeader 過濾器工廠
作用:在請求中添加header信息(向目標服務)。對應過濾器工廠AddRequestHeaderGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: AddRequestHeader_filter
- uri: http://localhost:20001
- predicates:
- - Path=/api/{user}
- filters:
- - AddRequestHeader=access-token,123456789
向目標服務http://localhost:20001/api/xxx添加請求header access-token信息。
20001服務中有對應的接口:
- @RestController
- @RequestMapping("/api/")
- public class UsersController {
- @Resource
- private HttpServletRequest request ;
- @GetMapping("/{user}")
- public Object save(@PathVariable("user") String username) {
- System.out.println(username) ;
- System.out.println("access-token = " + request.getHeader("access-token")) ;
- return "success" ;
- }
- }
啟動兩個服務,測試:

20001服務控制臺輸出:

動態header信息配置:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: AddRequestHeader_filter
- uri: http://localhost:20001
- predicates:
- - Path=/api/{token}
- filters:
- - AddRequestHeader=access-token,{token}
測試:

2.AddRequestParameter 過濾器工廠
作用:給下游服務添加查詢參數。對應過濾器工廠AddRequestParameterGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: add_request_parameter_route
- uri: http://localhost:20001
- predicates:
- - Path=/api/query
- filters:
- - AddRequestParameter=username, admin
目標服務:
- @RestController
- @RequestMapping("/api/")
- public class UsersController {
- @GetMapping("/query")
- public Object query(String username) {
- return "query " + username ;
- }
- }
測試:

3.AddResponseHeader 過濾器工廠
作用:在響應header中添加頭信息。對應過濾器工廠AddResponseHeaderGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: add_response_header_route
- uri: http://localhost:20001
- predicates:
- - Path=/api/query
- filters:
- - AddResponseHeader=server-id, nginx-001
測試:

4.PrefixPath 過濾器工廠
作用:為原始的請求路徑添加一個前綴路徑。對應過濾器工廠PrefixPathGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: prefixpath_route
- uri: http://localhost:20001
- predicates:
- - Path=/api-1/**
- filters:
- - PrefixPath=/api-1
- - StripPrefix=2
這里為了演示用到了StripPrefix過濾器,如果不配置StripPrefix那么在做請求的時候轉發到服務的地址將是:http://xxxx/api-1/api-1/api/query明顯這個地址在我們的服務上是不存在的。
StripPrefix這個過濾器的作用就是截取路徑,截取幾段路徑。如這里的http://xxxx/api-1/api-1/api/query 那會截取為http://xxxx/api/query再進行轉發。
測試:

5.StripPrefix 過濾器工廠
作用:截取指定段的請求路徑后進行路由轉發。對應過濾器工廠StripPrefixGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: prefixpath_route
- uri: http://localhost:20001
- predicates:
- - Path=/api-1/**
- filters:
- - StripPrefix=1
測試:
請求:http://xxx/api-1/api/query 截取后:http://xxx/api/query 這里StripPrefix=1表示只截取幾段路徑。

6.Retry 過濾器工廠
作用:針對不同的響應結果進行重試。對應過濾器工廠RetryGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: retry_test
- uri: http://localhost:20001
- predicates:
- - Path=/api-1/**
- filters:
- - StripPrefix=1
- - name: Retry
- args:
- retries: 3
- statuses: INTERNAL_SERVER_ERROR
- methods: GET,POST
說明:
retries:重試次數
statuses:需要重試的狀態碼,取值在 org.springframework.http.HttpStatus 中
methods:需要重試的請求方法,取值在 org.springframework.http.HttpMethod 中
series:HTTP狀態碼序列,取值在 org.springframework.http.HttpStatus.Series 中
exceptions:異常列表,對于拋出的哪些異常將會進行重試。
接口服務:
- @GetMapping("/query")
- public Object query(String username) {
- if ("dead".equals(username)) {
- throw new RuntimeException("錯誤的用戶名") ;
- }
- return "query " + username ;
- }
當請求參數username為dead時拋出異常。
測試:
成功:

失敗:

7.RedirectTo 過濾器工廠
作用:將原始請求重定向到指定的Url。對應過濾器工廠RedirectToGatewayFilterFactory
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: prefixpath_route
- uri: http://localhost:20001
- predicates:
- - Path=/api-1/**
- filters:
- - RedirectTo=302, http://localhost:20001/api/query
請求將會被重定向到 http://localhost:20001/api/query
8.default 過濾器工廠
作用:默認過濾器,為所有的路由配置默認的過濾功能。
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- default-filters:
- - PrefixPath=/api-1
- - AddRequestHeader=access-token,123
以上配置將會為所有的路由增加前綴及請求header信息。
以上是用的比較多的一些內置Filter。



























