Gateway 简介

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 简介

从上图可知,网关(Gateway)位于微服务和负载均衡层之间,如果没有负载均衡层,那么网关将直接面对外部请求,即PC端、移动端调用时直接调用网管暴露的 API。注意,千万不要将微服务接口暴露给外包请求,这样做很危险。

Gateway 的特性

Spring Cloud Gateway 具有以下特性:

  • 路由:可以根据请求的路径、方法、头部等条件将请求路由到不同的目标服务。它支持动态路由,可以根据配置的规则动态地将请求转发到不同的服务。

  • 负载均衡:集成了负载均衡功能,可以将请求分发到多个目标服务实例中,以实现负载均衡和高可用性。

  • 过滤器:使用过滤器来处理请求和响应。开发人员可以自定义过滤器来实现各种功能,例如鉴权、请求转发、请求重试等。

  • 断路器:集成了断路器模式,可以在目标服务不可用或超时时进行熔断,防止级联故障。

  • 动态配置:支持动态配置,可以通过配置中心(如 Nacos)来实时更新路由规则和过滤器配置,而无需重启应用。

  • 高性能:使用异步非阻塞的编程模型,基于 Netty 服务器实现,具有良好的性能和扩展性。

Gateway 术语

  • 路由(Route):路由是网关最基础的部分,也是网关比较基础的工作单元。路由由一个ID、一个目标 URL(最终路由到的地址)、一系列的断言(匹配条件判断)和 Filter 过滤器(精细化控制)组成。如果断言为 true,则匹配该路由。

  • 断言(Predicates):参考了 Java8 中的断言 java.util.function.Predicate,开发人员可以匹配 Http 请求中的所有内容(包括请求头、请求参数、请求路径、请求Host 等等),如果断 言与请求相匹配,则匹配该路由。

  • 过滤器(Filter):一个标准的 Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑,如认证、鉴权、请求转换。

Gateway 运行原理

下图抽象描述了 Spring Cloud Gateway 工作原理:

Gateway 简介

客户端(Gateway Client)向 Spring Cloud Gateway 发出请求。如果网关处理程序映射(Gateway Handler Mapping)确定请求与路由相匹配,则会将其发送到网关 Web 处理程序(Gateway Web Handler)。该处理程序通过特定于请求的过滤链运行请求。注意,上图之所以用虚线划分过滤器,是因为过滤器可以在代理(Proxy)请求发送之前和之后运行逻辑。所有 ”前“ 过滤逻辑都已执行,然后发出代理请求。代理请求发出后,运行 "后" 过滤逻辑。

Zuul 和 Gateway 的区别

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 适用于响应式编程环境,轻量灵活,适合构建高性能的微服务架构。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号