首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Feign的拦截器RequestInterceptor
SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求
yingzi_code
2020/03/18
31.9K3
SpringCloudGateway笔记(8)-权重
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.7K0
SpringCloudGateway笔记(4)-WebSession
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
7.3K0
SpringCloudGateway笔记(6)-请求体不全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.2K0
Ribbon拦截器ClientHttpRequestInterceptor-传递header
Ribbon拦截器ClientHttpRequestInterceptor-传递header
yingzi_code
2020/03/20
1.9K0
Ribbon拦截器ClientHttpRequestInterceptor-传递header
Spring-LogBack笔记(1) - 基础使用
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
yingzi_code
2020/03/18
4170
spring cloud gateway之filter篇
在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由处理之前,需要经过“pre”类型的过滤器处理,处理返回响应之后,可以由“post”类型的过滤器处理。
方志朋
2019/06/21
3K0
spring cloud gateway之filter篇
SpringCloudGateway笔记(1)-介绍与基础使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
4620
Spring Cloud Gateway-自定义GatewayFilter
GatewayFilter的作用域是指定的路由配置,路由配置选项里面需要通过filters指定想要使用的GatewayFilter列表。我们可以通过自定义GatewayFilter,做额外的扩展,实现一些内建GatewayFilter不存在的功能,并且应用到我们的路由配置中。
Throwable
2020/06/23
6.5K0
Spring Cloud Gateway-自定义GatewayFilter
Spring Cloud Gateway 之 Filter
网关经常需要对路由请求进行过滤,进行一些操作,如鉴权之后构造头部之类的,过滤的种类很多,如增加请求头、增加请求 参数 、增加响应头和断路器等等功能,这就用到了Spring Cloud Gateway 的 Filter。
程序员果果
2019/05/21
1.3K0
SpringCloud 2.x学习笔记:7、Spring Cloud Bus(Greenwich版本)
在pom.xml文件添加spring-cloud-starter-bus-amqp,完整的配置文件如下:
程裕强
2019/07/02
9180
SpringCloud 2.x学习笔记:7、Spring Cloud Bus(Greenwich版本)
SpringCloudGateway笔记(9)-限流
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.4K0
分布式系统「全链路日志追踪」实战之 RestTemplate & Feign
(图片来源于 Google Dapper 的一篇论文,这是链路追踪理论基础的鼻祖)这张图看上去感觉很高大上的样子 ,但精髓在于日志追踪架构设计思维。即设计思维很重要!设计思维很重要!设计思维很重要!设计思维很重要![重要的话说四遍 ] —— 思路和方案设计指导可落地的开发实现
IT技术小咖
2020/04/27
5.6K0
分布式系统「全链路日志追踪」实战之 RestTemplate & Feign
SpringCloudGateway笔记(3)-Predict与自定义Predict
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.6K0
Spring Cloud Zuul:API网关服务
API网关为微服务架构中的服务提供了统一的访问入口,客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面,所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。
macrozheng
2019/10/14
1.3K0
Spring Cloud Zuul:API网关服务
SpringCloudGateway笔记(7)-响应不全
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.6K0
SpringBoot中使用redis事务
首先从使用springboot+redis碰到的一个问题说起。在前几篇文章中介绍了用SpringBoot+redis构建了一个个人博客。在刚开始远行的时候发现发了几个请求操作了几次redis之后,后面的就被阻塞了,请求一直在等待返回,我们重现一下问题。
林老师带你学编程
2019/09/18
2.2K0
SpringCloudGateway笔记(10)-websocket
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
3.2K0
云原生之 Gateway 的 Filter 过滤器
通常情况下,出于安全方面的考虑,服务端提供的服务往往都会有一定的校验逻辑,例如用户登陆状态校验、签名校验等。 在微服务架构中,系统由多个微服务组成,所有这些服务都需要这些校验逻辑,此时我们就可以将这些校验逻辑写到 Spring Cloud Gateway 的 Filter 过滤器中。
一个风轻云淡
2022/11/15
9270
云原生之 Gateway 的 Filter 过滤器
Java学习笔记-微服务(6)-网关
Gateway 是在 Spring 生态系统之上构建的 API 服务网关,基于 Spring6、SpringBoot3、ProjectReactor 等技术,它旨在位微服务架构提供一种简单的有效的统一的 API 路由管理方式,并为他们提供跨领域的关注点,例如安全性、监控\度量和回复能力。
咸鱼程序员
2025/03/07
1990
Java学习笔记-微服务(6)-网关
相关推荐
Feign的拦截器RequestInterceptor
更多 >
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档