Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,目标是取代 Netflix Zuul。
Spring Cloud Gateway 基于 Spring5.0+SpringBoot2.0+WebFlux(基于高性能的 Reactor 模式响应式通信框架 Netty,异步非阻塞模型)等技术开发,性能高于 Netflix Zuul,经过官方测试,Spring Cloud Gateway 的性能是 Zuul 的 1.6 倍,旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Spring Cloud Gateway 不仅提供统一的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤, 完成一些功能)链的方式提供了网关基本的功能,例如:鉴权、流量控制、熔断、路径重写、日志监控、负载均衡、安全认证等等。
下面通过一张图看看网关(Gateway)在系统架构中的具体位置:
从上图可知,网关(Gateway)位于微服务和负载均衡层之间,如果没有负载均衡层,那么网关将直接面对外部请求,即PC端、移动端调用时直接调用网管暴露的 API。注意,千万不要将微服务接口暴露给外包请求,这样做很危险。
Spring Cloud Gateway 具有以下特性:
路由:可以根据请求的路径、方法、头部等条件将请求路由到不同的目标服务。它支持动态路由,可以根据配置的规则动态地将请求转发到不同的服务。
负载均衡:集成了负载均衡功能,可以将请求分发到多个目标服务实例中,以实现负载均衡和高可用性。
过滤器:使用过滤器来处理请求和响应。开发人员可以自定义过滤器来实现各种功能,例如鉴权、请求转发、请求重试等。
断路器:集成了断路器模式,可以在目标服务不可用或超时时进行熔断,防止级联故障。
动态配置:支持动态配置,可以通过配置中心(如 Nacos)来实时更新路由规则和过滤器配置,而无需重启应用。
高性能:使用异步非阻塞的编程模型,基于 Netty 服务器实现,具有良好的性能和扩展性。
路由(Route):路由是网关最基础的部分,也是网关比较基础的工作单元。路由由一个ID、一个目标 URL(最终路由到的地址)、一系列的断言(匹配条件判断)和 Filter 过滤器(精细化控制)组成。如果断言为 true,则匹配该路由。
断言(Predicates):参考了 Java8 中的断言 java.util.function.Predicate,开发人员可以匹配 Http 请求中的所有内容(包括请求头、请求参数、请求路径、请求Host 等等),如果断 言与请求相匹配,则匹配该路由。
过滤器(Filter):一个标准的 Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑,如认证、鉴权、请求转换。
下图抽象描述了 Spring Cloud Gateway 工作原理:
客户端(Gateway Client)向 Spring Cloud Gateway 发出请求。如果网关处理程序映射(Gateway Handler Mapping)确定请求与路由相匹配,则会将其发送到网关 Web 处理程序(Gateway Web Handler)。该处理程序通过特定于请求的过滤链运行请求。注意,上图之所以用虚线划分过滤器,是因为过滤器可以在代理(Proxy)请求发送之前和之后运行逻辑。所有 ”前“ 过滤逻辑都已执行,然后发出代理请求。代理请求发出后,运行 "后" 过滤逻辑。
Zuul 和 Gateway 都是常见的 API 网关技术,它们的主要区别如下:
Zuul 是 Netflix 开源的一个基于 Java 的 API 网关,而 Gateway 是 Spring Cloud 团队开源的一个基于 Spring Cloud 的 API 网关。因此,Zuul 更加成熟和稳定,而 Gateway 则更加轻量和灵活。
Zuul 基于 Servlet 容器,而 Gateway 基于Spring WebFlux,因此 Gateway 支持非阻塞的响应式编程模型,可以处理更高的并发量。
Zuul 使用传统的 Servlet 过滤器来实现请求的路由、过滤和转发,而 Gateway 使用 Spring Cloud Gateway 来实现这些功能,它提供了一种基于路由的方式来定义请求的转发和过滤。
Zuul 支持多种路由策略,包括基于URL 路径、请求参数、请求头等的路由规则,而 Gateway 则更加灵活,支持基于断言和过滤器的动态路由。
Zuul 可以与 Eureka、Ribbon 等组件集成,实现服务的动态发现和负载均衡,而 Gateway 则更加与 Spring Cloud 的生态系统紧密集成,可以直接使用 Spring Cloud 的服务注册和发现功能。
总结,Zuul 适用于传统的 Servlet 容器环境,稳定可靠,功能丰富;而 Gateway 适用于响应式编程环境,轻量灵活,适合构建高性能的微服务架构。