网关 Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.5) 之 ForwardRoutingFilter

栏目: Java · 发布时间: 8年前

内容简介:网关 Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.5) 之 ForwardRoutingFilter

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/filter-forward-routing/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Spring-Cloud-Gateway 2.0.X M4

网关 Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.5) 之 ForwardRoutingFilter

关注 微信公众号:【芋道源码】 有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有 源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言 将得到 认真 回复。 甚至不知道如何读源码也可以请教噢
  4. 新的 源码解析文章 实时 收到通知。 每周更新一篇左右
  5. 认真的 源码交流微信群。

1. 概述

本文主要分享 ForwardRoutingFilter 的代码实现

RouteToRequestUrlFilter ,转发 路由 网关过滤器。其根据 forward:// 前缀( Scheme )过滤处理, 将请求转发到当前网关实例本地接口

举个例子,配置 RouteDefinition 路由定义如下 :

spring:
application:
name: juejin-gateway
cloud:
gateway:
routes:
 # =====================================
- id: forward_sample
uri: forward:///globalfilters
order: 10000
predicates:
- Path=/globalfilters
filters:
- PrefixPath=/application/gateway
  • 我们假定网关端口为 8080
  • 当请求 http://127.0.0.1:8080/globalfilters 接口,Spring Cloud Gateway 处理过程如下 :
    • 匹配到路由 Route ( id = forward_sample ) 。
    • 配置 的 PrefixPathGatewayFilterFactory 将请求 改写http://127.0.0.1:8080/application/gateway/globalfilters
    • ForwardRoutingFilter 判断有 forward:// 前缀( Scheme ),过滤处理,将请求 转发 给 DispatcherHandler 。
    • DispatcherHandler 匹配并转发到 当前网关实例本地接口 application/gateway/globalfilters
  • 为什么需要配置 PrefixPathGatewayFilterFactory ?需要通过 PrefixPathGatewayFilterFactory 将请求重写路径,以匹配本地 API ,否则 DispatcherHandler 转发会失败。

另外,RouteToRequestUrlFilter 是 Spring Cloud Gateway 实现的一种 路由 网关过滤器,目前还提供 WebsocketRoutingFilter / NettyRoutingFilter / WebClientHttpRoutingFilter 。

推荐 Spring Cloud 书籍:

2. RouteToRequestUrlFilter

org.springframework.cloud.gateway.filter.ForwardRoutingFilter ,代码如下 :

 1: public class ForwardRoutingFilter implements GlobalFilter, Ordered{
 2: 
 3: private static final Log log = LogFactory.getLog(ForwardRoutingFilter.class);
 4: 
 5: private final DispatcherHandler dispatcherHandler;
 6: 
 7: public ForwardRoutingFilter(DispatcherHandler dispatcherHandler){
 8: this.dispatcherHandler = dispatcherHandler;
 9: }
10: 
11: @Override
12: public int getOrder(){
13: return Ordered.LOWEST_PRECEDENCE;
14: }
15: 
16: @Override
17: public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){
18: // 获得 requestUrl
19: URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
20: 
21: // 判断是否能够处理
22: String scheme = requestUrl.getScheme();
23: if (isAlreadyRouted(exchange) || !scheme.equals("forward")) {
24: return chain.filter(exchange);
25: }
26: 
27: // 设置已经路由
28: setAlreadyRouted(exchange);
29: 
30: //TODO: translate url?
31: 
32: if (log.isTraceEnabled()) {
33: log.trace("Forwarding to URI: "+requestUrl);
34: }
35: 
36: // DispatcherHandler 匹配并转发到当前网关实例本地接口
37: return this.dispatcherHandler.handle(exchange);
38: }
39: }
  • 实现 GlobalFilter 接口。
  • #getOrder() 方法,返回顺序为 Integer.MAX_VALUE 。在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.1) 之 GatewayFilter 一览》「3. GlobalFilter」 ,我们列举了所有 GlobalFilter 的顺序。
  • 第 19 行 :获得 requestUrl
  • 第 22 至 25 行 :判断 ForwardRoutingFilter 是否能够处理该请求,需要满足两个条件 :

    • forward:// 前缀( Scheme ) 。
    • 调用 ServerWebExchangeUtils#isAlreadyRouted(ServerWebExchange) 方法,判断该请求暂未被其他 Routing 网关处理。代码如下 :

      public static boolean isAlreadyRouted(ServerWebExchange exchange){
       return exchange.getAttributeOrDefault(GATEWAY_ALREADY_ROUTED_ATTR, false);
      }
      
  • 第 28 行 :设置该请求已经被处理。代码如下 :

    public static void setAlreadyRouted(ServerWebExchange exchange){
     exchange.getAttributes().put(GATEWAY_ALREADY_ROUTED_ATTR, true);
    }
    
  • 第 37 行 :将请求 转发 给 DispatcherHandler 。DispatcherHandler 匹配并转发到 当前网关实例本地接口

666. 彩蛋

一开始想错了 ForwardRoutingFilter 了的用途,调试许久,后面看了官方提供的示例 org.springframework.cloud.gateway.test.ForwardTests ,豁然开朗。

网关 Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.5) 之 ForwardRoutingFilter

胖友,分享一波朋友圈可好!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式之禅(第2版)

设计模式之禅(第2版)

秦小波 / 机械工业出版社 / 2014-2-25 / 89.00元

本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领域的里程碑著作。深刻解读6大设计原则和28种设计模式的准确定义、应用方法和最佳实践,全方位比较各种同类模式之间的异同,详细讲解将不同的模式组合使用的方法。第2版在第1版的基础上有两方面的改进,一方面结合读者的意见和建议对原有内容中......一起来看看 《设计模式之禅(第2版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器