SpringCloudGateWay路由转发规则介绍详解
Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,⽐如:Eureka、Zuul、Feign、Ribbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的⽹关组件,可以实现限流、安全认证、⽀持长连接等新特性。
Spring Cloud Gateway
Spring Cloud Gateway是SpringCloud的全新⼦项⽬,该项⽬基于Spring5.x、SpringBoot2.x技术版本进⾏编写,意在提供简单⽅便、可扩展的统⼀API路由管理⽅式。
概念解释:
Route(路由):路由是⽹关的基本单元,由ID、URI、⼀组Predicate、⼀组Filter组成,根据Predicate进⾏匹配转发。
Predicate(谓语、断⾔):路由转发的判断条件,⽬前SpringCloud Gateway⽀持多种⽅式,常见如:Path、Query、Method、Header等。
Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可⽤于修改请求、响应内容。
Spring Cloud GateWay ⼯作流程如下所⽰:
客户端向Spring Cloud Gateway发出请求。如果⽹关处理程序映射确定请求与路由匹配,则将其发送到⽹关Web处理程序。此处理程序运⾏时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执⾏逻辑。执⾏所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执⾏“post”过滤器逻辑。
开始使⽤
Spring Cloud Gateway⽬前有两种⽅式进⾏配置:
通过@Bean注解RouteLocator⽅法返回值
在本章会侧重针对配置⽂件⽅式进⾏讲解,当然RouteLocator⽅式也会简单的告诉⼤家的使⽤⽅式。
添加依赖
添加Spring Cloud Gateway相关依赖,l如下所⽰:
//...省略部分内容
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<!--Spring Cloud Gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
//...省略部分内容
Spring Cloud Gateway Predicates
在我们开始本章内容之前我们要来先了解下Spring Cloud Gateway内部提供的所有谓语、断⾔,这样我们才能⽬标性的进⾏学习,我整理出来了⼀个脑图,如下所⽰:
每⼀个Predicate的使⽤,你可以理解为:当满⾜这种条件后才会被转发,如果是多个,那就是都满⾜的情况下被转发。Path ⽅式匹配转发
通过Path转发⽰例,我们讲解下上⾯的两种配置,分别是l以及RouteLocator。
配置⽂件匹配地址转发
我们在l配置⽂件内添加对应的路由配置,如下所⽰:
spring:
application:
name: spring-cloud-gateway-sample
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
# 匹配路径转发
- Path=/api-boot-datasource-switch.html
# 端⼝号
server:
port: 9090
先来解释下route的组成部分:
id:路由的ID
uri:匹配路由的转发地址
springcloud和springboot
predicates:配置该路由的断⾔,通过PredicateDefinition类进⾏接收配置。
访问效果如下所⽰:
RouteLocator 匹配路径转发
在上⾯的配置中,如果使⽤RouteLocator⽅式该怎么进⾏配置呢?
如下所⽰:
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
utes()
.route("blog", r ->
r.path("/api-boot-datasource-switch.html").uri("blog.yuqiyu"))
.build();
}
Before ⽅式匹配转发
当部署有访问时间限制的接⼝时,我们可以通过Before Predicate来完成某⼀个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所⽰:spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]
After ⽅式匹配转发
After Predicate与Before配置使⽤⼀致,匹配某⼀个时间点之后允许路由转发,如下所⽰配置:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- After=2019-04-29T00:00:00+08:00[Asia/Shanghai]
Between ⽅式匹配转发
那如果是⼀个时间段内允许请求转发,通过Before、After组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between⽅式,如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]
Cookie ⽅式匹配转发
Spring Cloud Gateway还提供了根据Cookie值的⽅式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所⽰:spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Cookie=hengboy, yuqiyu
在上⾯配置中,如果客户端发送请求时携带了"hengboy=yuqiyu"的Cookie信息,则允许请求转发。
测试Cookie⽅式转发:
curl localhost:9090 --cookie "hengboy=yuqiyu"
通过上⾯⽅式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致⽆法转发,出现404。
Header ⽅式匹配转发
Spring Cloud Gateway可以根据发送请求的Header信息进⾏匹配转发,加⼊我们可以根据X-Request-Id的值进⾏匹配,如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Header=X-Request-Id, \d+
curl localhost:9090 -H "X-Request-Id:123456"
如果头信息为X-Request-Id:abc时,就会转发失败,出现404。
Host ⽅式匹配转发
Spring Cloud Gateway可以根据Host主机名进⾏匹配转发,如果我们的接⼝只允许**.yuqiyu域名进⾏访问,那么配置如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Host=**.yuqiyu
测试如下所⽰:
1. curl localhost:9090 -H "Host: yuqiyu"  // 匹配
2. curl localhost:9090 -H "Host: api.yuqiyu"  // 匹配
3. curl localhost:9090 -H "Host: admin.yuqiyu" // 匹配
3. curl localhost:9090 -H "Host: hengboy"  // 不匹配
请求⽅式⽅式匹配转发
Rest请求风格的接⼝内往往会存在多种请求⽅式的接⼝,如果我们的接⼝只允许POST请求访问,那么配置如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Method=POST
发送GET请求测试:
~ curl 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 localhost:9090
是可以被转发到⽬标地址uri的,不过我的这个博客是OSS部署的,阿⾥云限制了POST访问,尽管如此我们也证明了可以转发。
请求参数⽅式匹配转发
Spring Cloud GateWay还⽀持根据指定的参数进⾏匹配,Query⽅式的Predicate也有两种⽅式匹配情况,如下所⽰:
请求中存在xxx参数
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Query=xxx
请求中存在xxx参数且值为zzz
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
-
Query=xxx, zzz
根据上⾯配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。
请求路径⽅式匹配转发
Spring Cloud Gateway提供了请求路径变量⽅式匹配转发,如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
-
Path=/article/{articleId}
在上⾯配置中{articleId}是⼀个路径变量,可以是任意值,匹配/article/1、/article/abc等,测试如下所⽰:
~ curl localhost:9090/article/1  // 匹配
~ curl localhost:9090/article/abc  // 匹配
~ curl localhost:9090/article/1/1  // 不匹配
Spring Cloud Gateway可以限制允许访问接⼝的客户端IP地址,配置后只对指定IP地址的客户端进⾏请求转发,配置如下所⽰:
spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
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: blog.yuqiyu
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时,同时满⾜规则后请求才会被路由转发。源码位置
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。