网关 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

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


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

查看所有标签

猜你喜欢:

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

The Dream Machine

The Dream Machine

M. Mitchell Waldrop / Penguin Books / 2002-8 / USD 16.00

While most people may not be familiar with the name J. C. R. Licklider, he was the guiding spirit behind the greatest revolution of the modern era. At a time when most computers were big, ponderous ma......一起来看看 《The Dream Machine》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具