【网关SCG】15 Spring Cloud Gateway请求匹配到多个路由如何选择?多个Predicate如何处理?

news2024/12/25 9:24:13

文章目录

  • 一、前言
  • 二、RoutePredicateHandlerMapping匹配路由
    • 1、Gateway处理请求的流程
    • 2、RoutePredicateHandlerMapping匹配路由
      • 1)获取所有路由
      • 2)多个Predicate谓词匹配
      • 3)Flux.next()
      • 4)校验路由
      • 5)返回结果
  • 三、总结

一、前言

至此微服务网关系列文章已出:

  1. 【云原生&微服务>SCG网关篇一】为什么要有网关、生产环境如何选择网关
  2. 云原生&微服务>SCG网关篇二】生产上那些灰度发布方式
  3. 【云原生&微服务>SCG网关篇三】Spring Cloud Gateway是什么、详细使用案例
  4. 云原生&微服务>SCG网关篇四】Spring Cloud Gateway内置的11种PredicateFactory如何使用
  5. 【云原生&微服务>SCG网关篇五】Spring Cloud Gateway自定义PredicateFactory
  6. 【云原生&微服务>SCG网关篇六】Spring Cloud Gateway内置的18种Filter使用姿势
  7. 【云原生&微服务>SCG网关篇七】Spring Cloud Gateway基于内置Filter实现限流、熔断、重试
  8. 【云原生&微服务>SCG网关篇八】Spring Cloud Gateway三种自定义Filter、GlobalFilter的方式
  9. 【云原生&微服务>SCG网关篇九】Spring Cloud Gateway集成Nacos详细案例
  10. 【云原生&微服务>SCG网关篇十】Spring Cloud Gateway集成Actuator、Zipkin详细案例
  11. 【云原生&微服务>SCG网关篇十一】Spring Cloud Gateway解决跨域问题
  12. 【云原生&微服务>SCG网关篇十二】Spring Cloud Gateway集成Sentinel API实现多种限流方式
  13. 源码深度剖析Spring Cloud Gateway如何处理一个请求
  14. Spring Cloud Gateway如何实现负载均衡?

聊了以下问题:

  1. 为什么要有网关?网关的作用是什么?
  2. 网关的分类?
  3. 网关的技术选型?
  4. 使用网关时常用的灰度发布方式有哪些?
  5. Spring Cloud Gateway是什么?详细使用案例?
  6. Spring Cloud Gateway内置的11种PredicateFactory
  7. 如何自定义PredicateFactory?
  8. Spring Cloud Gateway内置的18种常用的Filter
  9. Spring Cloud Gateway基于内置Filter实现限流、熔断、重试
  10. Spring Cloud Gateway三种自定义Filter、GlobalFilter的方式
  11. Spring Cloud Gateway集成Nacos案例
  12. Spring Cloud Gateway集成Actuator、Zipkin案例
  13. Spring Cloud Gareway如何解决CORS跨域问题
  14. Spring Cloud Gateway集成Sentinel API实现限流
  15. 从源码来看Spring Cloud Gateway如何处理一个请求?
  16. 从源码来看Spring Cloud Gateway如何实现负载均衡?

本文就基于源码深度剖析Spring Cloud Gateway如何处理一个请求的请求执行流程,继续来看如果请求匹配到多个路由怎么处理?

二、RoutePredicateHandlerMapping匹配路由

1、Gateway处理请求的流程

Spring Cloud Gateway对请求的处理流程见博文:源码深度剖析Spring Cloud Gateway如何处理一个请求;

在这里插入图片描述

RoutePredicateHandlerMapping这个HandlerMapping会负责对请求进行路由匹配。

2、RoutePredicateHandlerMapping匹配路由

RoutePredicateHandlerMapping#lookupRoute(ServerWebExchange)方法会从我们application.yml文件中配置的所有路由中根据Predicate做路由匹配,找到当前请求对应的路由。

以如下application.yml配置文件中配置的路由信息为例:

spring:
  cloud:
    gateway:
      routes:
        - id: gateway-nacos-service-route-fail
          uri: lb://gateway-nacos-provider
          predicates:
            - Path=/nacos/**
            - Before=2024-01-01T00:00:00.000+08:00[Asia/Shanghai]
            - After=2023-01-01T00:00:00.000+08:00[Asia/Shanghai]
          filters:
            - PrefixPath=/saint
        - id: gateway-nacos-service-route
          uri: lb://gateway-nacos-provider
          predicates:
            - Path=/nacos/**
          filters:
            - StripPrefix=1

针对http://localhost:9999/nacos/路径过来的请求都会匹配到两个路由:gateway-nacos-service-route-fail、gateway-nacos-service-route。

1)获取所有路由

实例application.yml文件中一共给出了两个路由,所以lookupRoute()方法中也一共找到两个自定的路由。
在这里插入图片描述

获取到所有的路由之后,会对路由进行Predicate谓词匹配。即:进入到Route.getPredicate().apply方法。

2)多个Predicate谓词匹配

在源码中判断Route是否有效时,仅仅是通过route.getPredicate()方法获取到一个Predicate;

public AsyncPredicate<ServerWebExchange> getPredicate() {
    return this.predicate;
}

但是一个Route中可能包含多个Predicate;

Gateway使用AsyncPredicate接口的实现类AndAsyncPredicate来包装所有的Predicate;AndAsyncPredicate将所有的Predicate分为两部分:left 和 right,而每一部分的Predicate又都被AsyncPredicate包装;

在这里插入图片描述

就路由gateway-nacos-service-route-fail而言:

  • 其中有三个Predicate,分别为:Path、Before、After;
  • 最上层的AndAsyncPredicate中的left 为Path 和 Before 组合在一起的 AndAsyncPredicate(其中left为Path,right为Before)、right为After。

调用Predicate.apply()方法做谓词匹配时,会分别调用left 和 right 的apply()方法;
在这里插入图片描述

示例中的Route中有三个Predicate:

  • 第一次调用predicate.apply()方法时,left AsyncPredicate中有2个Predicate,用&&相连;right AsyncPredicate中有1个Predicate。
  • 在进入到left.apply()方法时,left AsyncPredicate中 1个Predicate、right AsyncPredicate中 1个Predicate;
  • 这里可以看做是针对left#apply()方法的一个递归操作,直到left中仅包含一个Predicate时,再往上返回。

也就是说,无论Route中包含多少个Predicate,包装后的 AsyncPredicate中 right Predicate中仅包含一个Predicate,其余的都是在left Predicate中(并且left的Predicate使用AndAsyncPredicate)。

3)Flux.next()

Flux.next()表示将 通量发出的第一项发射到新的单声道(Mono)中,即:仅会取第一个匹配的Route,第二个匹配的路由甚至都不会做Predicate谓词匹配。

在这里插入图片描述

大家可以按我的断点自己去调试一下看看效果。

4)校验路由

RoutePredicateHandlerMapping#validateRoute()方法负责校验谓词匹配到的路由,但是默认validateRoute()方法并没有实现;

在这里插入图片描述

开发人员可以在子类中重写它,比如:强制执行URL映射中表示的特定前提条件

5)返回结果

因为网关后面的微服务中没有/saint/nacos/路径的HTTP接口,所以网关层面选中gateway-nacos-service-route-fail之后,即使Filter执行链出错了,也不会继续返回重新找下一个Predicate谓词匹配的Route。
在这里插入图片描述

三、总结

按照application.yml文件中的定义route的顺序从上到下依次匹配(无论匹配到的Route的Filter是否可以通过、访问的地址是否有效,都不会继续往下匹配)

无论Route中包含多少个Predicate,包装后的 AsyncPredicate中 right Predicate中仅包含一个Predicate,其余的都是在left Predicate中;

  • left的Predicate使用AndAsyncPredicate,再对其中的Predicate用left、right递归拆分,直到left中仅有一个Predicate。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python机器学习》安装anaconda + numpy使用示例

&#x1f442; 小宇&#xff08;治愈版&#xff09; - 刘大拿 - 单曲 - 网易云音乐 目录 一&#xff0c;安装 二&#xff0c;Numpy使用示例 &#xff08;一&#xff09;Numpy数组的创建和访问 1&#xff0c;创建和访问Numpy的一维数组和二维数组 2&#xff0c;Numpy数组…

5.1 线程

文章目录1.概述2.多线程的特性2.1 随机性2.2 CPU分时调度2.3 线程的状态2.4 线程状态与代码对照3.多线程代码实现方式1:继承Thread3.1 概述3.2 常用方法3.3 测试多线程的创建方式14.多线程代码实现方式2:实现Runnable接口4.1 概述4.2 常用方法4.3 练习2&#xff1a;测试多线程的…

基于RK3399+5G的医用视频终端设计

当前在各种先进的信息通信技术的驱动下&#xff0c;医疗行业已呈现出信息化、移动化、智能化的发展趋势。特别是 5G 通信技术的落地应用推动了智慧医疗行业的 蓬勃发展&#xff0c;涌现出大量基于 5G 技术的医疗健康应用与服务&#xff0c;进一步融合了 5G、 物联网与大数据等先…

【机器学习】XGBoost

1.什么是XGBoost XGBoost(eXtreme Gradient Boosting)极度梯度提升树&#xff0c;属于集成学习中的boosting框架算法。对于提升树&#xff0c;简单说就是一个模型表现不好&#xff0c;继续按照原来模型表现不好的那部分训练第二个模型&#xff0c;依次类推。本质思想与GBDT一致…

Docker----------day3(tomcat、mysql8、redis6.2.6常用软件安装)

常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…

【STM32笔记】__WFI();进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

【STM32笔记】__WFI()&#xff1b;进入不了休眠的可能原因&#xff08;系统定时器SysTick一直产生中断&#xff09; 【STM32笔记】低功耗模式配置及避坑汇总 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&am…

UVa 690 Pipeline Scheduling 流水线调度 二进制表示状态 DFS 剪枝

题目链接&#xff1a;Pipeline Scheduling 题目描述&#xff1a; 给定一张5n(1≤n≤20)5\times n(1\le n\le20)5n(1≤n≤20)的资源需求表&#xff0c;第iii行第jjj列的值为’X’表示进程在jjj时刻需要使用使用资源iii&#xff0c;如果为’.则表示不需要使用。你的任务是安排十个…

多元化增长引擎业务占比超四成,联想开启混动模式?

一句话概括联想集团的业绩&#xff1a;预料之内的整体下滑&#xff0c;超出预期的第二曲线。 上周五&#xff08;2月17日&#xff09;&#xff0c;联想集团发布了2022到2023财年第三季度业绩。根据财报&#xff0c;联想集团实现营收152.67亿美元&#xff0c;同比下降24%&#…

你评论,我赠书~【哈士奇赠书 - 14期】-〖人人都离不开的算法-图解算法应用〗参与评论,即可有机获得

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

html常用font-family设置字体样式

<table border"1" cellpadding"0" cellspacing"0" ><tr><td><h3 style"font-family: 黑体;">黑体&#xff1a;SimHei</h3></td><td><h3 style"font-family: 华文黑体;">华…

优思学院:六西格玛中的水平对比方法是什么?

水平对比&#xff0c;就是比较不同事物之间的差异。 这个概念在六西格玛管理中也很重要&#xff0c;也就是我们经常说的标杆管理&#xff0c;经常被用来寻找行业中最好的做法&#xff0c;以帮助组织改进自身的绩效。 在六西格玛管理中&#xff0c;水平对比有三种常见的应用方式…

java面试题-JUC基础类介绍

1.JUC框架包含几个部分?五个部分&#xff1a;Lock框架和Tools类(把图中这两个放到一起理解)Collections: 并发集合Atomic: 原子类Executors: 线程池2.Lock框架和Tools哪些核心的类?Lock接口&#xff1a;用于提供比synchronized更加灵活和高级的线程同步控制&#xff0c;支持公…

<Linux>vscode搭建Linux远程开发工具

一、下载vscode&#x1f603;可以去vscode的官网下载&#xff0c;不过是外网下载速度较慢提速可以参考&#xff1a;(81条消息) 解决VsCode下载慢问题_vscode下载太慢_wang13679201813的博客-CSDN博客官网&#xff1a;Visual Studio Code - Code Editing. Redefined这里推荐的是…

【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型

GLM-130B&#xff1a;一个开源双语预训练语言模型《GLM-130B: An open bilingual pre-trained model》论文&#xff1a;https://arxiv.org/pdf/2210.02414.pdf 相关博客 【自然语言处理】【大模型】GLM-130B&#xff1a;一个开源双语预训练语言模型 【自然语言处理】【大模型】…

拼多多出评软件工具榜单助手使用教程

软件使用教程下载软件前&#xff0c;关闭电脑的防火墙&#xff0c;退出所有杀毒软件&#xff0c;防止刷单软件被误删桌面建立一个文件夹&#xff0c;下载下来的安装包放进去&#xff0c;解压到当前文件夹&#xff0c;使用过程中别打开防火墙、杀毒软件。打开软件后&#xff0c;…

移动WEB开发五、响应式布局

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

SAP FICO 理解业务范围的概念

业务范围 以前转载过几篇关于业务范围的文章&#xff1a; SAP Business Area 业务范围_SAP剑客的博客-CSDN博客_sap 业务范围 SAP FI 系列 002&#xff1a;业务范围派生_stone0823的博客-CSDN博客_sap 业务范围 http://blog.sina.com.cn/s/blog_3f2c03e30102w9yz.html 仍是…

虹科新品 | 最高80W!用于大基板紫外曝光系统的高功率UVLED光源

光刻曝光是指利用紫外光源将胶片或其他透明物体上的图像信息转移到涂有光敏材料&#xff08;光刻胶&#xff09;表面以得到高精度和极细微图案的一种制作工艺&#xff0c;主要用于半导体生产、高精密集成电路、PCB板制造、MEMS等行业。光刻技术是半导体工业和集成电路是最为核心…

十一、项目实战一

项目实战一 需求 以 前后端不分离的方式实现学生的增删改查操作 学生列表功能 接口设计 url:/students/ 请求方法&#xff1a;get 参数&#xff1a; 格式&#xff1a;查询参数 参数名类型是否必传说明pageint否页码&#xff0c;默认为1sizeinit否每页数据条数默认为10n…

浅谈安科瑞电力智能运维在高速铁路电力系统的应用分析

摘 要&#xff1a;高速铁路电力智能运维管理系统采用终端感知层、系统网络层、系统平台层的三层网络架构模式&#xff0c;通过集成网关&#xff0c;共享通信传输设备&#xff0c;利用铁路专用运维传输网络通道将各类监测数据上传至运维管理平台数据进行实时分析&#xff0c;建…