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

本文介绍了SpringCloudGateway的过滤器功能,包括在请求路由前后的处理,如鉴权、日志、限流和权重路由。通过示例演示了如何创建Gateway Filter和Global Filter,并强调了Global Filter的全局应用特性。还提到了order属性对过滤器执行顺序的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 Filterwebsocket路由
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<Void> 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<Void> 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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值