Gateway中内置了很多的GatewayFilter,详情可以参考官方文档,见下表:
过滤器工厂 |
作用 |
参数 |
AddRequestHeader |
为原始请求添加Header |
Header的名称及值 |
AddRequestParameter |
为原始请求添加请求参数 |
参数名称及值 |
AddResponseHeader |
为原始响应添加Header |
Header的名称及值 |
DedupeResponseHeader |
剔除响应头中重复的值 |
需要去重的Header名称及去重策略 |
Hystrix |
为路由引入Hystrix的断路器保护 |
HystrixCommand的名称 |
FallbackHeaders |
为fallbackUri的请求头中添加具体的异常信息 |
Header的名称 |
PrefixPath |
为请求添加一个 preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host |
无 |
RequestRateLimiter |
用于对请求限流,限流算法为令牌桶 |
keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus |
RedirectTo |
将原始请求重定向到指定的URL |
http状态码及重定向的url |
RemoveHopByHopHeadersFilter |
为原始请求删除IETF组织规定的一系列Header |
默认就会启用,可以通过配置指定仅删除哪些Header |
RemoveResponseHeader |
为原始请求删除某个Header |
Header名称 |
RemoveRequestHeader |
为原始请求删除某个Header |
Header名称 |
RewritePath |
重写原始的请求路径 |
原始路径正则表达式以及重写后路径的正则表达式 |
RewriteResponseHeader |
重写原始响应中的某个Header |
Header名称,值的正则表达式,重写后的值 |
SaveSession |
在转发请求之前,强制执行websession::save操作 |
无 |
secureHeaders |
为原始响应添加一系列起安全作用的响应头 |
无,支持修改这些安全响应头的值 |
SetPath |
修改原始的请求路径 |
修改后的路径 |
SetResponseHeader |
修改原始响应中某个Header的值 |
Header名称,修改后的值 |
SetStatus |
修改原始响应的状态码 |
HTTP状态码,可以是数字,也可以是字符串 |
StripPrefix |
用于截断原始请求的路径 |
使用数字表示要截断的路径的数量 |
Retry |
针对不同的响应进行重试 |
retries、statuses、methods、series |
RequestSize |
设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返回413 Payload Too Large |
请求包大小,单位为字节,默认值为5M |
ModifyRequestBody |
在转发请求之前修改原始请求体内容 |
修改后的请求体内容 |
ModifyResponseBody |
修改原始响应体的内容 |
修改后的响应体内容 |
内置过滤器有很多,具体在工作中根据需求去使用即可。
下边演示一个非常有用的过滤器 StripPrefix,它的作用:移除路径前缀。
比如:为了路径的统一,我们规定所有请求以/product/开头的全部路由到商品服务,
网关的路由配置如下
- id: product uri: lb://item-service predicates: - Path=/product/**
比如访问商品分页查询接口,访问网关的路径为:/product/items/page, 实际的下游服务器地址是 /items/page,如果使用上边的路由配置是无法实现的。
原因是:
请求:http://localhost:8080/product/items/page?pageNo=1&pageSize=1
路由到:http://localhost:8081/product/items/page?pageNo=1&pageSize=1
正确的应该路由到:http://localhost:8081/items/page?pageNo=1&pageSize=1
可以使用StripPrefix过滤器实现
下边配置一个新的路由:
- id: product uri: lb://item-service predicates: - Path=/product/** filters: - StripPrefix=1
StripPrefix=1表示去除一级路径前缀
使用StripPrefix=1后
请求:http://localhost:8080/product/items/page?pageNo=1&pageSize=1
路径到:http://localhost:8081/items/page?pageNo=1&pageSize=1(正确)
如果配置StripPrefix=2,最终转发到商品服务的路径为/page?pageNo=1&pageSize=1(此路径在商品服务不存在)