spring cloud gateway系列教程目录
- spring cloud gateway系列教程1—Route Predicate
- spring cloud gateway系列教程2——GatewayFilter_上篇
- spring cloud gateway系列教程2——GatewayFilter_下篇
- spring cloud gateway系列教程3—Global Filters
- spring cloud gateway系列教程4—其他配置
GatewayFilter Factories
Route filters可以通过一些方式修改HTTP请求的输入和输出,针对某些特殊的场景,Spring Cloud Gateway已经内置了很多不同功能的GatewayFilter Factories。
下面就来通过例子逐一讲解这些GatewayFilter Factories。
1. AddRequestHeader GatewayFilter Factory
AddRequestHeader GatewayFilter Factory通过配置name和value可以增加请求的header。
application.yml:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://www.google.com
filters:
- AddRequestHeader=X-Request-Foo, Bar
对匹配的请求,会额外添加X-Request-Foo:Bar
的header。
2. AddRequestParameter GatewayFilter Factory
AddRequestParameter GatewayFilter Factory通过配置name和value可以增加请求的参数。
application.yml:
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: http://www.google.com
filters:
- AddRequestParameter=foo, bar
对匹配的请求,会额外添加foo=bar
的请求参数。
3. AddResponseHeader GatewayFilter Factory
AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。
application.yml:
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://www.google.com
filters:
- AddResponseHeader=X-Response-Foo, Bar
对匹配的请求,响应返回时会额外添加X-Response-Foo:Bar
的header返回。
4. Hystrix GatewayFilter Factory
Hystrix是Netflix实现的断路器模式工具包,The Hystrix GatewayFilter就是将断路器使用在gateway的路由上,目的是保护你的服务避免级联故障,以及在下游失败时可以降级返回。
项目里面引入spring-cloud-starter-netflix-hystrix
依赖,并提供HystrixCommand
的名字,即可生效Hystrix GatewayFilter。
application.yml:
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: http://www.google.com
filters:
- Hystrix=myCommandName
那么剩下的过滤器,就会包装在名为myCommandName
的HystrixCommand中运行。
Hystrix过滤器也是通过配置可以参数fallbackUri
,来支持路由熔断后的降级处理,降级后,请求会跳过fallbackUri
配置的路径,目前只支持forward:
的URI协议。
application.yml:
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: lb://backing-service:8088
predicates:
- Path=/consumingserviceendpoint
filters:
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/incaseoffailureusethis
当Hystrix降级后就会将请求转发到/incaseoffailureusethis
。
整个流程其实是用fallbackUri
将请求跳转到gateway内部的controller或者handler,然而也可以通过以下的方式将请求转发到外部的服务:
application.yml:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
以上的例子,gateway降级后就会将请求转发到http://localhost:9994
。
Hystrix Gateway filter在转发降级请求时,会将造成降级的异常设置在ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR
属性中,在处理降级时也可以用到。
比如下一节讲到的FallbackHeaders GatewayFilter Factory,就会通过上面的方式拿到异常信息,设置到降级转发请求的header上,来告知降级下游异常信息。
通过下面配置可以设置Hystrix的全局超时信息:
application.yml:
hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000
5. FallbackHeaders GatewayFilter Factory
FallbackHeaders GatewayFilter Factory可以将Hystrix执行的异常信息添加到外部请求的fallbackUri
header上。
application.yml:
spring:
cloud:
gateway:
routes:
- id: ingredients
uri: lb://ingredients
predicates:
- Path=//ingredients/**
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: http://localhost:9994
predicates:
- Path=/fallback
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header
在这个例子中,当请求lb://ingredients
降级后,FallbackHeaders
filter会将HystrixCommand
的异常信息,通过Test-Header
带给http://localhost:9994
服务。
你也可以使用默认的header,也可以像上面一下配置修改header的名字:
-
executionExceptionTypeHeaderName
("Execution-Exception-Type"
) -
executionExceptionMessageHeaderName
("Execution-Exception-Message"
) -
rootCauseExceptionTypeHeaderName
("Root-Cause-Exception-Type"
) -
rootCauseExceptionMessageHeaderName
("Root-Cause-Exception-Message"
)
6. PrefixPath GatewayFilter Factory
The PrefixPath GatewayFilter Factor通过设置prefix
参数来路径前缀。
application.yml:
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: http://www.google.com
filters:
- PrefixPath=/mypath
如果一个请求是/hello
,通过上面路由,就会将请求修改为/mypath/hello
。
7. PreserveHostHeader GatewayFilter Factory
PreserveHostHeader GatewayFilter Factory会保留原始请求的host
头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。
application.yml:
spring:
cloud:
gateway:
routes:
- id: preserve_host_route
uri: http://www.google.com
filters:
- PreserveHostHeader
由于GatewayFilter Factory比较多,分开两篇来写,下一篇
如果想查看其他spring cloud gateway的案例和使用,可以点击查看