纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比

动机

已经不止一次看到“Spring Cloud Gateway性能比Zuul更差”的言论了,不少人人云亦云,来问我,既然如此,那Spring官方还开发Spring Cloud Gateway干嘛?难道仅仅是为了支持Zuul 1.x不支持的长连接、Web Socket吗?

故而写篇博客,纠正一下大家的错误观点。

开端

网上搜索了一下,说Spring Cloud Gateway性能比Zuul差的言论来自:http://www.servicemesh.cn/?/article/45

作者使用ab 进行benchmark,操作非常标准。从结果来看,确实Spring Cloud Gateway比Zuul差了一大截。

但,让我们打开官方的Issue:Throughput problems when compared with Netflix Zuul and Nginx ,里面官方人员回答道:

reactor-netty has issues with http 1.0 and hence ab. reactor/reactor-netty#21

不妨跟踪到reactor/reactor-netty#21 ,看看说了啥:

As discussed recently about the issue raised on https://jira.spring.io/browse/SPR-14964, a very simple ab -n 1 -c 1 http://localhost:8082/items/10 on Spring + Reactor Netty based server block forever likely because Reactor Netty does not support HTTP 1.0.

里面说了,Reactor Netty不支持HTTP 1.0,而Spring Cloud Gateway依赖了reactor-netty 。

也就是说——由于reactor-netty的bug,使用ab 压测结果并不准确!

正确姿势

官方建议使用wrk 进行benchmark测试。不仅如此,官方人员还十(丧)分(心)贴(病)心(狂)地创建了一个benchmark的项目:spring-cloud-gateway-bench ,其中对比了:

  • Spring Cloud Gateway
  • Zuul
  • Linkerd

三者的性能。

思路非常简单:static 项目是一个使用Go语言编写的简单服务器;然后分别使用Gateway/Zuul/Linkerd来代理该服务的端点,并对比。

最终结果:

组件 RPS(request per second)
Spring Cloud Gateway Requests/sec: 32213.38
Zuul Requests/sec: 20800.13
Linkerd Requests/sec: 28050.76

从结果可知,Spring Cloud Gateway的RPS是Zuul的1.6倍!比Linkerd性能还好!

展望

  • 本文的Zuul,指的是Zuul 1.x,是一个基于阻塞io的API Gateway。
  • Spring Cloud Gateway是一个很有前途的项目,上手简单,功能也比较强大。
  • Linkerd也是一个非常有前途的项目,是基于Scala实现的、目前市面上仅有的生产级别的Service Mesh(其他诸如Istio、Conduit暂时还不能用于生产)。
  • Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。

相关文章

最新文章

  1. 服务器ssh登录提示“Permission denied, please try
  2. yii2 登录、退出、自动登录
  3. UESTC 913 握手 Havel定理+优先队列
  4. springday03-go1
  5. JavaScript库开发者们的规则
  6. 服务 远程服务 AIDL 进程间通讯 IPC 深化
  7. 结构-行为-样式-angularJs 指令解决IE下无PlaceHolder的问题
  8. php.ini与php-fpm.conf配置文件的区别
  9. Vue 波纹按钮组件
  10. [Swift]LeetCode785. 判断二分图 | Is Graph Bipartite?
  11. JAVA-HashMap实现原理
  12. jq元素拖拽
  13. Smokeping配置完成之后出现Software error解决办法
  14. Solidity函数view,pure,constant的用法
  15. 利用python和shell脚本生成train.txt的标签文件
  16. Java使用Rabbitmq惊喜队列queue和消息内容的本地持久化核心方法。(内容存储在硬盘)
  17. 页面title改变浏览器兼容性问题
  18. Spring学习手札(二)面向切面编程AOP
  19. Go and Beego Development
  20. UTF8

热门文章

  1. window / Linux 下 Golang 开发环境的配置
  2. HDU 6205(尺取法)2017 ACM/ICPC Asia Regional Shenyang Online
  3. python爬虫1——获取网站源代码(豆瓣图书top250信息)
  4. WebStorm 最新版本激活方式
  5. Web应用配置虚拟主机(www.baidu.com)
  6. 02--STL算法(函数对象和谓词)
  7. 数据库应用(Mysql、Mongodb、Redis、Memcached、CouchDB、Cassandra)
  8. 业务ID 生成策略
  9. redis实战笔记(10)-第10章 扩展Redis
  10. Java序列化机制和原理