SpringCloudGateway笔记(2)-filter与自定义filter

filter与自定义filter

过滤器可以在路由请求之前对请求进行处理,也可以在请求响应之后对响应进行处理

在请求路由之前可以做比如参数校验,鉴权,日志记录,协议转换,请求参数修改,路径修改等

在请求响应之后可以做比如记录响应消息,修改响应,修改响应头等

最常见的功能就是鉴权,日志记录,限流和权重路由

Filter分为Gateway Filter和Global Filter

Gateway Filter 是可以指定对某个路由进行过滤操作,自带的Gateway Filter如下

AddRequestHeader 作用
AddRequestHeader 添加请求header
AddRequestParameter 添加请求参数
AddResponseHeader 添加响应header
DedupeResponseHeader 响应头去重
Hystrix GatewayFilters 断路器的网关
PrefixPath 路径匹配
PreserveHostHeader 发送原始host
RequestRateLimiter 限流
RedirectTo 重定向
RemoveHopByHopHeadersFilter 移除响应header,默认有Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,TE,Trailer,Transfer-Encoding,Upgrade
RemoveRequestHeader 移除请求header
RemoveResponseHeader 移除响应header
RewritePath 路径重写
RewriteResponseHeader 重写响应header
SaveSession 保存session
SetPath 模板匹配路径修改
SetResponseHeader 设置响应header,会覆盖所有原有的header
SetStatus 设置httpStatus响应码
StripPrefix 去掉前缀
Retry 重试次数
RequestSize 请求大小限制
ModifyRequestBody 修改请求体
ModifyResponseBody 修改响应体

写个demo测试一下

      routes:
        - id: spring-cloud-client-demo
          url: lb://spring-cloud-client-demo
          predicates:
            - Path=/client/**
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - StripPrefix=1

使用Postman发送请求

GET http://localhost:10001/client/demo/get?param=aaa

可以看到请求被转发到spring-cloud-client-demo的/demo/get?param=aaa

同时查看请求头打印,可以看到添加的请求头

2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: accept, */*
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: postman-token, d90bc432-9861-4170-8c21-a66be561446f
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: accept-encoding, gzip, deflate
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: cache-control, no-cache
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-request-foo, Bar
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: user-agent, PostmanRuntime/7.4.0
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: forwarded, proto=http;host="localhost:10001";for="0:0:0:0:0:0:0:1:62526"
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-forwarded-for, 0:0:0:0:0:0:0:1
2019-05-18 11:03:17.501  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-forwarded-proto, http
2019-05-18 11:03:17.502  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-forwarded-prefix, /client
2019-05-18 11:03:17.502  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-forwarded-port, 10001
2019-05-18 11:03:17.502  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: x-forwarded-host, localhost:10001
2019-05-18 11:03:17.502  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: host, 192.168.56.1:8801
2019-05-18 11:03:17.502  INFO 13612 --- [nio-8801-exec-1] c.m.d.client.controller.DemoController   : header: content-length, 0

Global Filter是全局的过滤器,配置之后对所有路由都有效

过滤器 说明
LoadBalancerClientFilter 负载均衡过滤器
Netty Routing Filter 默认使用netty的底层
RouteToRequestUrlFilter 新的请求路由
Websocket Routing Filter websocket路由
Gateway Metrics Filter 路由监控,配合spring-boot-starter-actuator

微服务使用·负载均衡用

uri: lb://spring-cloud-client-demo

websocket

uri: lb:ws://spring-cloud-client-demo

直接路由

uri:http:/xxxx.com

自定义全局过滤器

@Slf4j
@Component
public class MyFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("this is a pre filter");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("this is a post filter");
        }));
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

注:

  1. 这里的order不能使用@order 的注解
  2. 在fitler里面的是pre类型,会在路由前执行,在then里面的是post类型会在路由后执行
  3. order 的数值越小pre越先执行,post越后执行

再写一个filter测试一下

@Slf4j
@Component
public class MyFilter2 implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("this is a pre filter2");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("this is a post filter2");
        }));
    }

    @Override
    public int getOrder() {
        return -2;
    }
}

执行一个请求查看日志信息

2019-05-18 12:17:22.874  INFO 12996 --- [ctor-http-nio-3] com.mt.demo.gateway.filter.MyFilter2     : this is a pre filter2
2019-05-18 12:17:22.874  INFO 12996 --- [ctor-http-nio-3] com.mt.demo.gateway.filter.MyFilter      : this is a pre filter
2019-05-18 12:17:23.191  INFO 12996 --- [ctor-http-nio-3] com.mt.demo.gateway.filter.MyFilter      : this is a post filter
2019-05-18 12:17:23.191  INFO 12996 --- [ctor-http-nio-3] com.mt.demo.gateway.filter.MyFilter2     : this is a post filter2

欢迎关注微信交流
在这里插入图片描述

你可能感兴趣的:(Gateway,springcloud)