Spring Cloud Gateway内置过滤器实战——RewritePath过滤器工厂

https://blog.youkuaiyun.com/chengqiuming/article/details/103328689

一 代码位置

https://github.com/cakin24/spring-cloud-code/tree/master/ch17-3/ch17-3-3-gateway

https://github.com/cakin24/spring-cloud-code/tree/master/ch17-3/ch17-3-service

二 关键代码


 
 
 
  1. package cn.springcloud.book.gateway;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.gateway.route.RouteLocator;
  5. import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
  6. import org.springframework.context
<think>好的,我现在需要详细思考用户关于Spring Cloud Gateway过滤器链的工作原理的问题。首先,用户已经提供了一些引用资料,我需要结合这些资料来构建一个结构清晰的回答。让我先理清这些引用中的关键点: 引用[3]提到,Spring Cloud Gateway过滤器分为“pre”和“post”两种类型,类似于Zuul。请求先经过pre过滤器,然后转发到业务服务,之后经过post过滤器处理响应,再返回客户端。同时,过滤器还分为针对单个路由的GatewayFilter和全局的GlobalFilter。 引用[4]指出,可以通过调试FilteringWebHandler类的handle方法来查看过滤器的执行顺序,即combined顺序。 引用[1]和[2]提供了官方文档和参考资料,说明过滤器的种类和基本概念。 接下来,我需要将这些信息整合成一个逻辑连贯的解释,说明过滤器链的工作机制。可能需要从处理流程、过滤器类型、执行顺序、自定义过滤器等方面展开。 首先,处理流程应该分为路由匹配、pre过滤器处理、代理请求、post过滤器处理。每个阶段需要详细说明。例如,当请求到达网关时,首先确定路由,然后执行所有pre过滤器,接着将请求转发到下游服务,收到响应后执行post过滤器,最后返回客户端。 然后,过滤器的分类需要明确:GlobalFilter和GatewayFilter的区别,以及它们的作用范围。同时,执行顺序方面,GlobalFilter可以通过@Order或实现Ordered接口来调整顺序,而GatewayFilter在配置中指定顺序。需要强调它们是如何组合成一条过滤器链的,比如在FilteringWebHandler中如何合并和排序。 可能还需要提到如何自定义过滤器,比如实现GlobalFilter接口,并调整顺序,以及如何通过调试查看执行顺序。这部分可以引用引用[4]的内容。 需要确保回答结构清晰,分点说明,同时引用正确的来源。例如,在解释执行顺序时,引用[4]提到调试FilteringWebHandler的handle方法,这可以具体指出如何验证执行顺序。 另外,用户可能对过滤器链中的异常处理感兴趣,比如在pre过滤器中发生异常是否会进入post过滤器?或者错误处理的机制是怎样的?不过根据提供的引用,可能没有直接的信息,但可以推测在转发请求之前出现异常,可能不会执行后续的过滤器和代理请求,而是直接返回错误响应。 最后,生成相关问题需要考虑用户可能进一步想了解的内容,比如执行顺序如何控制、如何自定义过滤器、GlobalFilter和GatewayFilter的区别、过滤器中的异常处理,以及如何调试过滤器链等。 需要确保回答中使用正确的中文术语,并且行内公式(如果有的话)使用$...$格式,但这个问题可能不涉及数学公式,所以可能不需要。不过,系统指令中提到所有行内数学表达式必须使用该格式,但在此问题中可能不适用,所以可以忽略。 总结回答的结构: 1. 处理流程分阶段描述 2. 过滤器类型及作用范围 3. 执行顺序的确定方式 4. 自定义过滤器的示例 5. 调试方法 6. 引用标识的正确放置 现在需要将这些点组织成一个自然流畅的回答,并确保引用标注正确。例如,在提到pre和post过滤器时引用[3],在讨论执行顺序时引用[4],在提到过滤器种类时引用[2]和[3]。</think>Spring Cloud Gateway 过滤器链的工作原理可以分为以下几个关键机制: --- ### 一、处理流程分阶段 1. **路由匹配阶段** 请求到达网关后,首先通过路由断言(Predicate)匹配到具体的路由规则,确定请求转发目标。 2. **Pre 过滤器阶段** 所有标记为 `pre` 的过滤器按顺序执行,例如:修改请求头、鉴权、限流等操作[^3]。 3. **代理请求阶段** 将处理后的请求转发到下游业务服务(如 user-service)。 4. **Post 过滤器阶段** 收到下游响应后,按逆序执行 `post` 过滤器,例如:修改响应头、日志记录、性能统计等。 --- ### 二、过滤器类型及作用范围 1. **GlobalFilter(全局过滤器)** - 作用于所有路由,无需配置路由规则。 - 例如:全局鉴权、跨域处理等。 - 通过实现 `GlobalFilter` 接口定义,并指定执行顺序[^3]。 2. **GatewayFilter(路由过滤器)** - 仅作用于特定路由,需在路由配置中显式声明。 - 例如:路径重写、请求头添加等。 - 通过配置文件或代码绑定到具体路由[^2]。 --- ### 三、执行顺序的确定 1. **GlobalFilter 顺序** - 通过 `@Order` 注解或实现 `Ordered` 接口指定优先级,数值越小优先级越高。 - 例如:认证过滤器(Order=-1)会在日志过滤器(Order=1)之前执行。 2. **GatewayFilter 顺序** - 在路由配置中通过 `order` 字段显式指定。 - 示例配置: ```yaml filters: - AddRequestHeader=X-Key, value1 - RewritePath=/api/(?<segment>.*), /$\{segment} ``` 3. **混合执行顺序** GlobalFilter 和 GatewayFilter 会被合并为一条过滤器链,统一按 `Order` 值排序。可通过调试 `FilteringWebHandler#handle` 方法查看合并后的顺序[^4]。 --- ### 四、自定义过滤器示例 ```java // 全局过滤器示例:实现鉴权逻辑 @Component @Order(-1) public class AuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (!exchange.getRequest().getHeaders().containsKey("Token")) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } } ``` --- ### 五、调试与验证 - **查看执行顺序**:在 `FilteringWebHandler#handle` 方法中设置断点,观察 `combined` 集合的顺序。 - **日志分析**:启用调试日志,观察过滤器执行前后的请求/响应变化。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_world!

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值