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 的区别
- Zuul 1 是一个基于 阻塞 IO 的 API 网关
- Zuul 1 基于
Servlet 2.5
阻塞框架,不支持任何长连接(如 WebSocker)- Zuul 的设计模式与 Nginx 很像,每次 IO 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成
- 但 Nginx 使用 C++ 实现, Zuul 使用 Java 实现,由于 JVM 本身会有第一次加载较慢的情况,使得 Zuul 的性能相对较差
- Zuul 2 理念更加先进,想基于
Netty
非阻塞框架构建并支持长连接,但 Spring Cloud 目前还没有整合 - Spring Cloud Gateway 建立在 Spring 5、Project Reactor 和 Spring Boot 2 上,使用非阻塞 API
- Spring Cloud Gateway 还支持 WebSocket,并且与 Spring 紧密继承具有更好的开发体验
Zuul 1
- 基于 Servlet,一个 Request 占用一个线程
- 高并发环境下疯狂开线程,一个线程被一个 Request 占用,阻塞
- 频繁上下文切换,效率低
Gateway
- 基于
WebFlux
、WebFlux
底层基于Netty
- 传统 Web 框架如 Struts2、SpringMVC 等都是基于 Servlet API 与 Servlet 容器运行的
- Servlet 3.1 支持了异步非阻塞:
WebFlux
是一个典型异步非阻塞框架,它的核心是基于 Reactor 的相关 API 实现的- 相对于传统 Web 框架,
WebFlux
可以运行在诸如Netty
、Undertow
及支持 Servlet 3.1 的容器上- 非阻塞式 + 函数式编程
Spring WebFlux
是 Spring 5 引入的新的响应式框架,区别于 Spring MVC,它不需要依赖 Servlet API,它是完全异步非阻塞的,并且基于 Reactor 来实现响应式流规范