前言
Spring Cloud 从一开始最受大家质疑的就是网关性能, 那是由于 Spring Cloud 最初选择了使用 Netflix 几年前开源的 Zuul 作为基础, 而高性能版的 Zuul 2 在经过了多次跳票之后, 对于 Spring 这样的整合专家可能也不愿意再继续等待, Spring Cloud Gateway 应运而生, 那么这个由 Spring 社区自己开发推出的网关又如何呢? 最近一篇实测 | 转型微服务, 这 4 大工具谁是 API 网关性能最优?的翻译中对比了 NGINX,ZUUL,Spring Cloud Gateway,Linkerd, 得出的结论让不少读者感到诧异, Spring Cloud Gateway 是否真的有这么差? 不妨通过下文来进一步了解(以下内容转载自来Spring Cloud 与 Docker 微服务实战作者周立的博文, 原文地址: http://www.itmuch.com/spring-cloud-sum/performance-zuul-and-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 simpleab-n1-c1http://localhost:8082/items/10on 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 GatewayRequests/sec: 32213.38
- ZuulRequests/sec: 20800.13
- LinkerdRequests/sec: 28050.76
从结果可知, Spring Cloud Gateway 的 RPS 是 Zuul1 的 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 暂时还没有整合计划.
在这里顺便给大家推荐一个架构交流群: 617434785, 里面会分享一些资深架构师录制的视频录像: 有 Spring,MyBatis,Netty 源码分析, 高并发, 高性能, 分布式, 微服务架构的原理, JVM 性能优化这些成为架构师必备的知识体系. 还能领取免费的学习资源. 相信对于已经工作和遇到技术瓶颈的码友, 在这个群里会有你需要的内容.
来源: http://www.jianshu.com/p/52f6fa8f4aa8