詳解Spring Cloud Gateway應(yīng)用2內(nèi)置過(guò)濾器
環(huán)境:springboot2.3.7 + spring cloud Hoxton.SR9
路由過(guò)濾器允許以某種方式修改傳入的HTTP請(qǐng)求或輸出HTTP響應(yīng)。路由過(guò)濾器的作用域?yàn)樘囟酚?。Spring Cloud Gateway包括許多內(nèi)置的GatewayFilter工廠。
1.AddRequestHeader 過(guò)濾器工廠
作用:在請(qǐng)求中添加header信息(向目標(biāo)服務(wù))。對(duì)應(yīng)過(guò)濾器工廠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
向目標(biāo)服務(wù)http://localhost:20001/api/xxx添加請(qǐng)求header access-token信息。
20001服務(wù)中有對(duì)應(yīng)的接口:
- @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" ;
- }
- }
啟動(dòng)兩個(gè)服務(wù),測(cè)試:

20001服務(wù)控制臺(tái)輸出:

動(dòng)態(tài)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}
測(cè)試:

2.AddRequestParameter 過(guò)濾器工廠
作用:給下游服務(wù)添加查詢參數(shù)。對(duì)應(yīng)過(guò)濾器工廠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
目標(biāo)服務(wù):
- @RestController
- @RequestMapping("/api/")
- public class UsersController {
- @GetMapping("/query")
- public Object query(String username) {
- return "query " + username ;
- }
- }
測(cè)試:

3.AddResponseHeader 過(guò)濾器工廠
作用:在響應(yīng)header中添加頭信息。對(duì)應(yīng)過(guò)濾器工廠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
測(cè)試:

4.PrefixPath 過(guò)濾器工廠
作用:為原始的請(qǐng)求路徑添加一個(gè)前綴路徑。對(duì)應(yīng)過(guò)濾器工廠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過(guò)濾器,如果不配置StripPrefix那么在做請(qǐng)求的時(shí)候轉(zhuǎn)發(fā)到服務(wù)的地址將是:http://xxxx/api-1/api-1/api/query明顯這個(gè)地址在我們的服務(wù)上是不存在的。
StripPrefix這個(gè)過(guò)濾器的作用就是截取路徑,截取幾段路徑。如這里的http://xxxx/api-1/api-1/api/query 那會(huì)截取為http://xxxx/api/query再進(jìn)行轉(zhuǎn)發(fā)。
測(cè)試:

5.StripPrefix 過(guò)濾器工廠
作用:截取指定段的請(qǐng)求路徑后進(jìn)行路由轉(zhuǎn)發(fā)。對(duì)應(yīng)過(guò)濾器工廠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
測(cè)試:
請(qǐng)求:http://xxx/api-1/api/query 截取后:http://xxx/api/query 這里StripPrefix=1表示只截取幾段路徑。

6.Retry 過(guò)濾器工廠
作用:針對(duì)不同的響應(yīng)結(jié)果進(jìn)行重試。對(duì)應(yīng)過(guò)濾器工廠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
說(shuō)明:
retries:重試次數(shù)
statuses:需要重試的狀態(tài)碼,取值在 org.springframework.http.HttpStatus 中
methods:需要重試的請(qǐng)求方法,取值在 org.springframework.http.HttpMethod 中
series:HTTP狀態(tài)碼序列,取值在 org.springframework.http.HttpStatus.Series 中
exceptions:異常列表,對(duì)于拋出的哪些異常將會(huì)進(jìn)行重試。
接口服務(wù):
- @GetMapping("/query")
- public Object query(String username) {
- if ("dead".equals(username)) {
- throw new RuntimeException("錯(cuò)誤的用戶名") ;
- }
- return "query " + username ;
- }
當(dāng)請(qǐng)求參數(shù)username為dead時(shí)拋出異常。
測(cè)試:
成功:

失敗:

7.RedirectTo 過(guò)濾器工廠
作用:將原始請(qǐng)求重定向到指定的Url。對(duì)應(yīng)過(guò)濾器工廠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
請(qǐng)求將會(huì)被重定向到 http://localhost:20001/api/query
8.default 過(guò)濾器工廠
作用:默認(rèn)過(guò)濾器,為所有的路由配置默認(rèn)的過(guò)濾功能。
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- default-filters:
- - PrefixPath=/api-1
- - AddRequestHeader=access-token,123
以上配置將會(huì)為所有的路由增加前綴及請(qǐng)求header信息。
以上是用的比較多的一些內(nèi)置Filter。