资讯专栏INFORMATION COLUMN

Spring Cloud GateWay 路由转发规则介绍

zgbgx / 3494人阅读

摘要:组合示例相同的也可以配置多个,请求的转发是必须满足所有的后才可以进行路由转发,组合使用示例如下所示总结本章节讲解了的相关谓词断言基本使用方式,内部提供了很多种灵活的路由转发规则,在同一个路由内存在多个时,同时满足规则后请求才会被路由转发。

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:

我们通过`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 // 不匹配

### 请求IP 方式匹配转发

`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://www.ucloud.cn/yun/74463.html

相关文章

  • Spring Cloud Gateway的入门案例

    摘要:原文摘要本篇文章主要介绍了什么是,并基于的版本编写一个的入门案例,即基本代理的路由转发配置。作为生态系中的网关,目标是替代,其不仅提供统一的路由方式,并且基于链的方式提供了网关基本的功能,例如安全,监控埋点,和限流等。 原文:http://xujin.org/sc/gw/gw-01/ 摘要:本篇文章主要介绍了什么是Spring Cloud Gateway,并基于Spring Clou...

    lavnFan 评论0 收藏0
  • SpringCloud组件: GateWay整合Eureka转发服务请求

    摘要:单服务我们简单编写一个请求地址,输出字符串信息,添加依赖如下所示配置文件如下所示服务名注册到服务端口号配置该服务的服务名称为,这里对应的。 在上一篇文章Spring Cloud GateWay 路由转发规则介绍中我们讲解了SpringCloud Gateway内部提供的断言、谓语,让我们可以组合更精确的业务场景进行请求,既然SpringCloud GateWay担任了网关的角色,在之前...

    warmcheng 评论0 收藏0
  • 阿里Sentinel支持Spring Cloud Gateway

    摘要:应对突发请求时额外允许的请求数目。匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。和为后续参数匹配特性预留,目前未实现。 1. 前言 4月25号,Sentinel 1.6.0 正式发布,带来 Spring Cloud Gateway 支持、控制台登录功能、改进的热点限流和注解 fallback 等多项新特性,该出手时就出手,紧跟时代潮流,昨天刚发布,今天我就要给大家分...

    chengtao1633 评论0 收藏0
  • spring cloud gateway 全局过滤器

    摘要:全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,访问限制等等。单独定义只需要实现这两个接口就可以了。欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。 接口定义类:org.springframework.c...

    crossea 评论0 收藏0
  • SpringCloud学习(4)

    摘要:本篇介绍并集成是一个服务器,也可以说是进入系统的唯一节点。它还可能有其他功能,如授权监控负载均衡缓存请求分片和管理静态响应处理等。负责请求转发合成和协议转换。它可以在协议与内部使用的非友好型协议间进行转换,如协议协议。         本篇介绍并集成ZUUL API getaway:API Gateway是一个服务器,也可以说是进入系统的唯一节点。这跟面向对象设计模式中的Facade模...

    Michael_Lin 评论0 收藏0

发表评论

0条评论

zgbgx

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<