概述

  • Gateway是SpringCloud下的新一代服务网关,用以取代之前的NetFlix的Zuul网关

  • Spring Cloud Gateway doc

  • 简介

    Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。

Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等

Gateway服务网关 - 图1

为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

  • 功能

    • 反向代理
    • 鉴权
    • 流量控制
    • 熔断
    • 日志监控
    • ….
  • 网关在架构中所处的位置

    Gateway服务网关 - 图2

  • Gateway对比Zuul

    • Zuul 1.x 基于Servlet 2. 5使用阻塞架构
    • Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合
    • Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API

三大核心概念

Gateway服务网关 - 图3

  1. Route(路由):构建网关的基本模块,由ID,目标URI,一系列断言以及过滤器组成,如果断言为真则匹配该路由
  2. Predicate(断言):Java8函数式接口Predicate。接口的输入类型是ServerWebExchange。可以匹配Http请求中的所有内容,比如请求头和请求参数。如果断言和请求相匹配则进行路由
  3. Filter(过滤):GatewayFilter特定工厂构建的实例,使用过滤器,可以在请求被路由之前或者之后对请求进行修改

Gateway工作流程

  • 官网资料

    Gateway服务网关 - 图4

也即:路由转发+执行过滤器链

入门配置

  1. 新建Module:cloud-gateway-gateway9527

  2. 修改pom文件:不能引入web模块,否则会报错

    1. <dependencies>
    2. <!--gateway-->
    3. <dependency>
    4. <groupId>org.springframework.cloud</groupId>
    5. <artifactId>spring-cloud-starter-gateway</artifactId>
    6. </dependency>
    7. <!--eureka-client-->
    8. <dependency>
    9. <groupId>org.springframework.cloud</groupId>
    10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    11. </dependency>
    12. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
    13. <dependency>
    14. <groupId>top.chasingwind</groupId>
    15. <artifactId>cloud-api-commons</artifactId>
    16. <version>${project.version}</version>
    17. </dependency>
    18. <!--一般基础配置类-->
    19. <dependency>
    20. <groupId>org.springframework.boot</groupId>
    21. <artifactId>spring-boot-devtools</artifactId>
    22. <scope>runtime</scope>
    23. <optional>true</optional>
    24. </dependency>
    25. <dependency>
    26. <groupId>org.projectlombok</groupId>
    27. <artifactId>lombok</artifactId>
    28. <optional>true</optional>
    29. </dependency>
    30. <dependency>
    31. <groupId>org.springframework.boot</groupId>
    32. <artifactId>spring-boot-starter-test</artifactId>
    33. <scope>test</scope>
    34. </dependency>
    35. </dependencies>
  1. 配置文件

    这里是基础配置,还未涉及URI,断言以及过滤

Gateway服务网关 - 图5

  1. 主启动类

    Gateway服务网关 - 图6

  1. 到这里这个模块就可以启动了,但是只是一个普通的SpringBoot模块,那么如何做路由映射

    之前我们的服务8001模块,访问地址为

Gateway服务网关 - 图7

如果我们想要隐藏8001端口,可以通过网关进行配置

修改配置文件

Gateway服务网关 - 图8

predicate对应的请求路径

Gateway服务网关 - 图9

通过9527访问8001端口

Gateway服务网关 - 图10

这样就相当于在微服务模块之前再添加一层网关模块

  1. 存在的问题

    提供服务的路由写死了。如果是单机可以这么做,但是集群的话就不能写死。

应该通过负载均衡,采用服务名的方式来进行路由匹配。

Gateway服务网关 - 图11


默认情况下,Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,进而实现动态路由的功能。

Gateway服务网关 - 图12

修改配置文件

Gateway服务网关 - 图13

通过9527端口进行访问,发现同时实现了负载均衡

Gateway服务网关 - 图14


解释一下uri前面的lb的意思

Gateway服务网关 - 图15

所以上面访问的时候会有负载均衡的现象出现

Gateway常用的Predicate

  1. Predicate是什么

    用于匹配不同的Http请求属性,如果和请求相匹配,则使用当前配置进行路由

Gateway服务网关 - 图16

Gateway服务网关 - 图17

  1. 有哪些Predicate

    查看Gateway模块启动信息

Gateway服务网关 - 图18

官网介绍Predicate

Gateway服务网关 - 图19

  1. The After Route Predicate Factory:用于判断请求时间是否在设置的时间之后,时间是ZonedDatetime类型

    Gateway服务网关 - 图20

Gateway服务网关 - 图21

测试

当前时间晚于配置的时间,可以正常进行路由

Gateway服务网关 - 图22

修改配置文件中的时间,大于当前时间(请求时间)

Gateway服务网关 - 图23

再次进行访问测试,直接报错

Gateway服务网关 - 图24

  1. The Before Route Predicate Factory:用于判断请求时间是否在设置的时间之前,时间是ZonedDatetime类型

    Gateway服务网关 - 图25

  1. The Between Route Predicate Factory:用于判断请求时间是否在设置的时间之间,时间是ZonedDatetime类型

    eg:两个时间用“,”隔开

Gateway服务网关 - 图26

  1. The Cookie Route Predicate Factory:请求的Cookie是否包含配置的Cookie项,并且值也需要匹配

    Gateway服务网关 - 图27

配置

Gateway服务网关 - 图28

当Cookie只有配置的cookie,可以正常访问

Gateway服务网关 - 图29

当Cookie包含配置的cookie,可以正常访问

Gateway服务网关 - 图30

当Cookie不包含配置的cookie,直接报错

Gateway服务网关 - 图31

当Cookie包含配置的cookie,但是值不相等,直接报错

Gateway服务网关 - 图32

  1. The Header Route Predicate Factory

    Gateway服务网关 - 图33

  1. The Host Route Predicate Factory:匹配请求头中的Host参数

    Gateway服务网关 - 图34

Gateway服务网关 - 图35

  1. The Method Route Predicate Factory:匹配请求方式

    Gateway服务网关 - 图36

  1. The Path Route Predicate Factory:匹配请求路径

    Gateway服务网关 - 图37

  1. The Query Route Predicate Factory:请求参数匹配

    Gateway服务网关 - 图38

  1. The Weight Route Predicate Factory:路由权重

    Gateway服务网关 - 图39

Gateway中的Filter

  1. 是什么

    Gateway服务网关 - 图40

  1. Filter分类

  2. 作用

    • 一般用于进行请求记录或者鉴权等等
  3. 作用时机

    Gateway服务网关 - 图41

在Predicate匹配之后进行路由之后

  1. 自定义Filter

    需要实现两个接口

Gateway服务网关 - 图42

测试

Gateway服务网关 - 图43

当不符合过滤器过滤的时候,直接返回请求,根本进不到后面的服务代码

postman返回值为空,页面是浏览器根据406状态码进行渲染得到的

Gateway服务网关 - 图44