gateway中的局部过滤器_详解Spring Cloud Gateway应用2内置过滤器

7a83617092fd3e06b8a573297e6e8e3f.png

环境: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/")

publicclass UsersController {

@Resource

private HttpServletRequest request ;

@GetMapping("/{user}")

publicObject save(@PathVariable("user") String username) {

System.out.println(username) ;

System.out.println("access-token = "+ request.getHeader("access-token")) ;

return"success";

}

}

启动两个服务,测试:

b353d2a1a867ef15d15191871b20d9c8.png

20001服务控制台输出:

85c74145bcea88570861beb3b916e6b4.png

动态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}

测试:

a73d7b411ea0adfc70ac6db9914534ae.png

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/")

publicclass UsersController {

@GetMapping("/query")

publicObject query(String username) {

return"query "+ username ;

}

}

测试:

fa526eaabfe1c3e282a30d421e7ba6e1.png

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

测试:

ba429d79cef5d2d0c796b62dbcaeef1e.png

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再进行转发。

测试:

daeb35baa892ba1d0ce0111d5064ccde.png

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表示只截取几段路径。

ef6bfad9512a3ddc94f06caedd97e148.png

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")

publicObject query(String username) {

if ("dead".equals(username)) {

throw new RuntimeException("错误的用户名") ;

}

return"query "+ username ;

}

当请求参数username为dead时抛出异常。

测试:

成功:

89c68548bf6062e4a2dbb6eb893df1dd.png

失败:

39fec2639e518f6389da5072671d80e8.png

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。

【编辑推荐】

【责任编辑:姜华 TEL:(010)68476606】

点赞 0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值