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、工作原理


上图来自 Spring 官网。

三、网关 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来解决。

参考链接:https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#the-weight-route-predicate-factory

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 的使用的更多相关文章

  1. Spring Cloud Gateway 之 AddRequestHeader GatewayFilter Factory

    今天我们来学习下GatewayFilter Factory,中文解释就是过滤器工厂. 官方文档对GatewayFilter Factory的介绍: Route filters allow the mo ...

  2. spring cloud gateway 深入了解 - Predicate

    文章来源 spring cloud gateway 通过谓词(Predicate)来匹配来自用户的请求 为了方便,使用postman测试不同的谓词的效果 路径谓词(Predicate)—— 最简单的谓 ...

  3. Spring Cloud Gateway实战之四:内置predicate小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. spring cloud gateway之filter篇

    转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在上一篇文章详细的介绍了Gateway的Predict,Predict决定了请求由哪一个路由处理,在路由 ...

  5. 微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

  6. 网关我选 Spring Cloud Gateway

    网关可提供请求路由与组合.协议转换.安全认证.服务鉴权.流量控制与日志监控等服务.可选的网关有不少,比如 Nginx.高性能网关 OpenResty.Linkerd 以及 Spring Cloud G ...

  7. Spring Cloud gateway 网关服务二 断言、过滤器

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  8. Spring Cloud gateway 网关四 动态路由

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  9. Spring Cloud Gateway - 路由法则

    1. After Route Predicate Factory 输入一个参数:时间,匹配该时间之后的请求,示例配置: spring: cloud: gateway: routes: - id: af ...

随机推荐

  1. Mac下Sublime Text3配置Python开发环境

    设置Sublime Text的语法为python View -> syntax ->python 设置编译环境(默认python版本2.7) Tools -> Build Syste ...

  2. HiveServer2的负载均衡高可用与ActicePassive高可用浅析

    负载均衡的高可用 最近在工作中遇到了hiveserver2需要部署高可用的场景,去网上搜索了解过后,用了绝大多数人推荐的共同方法: Property_name Property_value Descr ...

  3. 《挑战程序设计竞赛》——DFS

    DFS(深度优先搜索) 简介 深度优先搜索(DFS,Depth-First Search)是搜索的手段之一.它从某个状态开始,不断的转移状态直到无法转移.然后退回到前一步的状态,继续转移到其他状态,如 ...

  4. 教你用ps如何将图片、文字做出模糊斑驳的作旧效果

    1.对图片的图层执行滤镜-风格化-扩散,选变亮优先. 2.选择画笔工具,在画笔选项里选择喷溅59像素,画笔大小我用的是100px,大家可以根据自己的情况自定义大小,前景设置为黑色. 3.在图章图层上方 ...

  5. [原创]OpenEuler20.03安装配置PostgreSQL13.4详细图文版

    OpenEuler安装配置PostgreSQL 编写时间:2021年9月18日 作者:liupp 邮箱:liupp@88.com 序号 更新内容 更新日期 更新人 1 完成第一至三章内容编辑: 202 ...

  6. 什么是云效 Projex,云效Projex企业级高效研发项目管理平台

    云效项目协作Projects是一款企业级高效研发项目管理平台, 提供了快速实践的敏捷研发项目管理机制,提供对需求.迭代.缺陷各个维度的协同管理以及相关的统计报告,让研发团队高效协作.践行敏捷并持续交付 ...

  7. Linux系列(41) - 监听命令Vmstart,Top(还需完善)

    一.简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控:属于sysstat包:它是对系统的整体情况进行统计 ...

  8. shell加密为二进制可执行文件

    1.下载shc工具 http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz或者到http://www.datsi.fi.upm.es/~fro ...

  9. Edit Step Ladders - UVA 10029

    题意 题目链接(Virtual Judge):Edit Step Ladders - UVA 10029 题意: 如果单词 \(x\) 能通过添加.删除或修改一个字母变换为单词 \(y\),则称单词 ...

  10. BurpSuite 功能概览

    简介 写作思想:相比较具体介绍某个功能的用法.会更加侧重于介绍 Burp 提供哪些功能.这样好处是在比较复杂的测试场景,如果Burp 刚好提供对应的功能,就不用花费精力造轮子了. 而需要掌握具体操作方 ...