Spring Cloud Gateway系列:路由断言工厂
Spring Cloud Gateway 将路由匹配作为最基本的功能。而这个功能是通过路由断言工厂完成的。Spring Cloud Gateway 中包含了很多种内置的路由断言工厂。所有这些断言都可以匹配 HTTP 请求的不同属性,并且可以根据逻辑与状态,将多个路由断言工厂复合使用。
1、After路由断言工厂
该断言工厂的参数是一个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与该参数时间相比,若请求时间在参数时间之后,则匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://www.baidu.com
predicates:
- After=2027-01-20T17:42:47.789-07:00
API式
@Bean
public RouteLocator afterRouteLocator(RouteLocatorBuilder builder) {
//当前时间加3天,将系统的默认时区设置为当前时区
ZonedDateTime dateTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault());
return builder.routes().route("after_route", ps ->
ps.after(dateTime).uri("https://www.baidu.com"))
.build();
}
2、Before路由断言工厂
该断言工厂的参数是一个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与该参数时间相比,若请求时间在参数时间之前,则匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://www.baidu.com
predicates:
- After=2027-01-20T17:42:47.789-07:00
API式
@Bean
public RouteLocator beforeRouteLocator(RouteLocatorBuilder builder) {
//当前时间加3天,将系统的默认时区设置为当前时区
ZonedDateTime dateTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault());
return builder.routes().route("before_route", ps ->
ps.after(dateTime).uri("https://www.baidu.com"))
.build();
}
3、Between路由断言工厂
该断言工厂的参数是两个 UTC 格式的时间。其会将请求访问到 Gateway 的时间与这两个参数时间相比,若请求时间在这两个参数时间之间,则匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://www.baidu.com
predicates:
- Between=2021-01-20T17:42:47.789-07:00,2027-01-20T17:42:47.789-07:00
API式
@Bean
public RouteLocator betweenRouteLocator(RouteLocatorBuilder builder) {
ZonedDateTime endTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault());
ZonedDateTime startTime = LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault());
return builder.routes().route("between_route",
ps -> ps.between(startTime, endTime)
.uri("https://www.baidu.com"))
.build();
}
4、Cookie路由断言工厂
该断言工厂中包含两个参数,分别是 cookie 的 key 与 value。当请求中携带了指定 key 与 value的 cookie 时,匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://www.baidu.com
predicates:
- Cookie=name,robin
API式
@Bean
public RouteLocator cookieRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("cookie_route",
ps -> ps.cookie("name", "robin").uri("https://baidu.com"))
.build();
}
5、Header路由断言工厂
该断言工厂中包含两个参数,分别是请求头 header 的 key 与 value。当请求中携带了指定 key与 value 的 header 时,匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://www.baidu.com
predicates:
- Header=X-Request-Id,\d+
API式
@Bean
public RouteLocator headerRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("header_route", ps ->
ps.header("X-Request-Id", "\\d+")
.uri("https://baidu.com"))
.build();
}
6、Host路由断言工厂
该断言工厂中包含的参数是请求头中的 Host 属性。当请求中携带了指定的 Host 属性值时,匹配成功,断言为 true。
例如
修改\etc中的hosts文件,为127.0.0.1 这个 ip指定多个主机名。
在该文件中添加如下内容:
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://www.baidu.com
predicates:
- Host=myhost:8000,scootersoftware.com=8000
API式
@Bean
public RouteLocator hostRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("host_route", ps ->
ps.host("myhost.com:8081","scootersoftware.com:8081")
.uri("https://baidu.com"))
.build();
}
7、Method路由断言工厂
该断言工厂用于判断请求是否使用了指定的请求方法,是 POST,还是 GET 等。当请求中使用了指定的请求方法时,匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://www.baidu.com
predicates:
- Method=GET,POST
API式
@Bean
public RouteLocator hostRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("method_route", ps ->
ps.method("GET","POST")
.uri("https://baidu.com"))
.build();
}
8、Path路由断言工厂
该断言工厂用于判断请求路径中是否包含指定的 uri。若包含,则匹配成功,断言为 true,此时会将该匹配上的 uri 拼接到要转向的目标 uri 的后面,形成一个统一的 uri
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: order_route
uri: https://www.baidu.com
predicates:
- Path=/order/**
- id: product_route
uri: https://www.jd.com
predicates:
- Path=/product/**
API式
@Bean
public RouteLocator pathRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("order_route", ps ->
ps.path("/order/**")
.uri("https://baidu.com"))
.route("product_route", ps ->
ps.path("/product/**")
.uri("https://jd.com"))
.build();
}
9、Query路由断言工厂
以上两个 Query 断言的关系是“与”,即只有请求中同时包含了 username 与 password 参数,且username 参数值必须是以 ro 开头的,并且password等于123456就可以访问到。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://www.baidu.com
predicates:
- Query=username,ro.+
- Query=password,123456
API式
@Bean
public RouteLocator queryRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("query_route", ps ->
ps.query("username", "ro.+")
.and()
.query("password", "123456")
.uri("https://baidu.com"))
.build();
}
10、RemoteAddr路由断言工厂
该断言工厂用于判断提交请求的客户端 IP 地址是否在断言中指定的 IP 范围或 IP 列表中。若在,匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: addr_route
uri: https://www.baidu.com
predicates:
- RemoteAddr=192.168.0.1/24
API式
@Bean
public RouteLocator remoteAddrRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("addr_route", ps ->
ps.remoteAddr("192.168.0.1/24")
.uri("https://baidu.com"))
.build();
}
由于当前浏览器提交请求的主机 IP 是 192.168.0.110,属于 192.168.0 网段,所以是可以访问到。
11、Weight路由断言工厂
该断言工厂用于实现对同一组中的不同 uri 实现指定权重的负载均衡。路由中包含两个参数,分别是用于表示组 group,与权重 weight。对于同一组中的多个 uri 地址,路由器会根据设置的权重,按比例将请求转发给相应的 uri。
下面的路由用于指定对两个电商平台 taobao.com 与 jd.com 的访问权重为 8:2。以下两个路由都属于web-group组。
在大量请求的前提下,对于相同的请求,转发到 tabao 的机率占 8 成,转发到 jd 的机率占 2 成。但这不是一个绝对准确的访问比例,大体差不多。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: taobao_route
uri: https://www.taobao.com
predicates:
- Weight=web-group,8
- id: jd_route
uri: https://www.jd.com
predicates:
- Weight=web-group,2
API式
@Bean
public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("taobao_route", ps ->
ps.weight("web-group", 8)
.uri("https://taobao.com"))
.route("jd_route", ps ->
ps.weight("web-group", 2)
.uri("https://jd.com"))
.build();
}
12、XForwardedRemoteAddr路由断言工厂
只要当前请求头中追加入 X-Forwarded-For 的 IP 出现在路由指定的 IP 列表中,则匹配成功,断言为 true。
配置式
server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: addr_route
uri: https://www.baidu.com
predicates:
- XForwardedRemoteAddr=192.168.0.1/24
API式
@Bean
public RouteLocator xForwardedRemoteAddrRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("addr_route", ps ->
ps.xForwardedRemoteAddr("192.168.0.1/24")
.uri("https://baidu.com"))
.build();
}
13、优先级
当一个应用中对于相同的路由断言工厂,分别通过配置式与 API 式都进行了设置,且设置的值不同,此时它们的关系有两种:
或的关系:例如,Header 路由断言工厂、Query 路由断言工厂
优先级关系:例如,After、Before、Between 路由断言工厂。此时配置式的优先级要高于 API 式的。
Spring Cloud Gateway系列:路由断言工厂的更多相关文章
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...
- 通过Nacos动态刷新Spring Cloud Gateway的路由
通过Nacos动态刷新Spring Cloud Gateway的路由 一.背景 二.解决方案 三.实现功能 四.实现步骤 1.网关服务的实现 1.pom文件 2.bootstrap.yml配置文件 3 ...
- springcloud3(五) spring cloud gateway动态路由的四类实现方式
写这篇博客主要是为了汇总下动态路由的多种实现方式,没有好坏之分,任何的方案都是依赖业务场景需求的,现在网上实现方式主要有: 基于Nacos, 基于数据库(PosgreSQL/Redis), 基于Mem ...
- spring cloud gateway网关路由分配
1, 基于父工程,新建一个模块 2,pom文件添加依赖 <dependencies> <dependency> <groupId>org.springframewo ...
- Spring Cloud Alibaba学习笔记(16) - Spring Cloud Gateway 内置的路由谓词工厂
Spring Cloud Gateway路由配置的两种形式 Spring Cloud Gateway的路由配置有两种形式,分别是路由到指定的URL以及路由到指定的微服务,在上文博客的示例中我们就已经使 ...
- Spring Cloud gateway 网关服务二 断言、过滤器
微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...
- Spring Cloud Alibaba学习笔记(19) - Spring Cloud Gateway 自定义过滤器工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的内置过滤器工厂,若Spring Cloud Gateway内置的过滤器工厂无法满足我们的业务需求,那么此时就需要自定义自己的过 ...
- Spring cloud gateway 如何在路由时进行负载均衡
本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...
- 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探
SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...
- Spring Cloud Gateway服务网关
原文:https://www.cnblogs.com/ityouknow/p/10141740.html Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gatewa ...
随机推荐
- 【VUE】 文件预览
[VUE] 文件预览 上传前预览 word文档:docx.doc 核心代码 import {renderAsync} from "docx-preview"; /** * 渲染do ...
- 投个 3D 冰壶,上班玩一玩
本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟. Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎,它使用 JavaScript 语言编写,并且基于 Oi ...
- CTF比赛中Web的php伪协议类型题小结
php协议类型 file:// - 访问本地文件系统 http:// - 访问 HTTP(s) 网址 ftp:// - 访问 FTP(s) URLs php:// - 访问各个输入/输出流(I/O s ...
- don't be shy to use reshape
don't be shy to use reshape
- 26种source-map看花了眼?别急,理解这几个全弄懂
上一篇 webpack处理模块化源码 的文章中提到了 "source map",这一篇来详细说说. 有什么作用 source map 用于映射编译后的代码与源码,这样如果编译后的代 ...
- 一种基于ChatGPT的高效吃瓜方式的探索和研究。
你好呀,我是歪歪. 最近掌握了一个新的吃瓜方式,我觉得还行,给大家简单分享一下. 事情说来就话长了,还得从最近的一次"工业革命"开始,也就是从超导材料说起. 8 月 1 日的时候 ...
- 以程序员的视角,介绍如何通过API接口获取淘宝商品数据的方法和步骤,并提供实际代码示例
当我们想要获取淘宝商品数据时,可以通过调用淘宝开放平台的API接口来实现.下面是一些步骤和示例代码来帮助你开始. 步骤1:申请开发者账号和应用 在开始之前,你需要在淘宝开放平台上注册一个开发者账号 ...
- shell、python时间函数小结
有时需要写一些定时任务脚本,简单总结一下,备忘. 1. 获取当前时间 python 在windows下精确到0.001秒,linux下时间精度为0.000001秒 >>> impor ...
- C++模板介绍
C++ 模板 C++ 模板是一种强大的泛型编程工具,它允许我们编写通用的代码,可以用于处理多种不同的数据类型.模板允许我们在编写代码时将类型作为参数进行参数化,从而实现代码的重用性和灵活性. 在 C+ ...
- Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发
Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能 ...