Spring Cloud Gateway路由规则的匹配和优先级(二)
路由顺序
Spring Cloud Gateway会按照路由规则定义的顺序逐个匹配路由规则。如果一个请求与某个路由规则匹配成功,那么该路由规则就被选中,后面的路由规则将不再被考虑。
因此,路由规则的顺序非常重要。通常,越具体的路由规则应该放在越前面,这样可以避免被更为通用的路由规则所覆盖。
下面是一个示例,它将请求的路径为/api/user/123
的请求路由到名为user-service
的服务,而将以/api/user
开头的其他请求路由到名为user-service-v2
的服务:
spring:
cloud:
gateway:
routes:
- id: user-service-route
uri: lb://user-service
predicates:
- Path=/api/user/{id}
- id: user-service-v2-route
uri: lb://user-service-v2
predicates:
- Path=/api/user/**
在上面的示例中,user-service-route
将请求路径为/api/user/123
的请求路由到user-service
服务,user-service-v2-route
将以/api/user
开头的其他请求路由到user-service-v2
服务。
路由规则优先级
在Spring Cloud Gateway中,路由规则的优先级由路由谓词的匹配顺序和路由规则的定义顺序决定。
路由谓词的匹配顺序
Spring Cloud Gateway会按照以下顺序对路由谓词进行匹配:
- Cloud Foundry Route Service Route Predicate
- Weight Route Predicate
- Method Route Predicate
- Path Route Predicate
- Query Route Predicate
- Header Route Predicate
- Cookie Route Predicate
- RemoteAddr Route Predicate
- Host Route Predicate
这意味着,在路由规则中定义的路由谓词越靠前,它的匹配优先级就越高。
路由规则的定义顺序
在路由谓词的匹配顺序相同的情况下,路由规则的定义顺序将决定哪个规则被选中。如果多个路由规则匹配了同一个请求,那么将选择定义在路由规则列表中最前面的那个规则。
因此,路由规则的定义顺序也非常重要。通常,我们应该按照优先级从高到低的顺序来定义路由规则,这样可以确保更具体的规则先被匹配。
下面是一个示例,它展示了路由规则的定义顺序对路由匹配的影响。假设我们有以下三个路由规则:
spring:
cloud:
gateway:
routes:
- id: rule1
uri: http://localhost:8080/service1
predicates:
- Path=/api/v1/**
- id: rule2
uri: http://localhost:8080/service2
predicates:
- Path=/api/v1/users/**
- id: rule3
uri: http://localhost:8080/service3
predicates:
- Path=/api/**
在上面的规则中,rule1
匹配所有以/api/v1
开头的请求,rule2
匹配所有以/api/v1/users
开头的请求,rule3
匹配所有以/api
开头的请求。
现在,假设有一个请求的路径为/api/v1/users/123
。根据上述规则,这个请求可以匹配所有三个路由规则。但是,由于rule1
在rule2
和rule3
之前定义,因此最终会选择rule1
,将请求路由到http://localhost:8080/service1
。
如果我们调整规则的定义顺序,将rule3
放在最前面,那么相同的请求将会被路由到http://localhost:8080/service3
。
因此,我们应该根据路由规则的具体情况和优先级,合理定义路由规则的顺序,以确保路由匹配的正确性和高效性。
相关文章
- 还不会用乐观锁吗?Spring Cloud Alibaba组合Mybatis-Plus真香
- 详解Java中的Spring框架
- java:commons-configuration2与spring的集成
- Spring常用的三种注入方式「建议收藏」
- spring cloud gateway 路由转发原理_微服务网关的作用是什么
- Spring Cloud 2022 正式发布!我的天,OpenFeign 要退出历史舞台了?!
- 最新整理Spring面试题2023
- Java框架Spring入门-第一个spring项目
- 谈谈你对Spring MVC中的九大组件的理解
- 从SSRF 到 RCE —— 对 Spring Cloud Gateway RCE漏洞的分析
- Spring Boot 2.4.3、2.3.9 版本发布,你准备好了吗?
- Spring Cloud Gateway配置路由规则(一)
- Spring Cloud Gateway路由规则的匹配和优先级(一)
- 使用 Spring Cloud Gateway 进行微服务架构的 API 网关实践
- Spring Cloud Stream 高级特性-消息路由和过滤(一)
- Spring Cloud LoadBalancer 的监控
- Spring Cloud Task 核心组件-Task Explorer
- Spring Cloud Task取消任务
- Spring Cloud Data Flow配置数据源、应用程序、任务
- 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常
- Spring Data MongoDB 级联操作详解数据库
- spring cloud 之 Feign 使用HTTP请求远程服务详解架构师
- spring的事务管理详解编程语言
- spring的AOP(四)—-Spring AOP 编程(Advisor)详解编程语言
- Spring Cloud(十):服务网关zuul详解编程语言
- Spring Cloud(一):概述以及核心成员介绍详解编程语言
- spring boot中servlet启动原理详解编程语言
- 注入Spring精神,Redis重新发光(spirng redis)