概述
断言是为了服务路由的匹配,过滤器则是在服务实例调用之前或之后对HTTP请求和响应的拦截,以便对请求和响应作出相应的修改。在SpringCloud学习笔记——旧服务网关Zuul中,提到过可以通过不同类型的过滤器实现身份验证、服务鉴权、参数校验、调用响应等功能。
过滤器生命周期
Gateway中只提供”PRE”和”POST”两种类型的过滤器。
PRE:服务调用请求被路由前执行该类型过滤器。主要用于实现参数校验、权限校验、流量监控、日志输出、协议转换等功能。
POST:服务调用请求被路由到具体的服务实例之后执行该过滤器。主要用于实现响应头的修改、收集统计信息和指标、将响应内容发送给客户端、输出日志、流量监控等功能。
过滤器类型
在Gateway中,过滤器分为局部过滤器和全局过滤器。全局过滤器对所有服务路由有效,需要实现GlobalFilter接口;局部过滤器只对部分路由有效,需要实现GatewayFilter接口。
局部过滤器
过滤器名 | 过滤器作用 |
AddRequestHeader | 用于在服务路由添加请求头信息 |
AddRequestParam | 用于在服务路由中添加请求参数信息 |
AddResponseHeader | 用于添加响应头信息 |
Hystrix | 用于将熔断器引入Gateway,避免服务雪崩现象发生 |
PrefixPath | 为服务调用实例路径添加前缀参数 |
PreserveHostHeader | 用于设置路由过滤器的请求属性,决定是否发送原始主机头 |
RequestRateLimiter | 用于对服务调用请求进行限流,限流算法为令牌桶 |
RedirectTo | 用于将服务调用请求重定向至指定URL |
RemoveRequestHeader | 删除某个指定的请求头信息 |
RemoveResponseHeader | 删除某个指定的响应头信息 |
RewritePath | 使用正则表达式重写请求路径 |
RewriteResponseHeader | 重写某个指定的响应头信息 |
SaveSession | 转发服务调用请求前,强制执行保存session操作 |
SecureHeader | 用于为响应信息添加安全头 |
SetPath | 用于修改原始请求路径 |
SetResponseHeader | 用于修改指定原始响应头信息 |
SetStatus | 用于修改原始响应的状态码 |
StripPrefix | 用于截断原始请求路径 |
Retry | 针对不同的响应进行重试操作 |
AddRequestHeader
用于为服务调用请求添加请求头参数信息。
配置类方式创建
@Configurationpublic class CustomAddRequestHeaderFilter{
@Bean public RouteLocator customAddHeaderRouteLocator(RouteLocatorBuilder builder){
/** *id: gateway路由标识 *path:服务请求路径 * filters:添加请求头信息过滤器 * uri:服务实例调用地址 * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加请求头参数信息并将服务调用请求路由至服务实例 */ return builder.routes().route("userAddHeaderFilter", r->r.path("/user/**") .filters(f->f.addRequestHeader("userId","1")) .uri("localhost://8100/user")).build(); }}
配置文件方式创建
spring: cloud: gateway: routes: - id:user-addHeaderFilter-route uri:localhost://8100/user predicates: - Path=/user/** filters: - AddRequestFilter=id,1
AddRequestParam
用于在服务路由中添加请求参数。
配置类方式创建
@Configurationpublic class CustomAddRequestParamFilter {
@Bean public RouteLocator customAddRequestParamRouteLocator(RouteLocatorBuilder builder){
/** * id:gateway路由标识 * path:服务请求路径 * filters:添加请求参数信息过滤器 * uri:服务实例调用地址 * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加请求头参数信息并将服务调用请求路由至服务实例 */ return builder.routes().route("userAddRequestParam",r->r.path("/user/**") .filters(f->f.addRequestParameter("userId","1")).uri("localhost://8100/user")).build(); }}
配置文件方式创建
spring: cloud: gateway: routes: - id:user-addHeaderFilter-route uri:localhost://8100/user predicates: - Path=/user/** filters: - AddRequestParam=userId,1
AddResponseHeader
用于添加响应头信息。
配置类方式创建
@Configurationpublic class CustomAddResponseHeaderFilter {
@Bean public RouteLocator customAddResponseHeaderRouteLocator(RouteLocatorBuilder builder){
/** * id:gateway路由标识 * path:服务请求路径 * filters:添加响应头参数信息过滤器 * uri:服务实例调用地址 * 本例中的路由规则,当服务请求路径为/user/**时为服务调用请求添加响应头参数信息并将服务调用请求路由至服务实例 */ return builder.routes().route("userAddResponseHeader", r->r.path("/user/**").filters( f->f.addResponseHeader("token","123456789")).uri("localhost://8100/user")).build(); }}
配置文件方式创建
spring: cloud: gateway: routes: - id:user-addResponseHeader-route uri:localhost://8100/user predicates: - Path=/user/** filters: - AddResponseHeader=token,123456789
Hystrix
提供熔断器功能,当服务请求调用出现失败或异常情况的时候,可以执行熔断操作。当熔断发生后,可以通过服务降级功能提高用户体验,往往还需要进行服务跳转返回服务调用失败信息。
控制器
@RestController@RequestMapping("/gateway")public class GatewayFallbackController {
@GetMapping("/getFallback") public ResultMessage getFallback() {
return new ResultMessage(false,"服务调用路由失败,请检查服务实例状态"); }}
配置类方式创建
@Configurationpublic class CustomHystrixFilter {
@Bean public RouteLocator customHystrixRotueLocator(RouteLocatorBuilder builder){
return builder.routes().route("userHystrix",r->r.path("/hystrix/**").filters( f->f.hystrix(config->{