热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

SpringCloudGateWay路由转发规则介绍详解

这篇文章主要介绍了SpringCloudGateWay路由转发规则介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,比如:EurekaZuulFeignRibbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的网关组件,可以实现限流、安全认证、支持长连接等新特性。

Spring Cloud Gateway

Spring Cloud GatewaySpringCloud的全新子项目,该项目基于Spring5.xSpringBoot2.x技术版本进行编写,意在提供简单方便、可扩展的统一API路由管理方式。

概念解释:

  • Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
  • Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:PathQueryMethodHeader等。
  • Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。

Spring Cloud GateWay 工作流程如下所示:

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。

开始使用

Spring Cloud Gateway目前有两种方式进行配置:

  • application.yml配置文件方式
  • 通过@Bean注解RouteLocator方法返回值

在本章会侧重针对配置文件方式进行讲解,当然RouteLocator方式也会简单的告诉大家的使用方式。

添加依赖

添加Spring Cloud Gateway相关依赖,pom.xml如下所示:

//...省略部分内容

  1.8
  Greenwich.SR1
 

 
  
  
   org.springframework.cloud
   spring-cloud-starter-gateway
  

  
   org.springframework.boot
   spring-boot-starter-test
   test
  
 

 
  
   
    org.springframework.cloud
    spring-cloud-dependencies
    ${spring-cloud.version}
    pom
    import
   
  
 
//...省略部分内容

Spring Cloud Gateway Predicates

在我们开始本章内容之前我们要来先了解下Spring Cloud Gateway内部提供的所有谓语、断言,这样我们才能目标性的进行学习,我整理出来了一个脑图,如下所示:

每一个Predicate的使用,你可以理解为:当满足这种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

Path 方式匹配转发

通过Path转发示例,我们讲解下上面的两种配置,分别是application.yml以及RouteLocator

配置文件匹配地址转发

我们在application.yml配置文件内添加对应的路由配置,如下所示:

spring:
 application:
 name: spring-cloud-gateway-sample
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   # 匹配路径转发
   - Path=/api-boot-datasource-switch.html
# 端口号
server:
 port: 9090

先来解释下route的组成部分:

  • id:路由的ID
  • uri:匹配路由的转发地址
  • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。

访问效果如下所示:

RouteLocator 匹配路径转发

在上面的配置中,如果使用RouteLocator方式该怎么进行配置呢?

如下所示:

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
 return builder.routes()
 .route("blog", r -> 
   r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com"))
 .build();
}

Before 方式匹配转发

当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]

在上面配置中,我们允许2019-05-01日凌晨之前通过路由转发到http://blog.yuqiyu.com,通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud GatewayBefore断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

After 方式匹配转发

After PredicateBefore配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - After=2019-04-29T00:00:00+08:00[Asia/Shanghai]

在上面配置中允许2019-04-29凌晨之后进行转发到http://blog.yuqiyu.com

Between 方式匹配转发

那如果是一个时间段内允许请求转发,通过BeforeAfter组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]

在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发到http://blog.yuqiyu.com

COOKIE 方式匹配转发

Spring Cloud Gateway 还提供了根据COOKIE值的方式匹配转发请求,如果请求中所携带的COOKIE值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - COOKIE=hengboy, yuqiyu

在上面配置中,如果客户端发送请求时携带了"hengboy=yuqiyu"的COOKIE信息,则允许请求转发。

测试COOKIE方式转发:

curl http://localhost:9090 --COOKIE "hengboy=yuqiyu"

通过上面方式我们是可以成功转发请求的,如果我们修改COOKIE的值,就会导致无法转发,出现404。

Header 方式匹配转发

Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Header=X-Request-Id, \d+

在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到http://blog.yuqiyu.com,我们通过如下方式进行测试:

curl http://localhost:9090 -H "X-Request-Id:123456"

如果头信息为X-Request-Id:abc时,就会转发失败,出现404。

Host 方式匹配转发

Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许**.yuqiyu.com域名进行访问,那么配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Host=**.yuqiyu.com

测试如下所示:

1. curl http://localhost:9090 -H "Host: yuqiyu.com"  	// 匹配
2. curl http://localhost:9090 -H "Host: api.yuqiyu.com"		// 匹配
3. curl http://localhost:9090 -H "Host: admin.yuqiyu.com" // 匹配
3. curl http://localhost:9090 -H "Host: hengboy.com" 	 // 不匹配

请求方式 方式匹配转发

Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允许POST请求访问,那么配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Method=POST

发送GET请求测试:

~ curl http://localhost:9090
{"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}

我们的请求并未被Spring Cloud Gateway进行转发,那么我们再来通过POST请求进行测试:

curl -X POST http://localhost:9090

是可以被转发到目标地址uri的,不过我的这个博客是OSS部署的,阿里云限制了POST访问,尽管如此我们也证明了可以转发。

请求参数 方式匹配转发

Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

请求中存在xxx参数

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Query=xxx

我们通过curl http://localhost:9090\?xxx\=123是可以被成功转发的,只要参数存在xxx就会被成功转发,否则出现404转发失败。

请求中存在xxx参数且值为zzz

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Query=xxx, zzz

根据上面配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。

请求路径 方式匹配转发

Spring Cloud Gateway提供了请求路径变量方式匹配转发,如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Path=/article/{articleId}

在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1/article/abc等,测试如下所示:

~ curl http://localhost:9090/article/1			// 匹配
~ curl http://localhost:9090/article/abc		// 匹配
~ curl http://localhost:9090/article/1/1		// 不匹配

Spring Cloud Gateway可以限制允许访问接口的客户端IP地址,配置后只对指定IP地址的客户端进行请求转发,配置如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - RemoteAddr=192.168.1.56/24

在上面我们配置了192.168.1.56/24,其中192.168.1.56是客户端的IP地址,而24则是子网掩码。

组合示例

相同的Predicate也可以配置多个,请求的转发是必须满足所有的Predicate后才可以进行路由转发,组合使用示例如下所示:

spring:
 cloud:
 gateway:
  routes:
  - id: blog
   uri: http://blog.yuqiyu.com
   predicates:
   - Query=author, hengboy
   - Query=yuqiyu
   - Method=GET
   - COOKIE=hengboy, yuqiyu
   - Header=X-Request-Id, \d+
   - RemoteAddr=192.168.1.56/24

总结

本章节讲解了Spring Cloud Gateway的相关谓词、断言基本使用方式,GateWay内部提供了很多种灵活的路由转发规则,在同一个路由内存在多个Predicate时,同时满足规则后请求才会被路由转发。

源码位置

Gitee:https://gitee.com/hengboy/spring-cloud-chapter/tree/master/SpringCloud/spring-cloud-gateway

ApiBoot:https://gitee.com/hengboy/api-boot、https://github.com/hengboy/api-boot

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Svn和Maven的使用说明,包括版本控制和构建工具的功能和优势。同时提供了一个相关链接,链接中详细介绍了SvnMaven的使用方法和注意事项。通过学习和使用SvnMaven,开发人员可以更好地进行代码管理、软件开发和协作开发,提高项目管理的效率和质量。 ... [详细]
author-avatar
PearlLisa_Shanghai_901
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有