文章目录

  • 背景
  • Zuul 请求处理模型
  • Gateway
  • Doug Lea Reactor模型
  • 总结

背景

最近在做一些开源网关的调研,首选也是主流的网关就是ZuulGateway。然后在性能上基于ZuulGateway的请求处理模型做了一些比对

Zuul 请求处理模型

首先需要说明的是这里的Zuul版本是1.x,同时Zuul采用的是Tomcat容器,使用的是传统的Servlet IO处理模型,如下图

简化版本的图片:

第二张图片来源于Zuul官方

可以看到处理模型比较简单。首先每个请求的servletservlet 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请求处理模型

可以看到NettyServerBoss Group线程池内的线程循环接收这个请求,然后把完成了TCP三次握手的连接channel交给Worker Group中的某一个事件循环线程来进行处理(该事件处理线程会调用对应的controller进行处理)。所以WebFlux的handler执行是使用Netty的IO线程进行执行的,所以需要注意如果handler的执行比较耗时,会把IO线程耗尽导致不能再处理其他请求,可以通过Reactor的publishOn操作符切换到其他线程池中执行。

Doug Lea Reactor模型

上面的图其实已经表现的比较清晰了,但是我们再结合Doug LeaReactor模型来理解下

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又做了拆分,分为mainReactorsubReactor,可以看到mainReactor主要负责连接处理,而subReactor负责数据的读取,数据的返回,当然数据的业务操作还是交给workerGroup线程池去处理

总结

总的来说在Gateway在目前网关选型中会更优,然后也可以看出Reactor模型的强大,我们结合WebFlux分析了Reactor模型,让我们对Reactor模型理解更为透彻。

Zuul和Gateway请求IO模型比对(WebFlux优势)以及Reactor模型分析相关推荐

  1. IO多路复用和Reactor模型

    目录 1.同步阻塞式IO - BIO 2.同步非阻塞式IO - NIO 2.1 Selector 选择器 2.1.1 SelectionKey 2.1.2 Selector注册事件类型 2.2 Cha ...

  2. Reactor 模型详解

    研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...

  3. 【后端开发】Reactor 模型详解

    研究背景 其实我们在研究netty的时候我们必定绕不过NIO的,也必定必须研究一下这个Reactor模型的,如果不进行这个Reactor模型和NIO知识点的研究,那么我们必定掌握不了Netty的精髓, ...

  4. Reactor模型 介绍

    以下内容转载自 https://www.toutiao.com/i6808729994718609934/ 要无障碍阅读本文,需要对NIO有一个大概的了解,起码要可以写一个NIO的Hello Worl ...

  5. 微服务网关Zuul和Gateway的区别

    spring-cloud-Gateway是spring-cloud的一个子项目.而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已. 因为zuu ...

  6. Zuul、Gateway与Nginx的区别

    文章目录 导言 Nginx 和 网关 的区别 相同点: 不同点: Zuul 与 Gateway Zuul: Gateway: 相同点 不同点 总结 导言 首先Zuul.Gateway是一类,都是web ...

  7. 模型描述的关系模式_框架篇:见识一下linux高性能网络IO+Reactor模型

    前言 网络I/O,可以理解为网络上的数据流.通常我们会基于socket与远端建立一条TCP或者UDP通道,然后进行读写.单个socket时,使用一个线程即可高效处理:然而如果是10K个socket连接 ...

  8. IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。

    1.什么是BIO,NIO,AIO JAVA BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然 ...

  9. 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型

    本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...

最新文章

  1. CentOS7 打包RPM 升级OpenSSH8.3
  2. Python中6种基本数据类型
  3. c++加载python模块,但是PyImport_ImportModule老返回NULL
  4. 【作业】组合数据类型练习,英文词频统计实例
  5. .net源代码已经可以调试
  6. bat入门-----依据ping状态判断ip【第一天】
  7. linux创建文件内容三行,shell之创建文件及内容的方法示例
  8. 最近一直因为工作的事情,耽误学习了
  9. 顶级域名和二级域名共享cookie及相互删除cookie
  10. 大数据之-Hadoop完全分布式_集群群起_同时启动上万台集群机器---大数据之hadoop工作笔记0037
  11. 用8张图理解Java
  12. 如何阻止机器人杀害人类?
  13. java形式参数分别是基本类型和引用类型的调用
  14. 产品经理之如何做好演讲
  15. Flutter之导航栏骨架实现
  16. iPad能用的c语言编译器,干货:苹果新iPad Pro的USB-C接口可以这么玩
  17. 年月日软件测试用例的设计,实验三日期题白盒测试用例设计.doc
  18. php study计算闰年,IOS_IOS获取指定年月的当月天数,前言 在开发IOS中常常需要用 - phpStudy...
  19. java中的事务管理
  20. Vulkan Samples 阅读 -- Extensions(二)

热门文章

  1. IENet:分支交互一步无锚的定向遥感目标检测
  2. 二维数组作为函数参数问题
  3. 卡巴斯基推出上网本专用杀毒软件
  4. etlgr是什么服务器_什么是数据ETL
  5. 理想不是超越生活,而是基于现实
  6. mysql批量改表名及列名
  7. 揭秘全球最大网站Facebook背后的那些软件(转载)
  8. IT行业那么辛苦,我们为什么还要选择它?
  9. jQuery方法链式调用的原理
  10. 指令寄存器和程序计数器的区别