Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCloudGateway笔记(2)-filter与自定义filter

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

作者头像
yingzi_code
发布于 2019-08-30 14:12:59
发布于 2019-08-30 14:12:59
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/yingziisme/article/details/90357292

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测试一下
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

微服务使用·负载均衡

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uri: lb://spring-cloud-client-demo

websocket

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uri: lb:ws://spring-cloud-client-demo

直接路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uri:http:/xxxx.com
自定义全局过滤器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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测试一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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;
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年05月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
牛客 牛牛选物(01背包)
链接:https://ac.nowcoder.com/acm/contest/9887/A 来源:牛客网
Michael阿明
2021/02/19
4300
牛客 牛牛选物(01背包)
天池 在线编程 最小的行程(动态规划)
https://tianchi.aliyun.com/oj/338592228998370026/357527484118536805
Michael阿明
2021/09/06
2950
天池 在线编程 高效作业处理服务(01背包DP)
https://tianchi.aliyun.com/oj/231188302809557697/235445278655844967
Michael阿明
2021/02/19
3380
天池 在线编程 高效作业处理服务(01背包DP)
天池 在线编程 回合制游戏(前缀和)
QW 在一场战斗中会碰到 n 个怪物,每个怪物有攻击力 atk[i],每回合结束时如果第 i 个怪物还活着,就会对 QW 造成 atk[i] 的伤害。 QW 只能在每回合开始时击杀一个怪物,请帮 QW 出他打完所有怪物最少需要损失多少生命值。
Michael阿明
2021/02/19
3290
天池 在线编程 旅行计划(暴力回溯)
描述 有n个城市,给出邻接矩阵arr代表任意两个城市的距离。 arr[i][j]代表从城市i到城市j的距离。Alice在周末制定了一个游玩计划,她从所在的0号城市开始,游玩其他的1 ~ n-1个城市,最后回到0号。 Alice想知道她能完成游玩计划需要行走的最小距离。返回这个最小距离。除了城市0之外每个城市只能经过一次。
Michael阿明
2021/02/19
2880
天池 在线编程 部门统计(哈希)
描述 公司给你提供了所有员工的信息,包括其ID,姓名和所属部门。 以及他们之间的朋友关系,每个关系中由2个ID组成,如 “1, 2” 代表1号员工和2号员工是朋友。 朋友关系不具有传递性,即B、C都是A的朋友,但B和C不一定是朋友。 请计算每个部门中与其它部门的员工有朋友关系的员工个数。
Michael阿明
2021/09/06
4120
天池 在线编程 回文子串(区间动态规划)
回文串是从左往右和从右往左读相同的字符串,例如121和tacocat。子串是一个字符串中任意几个连续的字符构成的字符串。
Michael阿明
2021/09/06
2660
天池 在线编程 聪明的销售(计数+贪心)
现在她知道她最多能删除多少物品,她想知道最终袋子里最少可以包含多少种不同编号的物品。
Michael阿明
2021/02/19
2590
天池 在线编程 放小球(动态规划)
n 个桶中小球的个数已知, 可以操作 k 次(每次从桶中取出一个球,或者添加一个球), 每个桶有规定的最大容量 W[i]。 求操作后两相邻桶之间的最大差值的平方的最小值。
Michael阿明
2021/02/19
3600
天池 在线编程 安排面试城市(贪心)
来源:https://tianchi.aliyun.com/oj/210874425247820050/215397455965131520
Michael阿明
2021/02/19
3500
【LeetCode 周赛】一道 01 背包变型题
由于题目要求相邻元素之间至少存在单向整除关系,容易想到我们需要预处理数据,记录每个元素在作为 (x, y) 相邻对中的 x 时,下一个数 y 可以选择什么数,即从 x 到 y 存在单向边。
用户9995743
2023/09/09
2660
【LeetCode 周赛】一道 01 背包变型题
LeetCode 第 207 场周赛(245/4115,前5.95%)
全国排名: 245 / 4115,5.95%;全球排名: 774 / 12923,5.99%
Michael阿明
2021/02/19
4230
天池 在线编程 课程表(拓扑排序 + 回溯)
总共有n个课程,从0到n-1。 有些课程可能有先决条件,例如,你想修课程0,你必须先修一门课程1,这两门课之间的关系表示为:[0,1]
Michael阿明
2021/09/07
5120
LeetCode 周赛题解 211
遍历字符串,记录每个字符第一次出现的位置。当某个字符再次出现时,说明找到了相同的两个字符,那就更新一下最大长度。
ACM算法日常
2020/10/30
4920
LeetCode 周赛题解 211
使用c++SFML制作月圆之夜总集篇[通俗易懂]
重新以时间线的形式整理一下去年使用c++的SFML库制作月圆之夜(游戏程序设计大作业)的开发过程,括号里面是新的补充以及对一年前自己的吐槽
全栈程序员站长
2022/11/17
3.7K0
使用c++SFML制作月圆之夜总集篇[通俗易懂]
天池 在线编程 数组游戏
样例 1 输入: [3, 4, 6, 6, 3] 输出: 7 说明: [3, 4, 6, 6, 3] -> [4, 5, 7, 6, 4] -> [5, 6, 7, 7, 5] -> [6, 7, 8, 7, 6] -> [7, 8, 8, 8, 7] -> [8, 9, 9, 8, 8] -> [9, 9, 10, 9, 9] -> [10, 10, 10, 10, 10]
Michael阿明
2021/02/19
6670
天池 在线编程 数组游戏
程序员进阶之算法练习(四十六)
正文 题目1. Ichihime and Triangle 题目链接 题目大意: 输入4个整数? , ?, ?, ?, 并且 ?≤?≤?≤?; 现在需要找三个整数?, ?, ?,满足: ?≤?
落影
2020/07/30
6610
程序员进阶之算法练习(四十六)
2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 哗啦啦村袭击了喵哈哈村! 度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。 但是度度熊发现,这是一场旷日持久的战斗,所以度度熊决定要
Angel_Kitty
2018/04/09
1.2K0
2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
【代码随想录】二刷-贪心算法
贪心算法 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。 贪心算法一般分为如下四步: 将问题分为若干子问题 找出合适的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 ---- 455. 分发饼干 方法1: 充分利用每个饼干的大小,用大块的饼干优先喂饱大胃口的孩子 class Solution { public:
半生瓜的blog
2023/05/13
4640
【代码随想录】二刷-贪心算法
天池 在线编程 最频繁出现的子串(字符串哈希)
子串的长度在之间 [minLength, maxLength] 子串的字符种类不超过 maxUnique 写一个函数 getMaxOccurrences ,其返回满足条件的子串最多出现次数。
Michael阿明
2021/02/19
6260
天池 在线编程 最频繁出现的子串(字符串哈希)
推荐阅读
相关推荐
牛客 牛牛选物(01背包)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验