zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MYSQL数据库导入数据时出现乱码的解决办法
    Java Web(一) Servlet详解!!
    hibernate(九) 二级缓存和事务级别详讲
    MySQL(五) MySQL中的索引详讲
    LinkedHashMap源码详解
    hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解
    hibernate(七) hibernate中查询方式详解
    MySQL(四) 数据表的插入、更新、删除数据
    MySQL(三) 数据库表的查询操作【重要】
    MySQL(二) 数据库数据类型详解
  • 原文地址:https://www.cnblogs.com/xuzichao/p/15271806.html
Copyright © 2011-2022 走看看