Zuul和Gateway请求IO模型比对(WebFlux优势)以及Reactor模型分析
文章目录
- 背景
- Zuul 请求处理模型
- Gateway
- Doug Lea Reactor模型
- 总结
背景
最近在做一些开源网关的调研,首选也是主流的网关就是Zuul
和Gateway
。然后在性能上基于Zuul
和Gateway
的请求处理模型做了一些比对
Zuul 请求处理模型
首先需要说明的是这里的Zuul版本是1.x,同时Zuul
采用的是Tomcat容器,使用的是传统的Servlet IO处理模型,如下图
简化版本的图片:
第二张图片来源于Zuul官方
可以看到处理模型比较简单。首先每个请求的servlet
由servlet container
进行生命周期管理。container启动时构造servlet对象并调用servlet
init()
进行初始化;container
关闭时调用servlet destory()
销毁servlet
;container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()
方法去处理业务逻辑
缺点:servlet
是一个简单的网络IO模型,基于阻塞和多线程运行的。当请求进入servlet container
时,servlet container
就会为其绑定一个线程,在并发不高的场景下这种模型是适用的,但是一旦并发上升,线程数量就会上涨,而线程资源代价是昂贵的(操作系统的上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单的业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势
优点:编程模型简单,易于理解
基于以上的一些缺点Zuul 2.0 做了重大重构,对整个架构,首先IO模型选用了异步非阻塞,所以底层的通信框架选用了Netty
改进后的IO处理如下
但是由于SpringCloud 暂时没有集成Zuul 2.0的计划。所以一般微服务中如果选用Zuul网关多的还是1.x版本
Gateway
随着Spring 5 推出的WebFlux
,它是完全异步且非阻塞的,底层也是基于Netty实现的。在处理IO密集型请求场景下有着更大的优势。所以Gateway
本身的起点就要比Zuul
高。我们一起来看看Gateway
请求处理模型
可以看到NettyServer
的Boss Group
线程池内的线程循环接收这个请求,然后把完成了TCP三次握手的连接channel交给Worker Group中的某一个事件循环线程来进行处理(该事件处理线程会调用对应的controller进行处理)。所以WebFlux的handler执行是使用Netty的IO线程进行执行的,所以需要注意如果handler的执行比较耗时,会把IO线程耗尽导致不能再处理其他请求,可以通过Reactor的publishOn操作符切换到其他线程池中执行。
Doug Lea Reactor模型
上面的图其实已经表现的比较清晰了,但是我们再结合Doug Lea
的Reactor
模型来理解下
Doug Lea 论文pdf原地址:http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
可以看到单线程的Reactor
和上面的图类似,其中上面的Reactor就是EventGroup(bossGroup)
,负责处理请求的三次握手,返回结果。而业务请求处理就是交给线程池ThreadPool去处理(workerGroup)
即,即Netty中我们编写的一些Handler
,这些业务处理就包括编解码,心跳等。可以看到这种单线程的Reactor
缺点就是一个EventGroup
做了太多事,请求相应,握手等。所以Doug Lea
提出了多线程的Reactor
模型
如下图
相比单线程的Reactor
模型,我们在Boss Group
又做了拆分,分为mainReactor
和subReactor
,可以看到mainReactor主要负责连接处理,而subReactor
负责数据的读取,数据的返回,当然数据的业务操作还是交给workerGroup
线程池去处理
总结
总的来说在Gateway在目前网关选型中会更优,然后也可以看出Reactor
模型的强大,我们结合WebFlux
分析了Reactor
模型,让我们对Reactor
模型理解更为透彻。
Zuul和Gateway请求IO模型比对(WebFlux优势)以及Reactor模型分析相关推荐
- IO多路复用和Reactor模型
目录 1.同步阻塞式IO - BIO 2.同步非阻塞式IO - NIO 2.1 Selector 选择器 2.1.1 SelectionKey 2.1.2 Selector注册事件类型 2.2 Cha ...
- Reactor 模型详解
研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...
- 【后端开发】Reactor 模型详解
研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...
- Reactor模型 介绍
以下内容转载自 https://www.toutiao.com/i6808729994718609934/ 要无障碍阅读本文,需要对NIO有一个大概的了解,起码要可以写一个NIO的Hello Worl ...
- 微服务网关Zuul和Gateway的区别
spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已. 因为zuu ...
- Zuul、Gateway与Nginx的区别
文章目录 导言 Nginx 和 网关 的区别 相同点: 不同点: Zuul 与 Gateway Zuul: Gateway: 相同点 不同点 总结 导言 首先Zuul.Gateway是一类,都是web ...
- 模型描述的关系模式_框架篇:见识一下linux高性能网络IO+Reactor模型
前言 网络I/O,可以理解为网络上的数据流.通常我们会基于socket与远端建立一条TCP或者UDP通道,然后进行读写.单个socket时,使用一个线程即可高效处理:然而如果是10K个socket连接 ...
- IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
1.什么是BIO,NIO,AIO JAVA BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然 ...
- 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型
本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...
最新文章
- CentOS7 打包RPM 升级OpenSSH8.3
- Python中6种基本数据类型
- c++加载python模块,但是PyImport_ImportModule老返回NULL
- 【作业】组合数据类型练习,英文词频统计实例
- .net源代码已经可以调试
- bat入门-----依据ping状态判断ip【第一天】
- linux创建文件内容三行,shell之创建文件及内容的方法示例
- 最近一直因为工作的事情,耽误学习了
- 顶级域名和二级域名共享cookie及相互删除cookie
- 大数据之-Hadoop完全分布式_集群群起_同时启动上万台集群机器---大数据之hadoop工作笔记0037
- 用8张图理解Java
- 如何阻止机器人杀害人类?
- java形式参数分别是基本类型和引用类型的调用
- 产品经理之如何做好演讲
- Flutter之导航栏骨架实现
- iPad能用的c语言编译器,干货:苹果新iPad Pro的USB-C接口可以这么玩
- 年月日软件测试用例的设计,实验三日期题白盒测试用例设计.doc
- php study计算闰年,IOS_IOS获取指定年月的当月天数,前言
在开发IOS中常常需要用 - phpStudy...
- java中的事务管理
- Vulkan Samples 阅读 -- Extensions(二)