Spring Cloud Gateway 学习+实践

官网上给出的Spring Cloud Gateway特性如下图所示:

翻译过来就是:

  • 基于 Spring Framework 5 ,Project Reactor 以及 Spring Boot 2.0 构建
  • 路由能够匹配任何请求属性
  • Predicates和Filters可以区分路由生效
  • 集成了断路器
  • 继承了Spring Cloud DiscoveryClient
  • 轻松编写Predicates和Filters
  • 请求流控
  • 路径重写

 

 

通过上面的图片可以看出Spring Cloud Gateway的主要功能是由Predicate、Filter以及Route实现,同时也能看出这里对应到了新特性里的“Predicates和Filters可以区分路由生效”。

Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。

Predicate(断言):路由转发的判断条件,目前Spring Cloud Gateway支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式。

Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容等。

 

路由和过滤器的概念在之前Zuul网关的学习中也有所涉及,这里重点学习一下Predicate:

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。

 

图中的谓语就是Predicate的另一种翻译,也可以看到有很多类型的Predicate。比如说时间类型的Predicate(AfterRoutePredicateFactory、BeforeRoutePredicateFactory以及BetweenRoutePredicateFactory),当只有满足特定时间要求的请求会进入到此Predicate中,并交由Route处理;Cookie类型的CookieRoutePredicateFactory,指定的Cookie满足正则匹配,才会进入此Route。此外还有Host、Method、Path、Queryparam、Remoteaddr类型的Predicate,每一种Predicate都会对当前的客户端请求进行判断。

 

接下来通过一个具体的例子来感受一些Spring Cloud Gateway:

pom中添加相关依赖,由于Spring Cloud Gateway继承了断路器,因此也需要添加hystrix的依赖,否则会出现报错:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

如果启动时有报java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException。那是由于版本冲突,需要手动添加jackson的依赖并指定明确的版本(2.8.5以上):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.5</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.5</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.5</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>2.9.5</version>
</dependency>

具体的Route、Predicate、Filter等设置可以通过代码或者配置文件来实现,这里我们还是通过application.yml来实现:

server:
  port: 10290
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      routes:
        #路由标识
        - id: route-service
          uri: http://127.0.0.1:10090
          order: 0
          predicates:
            #匹配127.0.0.1:10290/provider?mode=test
            - Path=/provider
            - Query=mode, test #参数在转发的过程中不会丢失
          filters:
            #127.0.0.1:10090/query/getServiceName?mode=test
            - RewritePath=/provider, /query/getServiceName

 

完成上述配置后,我们启动服务来进行验证:

没有问题!

 

参考资料:

https://blog.csdn.net/qq_38380025/article/details/102968559

https://www.cnblogs.com/crazymakercircle/p/11704077.html

https://blog.csdn.net/weixin_41357182/article/details/100140772

posted on 2021-09-15 15:06  DluT_eDdy  阅读(389)  评论(0编辑  收藏  举报

导航