Spring Cloud Gateway Route Predicate Factory 的使用
Spring Cloud Gateway的使用
一、需求
记录Spring Cloud Gateway
的一些用法,不对其原理进行过多的探究。
二、基本组成
1、简介
Spring Cloud Gateway
是 基于Spring boot 5
、Spring Boot 2.0
和Project Reactor
等技术开发的网关。它旨在为微服务提供一个简单有效的方式来管理api路由。
Spring Cloud Gateway 是基于 Netty 运行的,不能运行在传统的Servlet容器中作为War包运行。
2、核型概念
1、Route 路由
Route
是网关的基本组成单元,它是有一个ID
,一个目标URI
和一组predicates
和一组filters
组成,如果一组断言结果为真,则匹配路由,目标URI会被访问。
注意:
1、多个 Predicate
之间是 逻辑and
的关系。
2、多个Predicate
是从定义的顺序从上到下依次执行,也可以指定 order 属性的值。
2、Predicate 谓语、断言
Predicate
是Java 8 Function interface。输入类型是Spring Framework ServerWebExchange
。可以用来匹配HTTP
请求中的任何内容,例如headers
或者 parameters
。
3、Filter 过滤器
Filter
是GatewayFilter
的实例。通过Filter
我们可以在请求发送或返回下游服务时 修改 请求
和响应
。
3、工作原理
三、网关 Predicate配置方式
1、快捷配置方式(配置文件)
快捷方式是由过滤器是的名称
识别,后面紧跟=
,在跟以逗号(,
)分隔的参数值。
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
上一个示例使用两个参数定义了Cookie
Route Predicate Factory,这两个参数是cookie名称,mycookie
和与mycookievalue
匹配的值
2、完全展开的参数(配置文件)
name
:指定谓词工厂的名字
args
:指定对应谓词工厂中的参数对应的值。
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
这种方式配置和上面的快捷方式
配置的是一个意思
3、上方2种方式配置和代码对应关系
4、uri 值的方式
1、以http开头
当匹配到这个路由后,会跳转到这个地址。
2、以 lb 开头
eg:
uri
: lb://service-name
解释:
lb
:表示负载均衡的意思
service-name
:值的是调用服务在注册中心注册的服务名。
四、Route Predicate Factories
Spring Cloud Gateway
内置了特别多的路由谓词工厂,用来匹配http
请求。当多个一起使用时,是and
的关系,即需要所有的谓词工厂都匹配,才匹配这个路由。
1、After
1、描述:
当前请求在指定时间之后
才匹配
2、存在参数:
datetime
数据类型是 ZonedDateTime
,带有时区
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- After=2020-11-01T11:05:08.020+08:00[Asia/Shanghai]
2、Before
1、描述:
当前请求在指定时间之前
才匹配
2、存在参数:
datetime
数据类型是 ZonedDateTime
,带有时区
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Before=2020-11-01T11:05:08.020+08:00[Asia/Shanghai]
3、Between
1、描述:
当前请求在指定时间中间
才匹配
2、存在参数:
datetime1
数据类型是 ZonedDateTime
,带有时区
datetime2
数据类型是 ZonedDateTime
,带有时区
并且 datetime1 必须<
datetime2
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Between=2020-11-01T11:08:08.020+08:00[Asia/Shanghai],2020-11-01T11:15:08.020+08:00[Asia/Shanghai]
4、Cookie
1、描述:
当前请求中的cookie值匹配配置的cookie参数值时生效
2、存在参数:
name
请求cookie
中的参数
的名字
regexp
请求cookie
中的参数
的值,配置的值是Java
中的正则表达式形式。
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Cookie=token,tokenvalue\d+
4、解释
- Cookie=token,tokenvalue\d+
表示 请求中必须存在一个 cookie 的key 是 token 的,且值必须是tokenvalue 后面加上一个数子
才匹配的上,否则匹配不上。
5、Header
1、描述:
当前请求中的header值匹配配置的header参数值时生效
2、存在参数:
name
header key的名字
regexp
header key对应的值,配置的值
是Java
中的正则表达式形式
。
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Header=X-Token-Id,\d+
4、解释
- Header=X-Token-Id,\d+
表示请求头中必须存在R-Token-Id且它的值必须是数字
6、Host
1、描述:
匹配请求头中的Host
的值
2、存在参数:
patterns
配置一系列的以.
作为分隔的ant
风格host地址,多个中间以,
隔开。Host
中配置的值还支持URI template variables
,比如{xxx}.baidu.com
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Host=**.gateway.com,{study}.baidu.com
4、解释
- Host=**.gateway.com,{study}.baidu.com
1、**.gateway.com
:表示请求中的Host
的值需要配置这种ant
风格
2、{study}.baidu.com
:study
这个模版变量可以在GatewayFilter
中获取到,通过ServerWebExchange.getAttributes().get(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE)
获取
7、Method
1、描述:
匹配请求头中的Method
的值
2、存在参数:
methods
需要匹配的方法,比如GET
、POST
等
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Method=GET,POST,PUT # 只有get,post,put请求才能匹配上方这个路由
8、Path
1、描述:
匹配请求路径。
2、存在参数:
patterns
需要匹配的路径eg: /product/{id},/product/**
matchOptionalTrailingSeparator
一个可选的参数
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- Path=/product/findOne/{productId},/product/**
4、解释
/product/findOne/{productId}
支持uri模版变量,productId
可以在GatewayFilter
中获取,获取方式.
Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);
String segment = uriVariables.get("productId");
9、Query
1、描述:
匹配请求参数。
2、存在参数:
param
请求参数的key值
regexp
请求参数的值,配置的值是Java
中的正则表达式形式。
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
#- Query=pwd
- Query=username,\d+
4、解释
1、Query=pwd
表示请求中必须存在 pwd
这个请求参数
2、Query=username,\d+
表示请求中必须存在username
这个参数,且它的值必须是数字
10、RemoteAddr
1、描述:
匹配请求的ip地址,支持ipv4和ipv6。
2、存在参数:
sources
地址列表eg:127.0.0.1/16 后方的/16是子网掩码
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider # 名字唯一即可
uri: lb://product-provider
predicates:
- RemoteAddr=127.0.0.1/16
4、注意
如果我们的Spring Cloud Gateway
是位于代理后面,那么获取到远程地址可能不正确
,此时我们可以自己编写一个RemoteAddressResolver
来解决。
11、Weight
1、描述:
根据权重
来分发请求,权重是根据group
来计算的。
2、存在参数:
group
组,权重根据组来计算
weight
权重值,是一个 Int
的值
3、配置实例
spring:
cloud:
gateway:
routes:
- id: product-provider
uri: https://weighthigh.org
predicates:
- Weight=group1,8
- id: user-consumer
uri: https://weightlow.org
predicates:
- Weight=group1,2
4、解释
上方配置会导致80%
的请求落到 https://weighthigh.org
,有20%
的请求落到https://weightlow.org
五、自己编写一个 route predicate factory
1、编写步骤
1、编写一个类,实现RoutePredicateFactory
接口,或继承AbstractRoutePredicateFactory
> 1、AbstractRoutePredicateFactory 中的 C
表示 配置文件类
> 2、重写shortcutFieldOrder
此方法,表示的配置文件中参数的位置
> 3、重写apply(C c)
方法,表示的是具体的业务逻辑
2、我们自己编写的类必须要以RoutePredicateFactory
结尾,否则比较麻烦,参考
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#initFactories
这个方法。
2、要实现的功能
判断请求参数中是否存在 token
配置的值。
3、Java代码
@Slf4j
@Component
public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> {
public TokenRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Lists.newArrayList("token");
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
log.info("判断请求头中是否存在token这个参数");
String token = exchange.getRequest().getQueryParams().getFirst(config.getToken());
return StringUtils.isNotBlank(token);
};
}
@Data
public static class Config {
private String token;
}
}
4、配置文件
spring:
cloud:
gateway:
routes:
- id: product-provider
uri: lb://product-provider
predicates:
- Token=token
5、解释
六、完整代码
https://gitee.com/huan1993/spring-cloud-alibaba-parent/tree/master/gateway
七、参考链接
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/
Spring Cloud Gateway Route Predicate Factory 的使用的更多相关文章
- Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory
今天我们来学习下GatewayFilter Factory,中文解释就是过滤器工厂. 官方文档对GatewayFilter Factory的介绍: Route filters allow the mo ...
- spring cloud gateway 深入了解 - Predicate
文章来源 spring cloud gateway 通过谓词(Predicate)来匹配来自用户的请求 为了方便,使用postman测试不同的谓词的效果 路径谓词(Predicate)—— 最简单的谓 ...
- Spring Cloud Gateway实战之四:内置predicate小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- spring cloud gateway之filter篇
转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由 ...
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- 网关我选 Spring Cloud Gateway
网关可提供请求路由与组合.协议转换.安全认证.服务鉴权.流量控制与日志监控等服务.可选的网关有不少,比如 Nginx.高性能网关 OpenResty.Linkerd 以及 Spring Cloud G ...
- Spring Cloud gateway 网关服务二 断言、过滤器
微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...
- Spring Cloud gateway 网关四 动态路由
微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...
- Spring Cloud Gateway - 路由法则
1. After Route Predicate Factory 输入一个参数:时间,匹配该时间之后的请求,示例配置: spring: cloud: gateway: routes: - id: af ...
随机推荐
- 传递集合参数以及SpringMVC和Struts2的区别
一.传递集合参数 二.和Struts2的区别 Struts2是基于类封装请求参数,SpringMVC是基于方法封装参数:
- vue.js框架图片上传组件
html: <div id="app"> <div class="hello"> <div class="upload& ...
- 【第十九篇】- Maven NetBeans之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以前的版本,可在插件管理中心获取 Maven 插件.此例中我们使用的是 NetBeans 6.9. 关于 ...
- java.lang.SecurityException: MODE_WORLD_READABLE错误解决
问题描述:运行Android项目有以下报错: 解决方法: 把 MODE_WORLD_READABLE 更换成 MODE_PRIVATE 即可,因为MODE_WORLD_READABLE 模式已经被废弃 ...
- 【OI】C++STL初步 排序与检索
从紫皮书过来的,但是书中内容讲的比较简洁,做一点补充笔记. 一.排序(sort函数) 头文件:<algorithm> 语法:sort(start,end,cmp); start,end必须 ...
- python函数模块
python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...
- STM32CbueIDE 体验
STM32CbueIDE 体验 下载安装 官网下载链接:https://www.st.com/zh/development-tools/stm32cubeide.html. 软件启动时会令设置工作目录 ...
- PHP中的一些杂项函数学习
今天来学习的这些杂项函数在官方文档中都是放在一个杂项扩展中的,其实这些函数都并不是什么什么特别的扩展,也不需要安装什么东西就可以使用,它们就是一些简单的功能函数而已.当然,其中不少内容也是我们经常会使 ...
- Jmeter系列(2)- 代理服务器录制脚本
操作步骤 step-1 添加代理服务器 step-2 添加线程组 step-3 添加录制控制器 HTTP代理服务器配置 - HTTP(S) Test Script Recorder TestPlan ...
- Shell系列(33) - 多分支if语句简介及计算器例子
多分支if条件语句 if [ 条件判断式1 ] then 当条件判断式1成立时,执行程序1 elif [ 条件判断式2 ] then 当条件判断式2成立时,执行程序2 ...省略更多条件... els ...