Version: Next

Spring Cloud Gateway 概述

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

  • Gateway 旨在提供一种简单有效的方式来对 API 进行路由,以及提供一些强大的过滤器功能,如: 熔断限流重试
  • SpringCloud Gateway 是基于 WebFlux 架构实现的,而 WebFlux 底层使用了高性能的 Reactor 模式通信架构 Netty
  • SpringCloud Gateway 的目标是提供统一的路由方式,且基于 Filter 链的方式提供网关的基本功能,如: 安全监控限流

Maven 依赖

  • spring-cloud-starter-gateway:包含了
    • webflux
    • reactor-netty

作用

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

Spring Cloud Gateway 特性

Spring Cloud Gateway 具有以下特性:

  • 基于 Spring 5、Project Reactor、Spring Boot 2 构建
  • 异步非阻塞模型
  • 动态路由:能够匹配任何请求属性
  • 可以对路由指定 Predicate(断言)Filter(过滤器),且易于编写
  • 集成 Hystrix 断路器功能
  • 继承 Spring Cloud 服务发现功能
  • 请求限流功能
  • 支持路径重写

SpringCloudGateway 与 Zuul 的区别

  1. Zuul 1 是一个基于 阻塞 IO 的 API 网关
  2. Zuul 1 基于 Servlet 2.5 阻塞框架,不支持任何长连接(如 WebSocker)
    • Zuul 的设计模式与 Nginx 很像,每次 IO 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成
    • 但 Nginx 使用 C++ 实现, Zuul 使用 Java 实现,由于 JVM 本身会有第一次加载较慢的情况,使得 Zuul 的性能相对较差
  3. Zuul 2 理念更加先进,想基于 Netty 非阻塞框架构建并支持长连接,但 Spring Cloud 目前还没有整合
  4. Spring Cloud Gateway 建立在 Spring 5、Project Reactor 和 Spring Boot 2 上,使用非阻塞 API
  5. Spring Cloud Gateway 还支持 WebSocket,并且与 Spring 紧密继承具有更好的开发体验

Zuul 1

  • 基于 Servlet,一个 Request 占用一个线程
  • 高并发环境下疯狂开线程,一个线程被一个 Request 占用,阻塞
  • 频繁上下文切换,效率低

Gateway

  • 基于 WebFluxWebFlux 底层基于 Netty
  • 传统 Web 框架如 Struts2、SpringMVC 等都是基于 Servlet API 与 Servlet 容器运行的
  • Servlet 3.1 支持了异步非阻塞WebFlux 是一个典型异步非阻塞框架,它的核心是基于 Reactor 的相关 API 实现的
  • 相对于传统 Web 框架,WebFlux 可以运行在诸如 NettyUndertow 及支持 Servlet 3.1 的容器上
  • 非阻塞式 + 函数式编程
  • Spring WebFlux 是 Spring 5 引入的新的响应式框架,区别于 Spring MVC,它不需要依赖 Servlet API,它是完全异步非阻塞的,并且基于 Reactor 来实现响应式流规范