Spring Cloud Gateway 学习+实践

2021年09月15日 阅读数:1
这篇文章主要向大家介绍Spring Cloud Gateway 学习+实践,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

翻译过来就是:java

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

 

 

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

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

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

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

 

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

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

 

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

 

接下来经过一个具体的例子来感觉一些Spring Cloud Gateway:code

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