我们为什么选择 Gateway?
有 Zuul 了怎么又出来了 Gateway,我们为什么选择 Gateway?
一.neflix 不太靠谱,zuul2.0 一直跳票,迟迟不发布
一方面因为 Zuul1.0 已经进入了维护阶段,而且 Gateway 是 SpringCloud 团队研发的,是亲儿子产品,值得信赖。
而且很多功能 Zuul 都没有用起来也非常的简单便捷。
Gateway 是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然 Netflix 早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且 Netflix 相关组件都宣布进入维护期;不知前景如何?
多方面综合考虑 Gateway 是很理想的网关选择。
二.SpringCloud Gateway 具有如下特性
Spring Cloud Gateway 具有如下特性:
● 基于 Spring Framework 5
, Project Reactor
和 Spring Boot 2.0
进行构建;
● 动态路由:能够匹配任何请求属性;
● 可以对路由指定 Predicate(断言
)和 Filter(过滤器)
;
● 集成 Hystrix
的断路器功能;
● 集成 Spring Cloud 服务发现功能;
● 易于编写的 Predicate(断言)
和 Filter(过滤器)
;
● 请求限流功能;
● 支持路径重写。
三.SpringCloud Gateway 与 Zuul 的区别
Spring Cloud Gateway 与 Zuul 的区别
在 SpringCloud Finchley 正式版之前,Spring Cloud 推荐的网关是 Netflix 提供的 Zuul:
1、Zuul 1.x,是一个基于阻塞 I/O 的 API Gateway
2、Zuul 1.x 基于 Servlet 2. 5
使用阻塞架构它不支持任何长连接(如 WebSocket) Zuul 的设计模式和 Nginx 较像,每次 I/ O 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是 Nginx 用 C++ 实现,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得 Zuul 的性能相对较差。
3、Zuul 2.x 理念更先进,想基于 Netty 非阻塞和支持长连接,但 SpringCloud 目前还没有整合。 Zuul 2.x 的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是 Zuul 的 1. 6 倍。
4、Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API。
5、Spring Cloud Gateway 还支持 WebSocket, 并且与 Spring 紧密集成拥有更好的开发体验
Zuul1.x 模型
Springcloud 中所集成的 Zuul 版本,采用的是 Tomcat 容器,使用的是传统的 Servlet IO 处理模型。
学过尚硅谷 web 中期课程都知道一个题目,Servlet 的生命周期?servlet 由 servlet container 进行生命周期管理。
● container 启动时构造 servlet 对象并调用 servlet init()
进行初始化;
● container 运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用 service()。
● container 关闭时调用 servlet destory()
销毁 servlet;
上述模式的缺点:
● servlet 是一个简单的网络 IO 模型,当请求进入 servlet container 时,servlet container 就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦高并发(比如抽风用 jemeter压),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单业务场景下,不希望为每个 request 分配一个线程,只需要 1 个或几个线程就能应对极大并发的请求,这种业务场景下 servlet 模型没有优势
● 所以 Zuul 1.X 是基于 servlet 之上的一个阻塞式处理模型,即 spring 实现了处理所有 request 请求的一个 servlet(DispatcherServlet)并由该 servlet 阻塞式处理处理。所以 Springcloud Zuul 无法摆脱 servlet 模型的弊端
GateWay 模型
传统的 Web 框架,比如说:struts2,springmvc 等都是基于 Servlet API 与 Servlet 容器基础之上运行的。
但是在 Servlet3.1 之后有了异步非阻塞的支持。而 WebFlux 是一个典型非阻塞异步的框架,它的核心是基于 Reactor 的相关 API 实现的。相对于传统的 web 框架来说,它可以运行在诸如 Netty, Undertow 及支持 Servlet3.1 的容器上。非阻塞式+函数式编程(Spring5 必须让你使用 java8)
Spring WebFlux 是 Spring 5.0 引入的新的响应式框架,区别于 Spring MVC,它不需要依赖 Servlet API,它是完全异步非阻塞的,并且基于 Reactor 来实现响应式流规范。