各种网关性能测试
注意:以下测试结果来源于Spring Cloud Gateway作者,具体参考:https://github.com/spencergibb/spring-cloud-gateway-bench
Proxy | Avg Latency | Avg Req/Sec/Thread |
---|---|---|
gateway | 6.61ms | 3.24k |
linkered | 7.62ms | 2.82k |
zuul | 12.56ms | 2.09k |
none | 2.09ms | 11.77k |
Terminal 1 (simple webserver)
cd static
./webserver # or ./webserver.darwin-amd64 on a mac
Terminal 2 (zuul)
cd zuul
./mvnw clean package
java -jar target/zuul-0.0.1-SNAPSHOT.jar
Terminal 3 (gateway)
cd gateway
./mvnw clean package
java -jar target/gateway-0.0.1-SNAPSHOT.jar
Terminal 4 (linkerd)
cd linkerd
java -jar linkerd-1.3.4.jar linkerd.yaml
Terminal N (wrk)
wrk
install Ubuntu: sudo apt install wrk
Mac: brew install wrk
NOTE: run each one multiple times to warm up jvm
Gateway bench (8082)
$ wrk -t 10 -c 200 -d 30s http://localhost:8082/hello.txt
Running 30s test @ http://localhost:8082/hello.txt
10 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.61ms 4.71ms 49.59ms 69.36%
Req/Sec 3.24k 278.42 9.02k 75.89%
969489 requests in 30.10s, 175.67MB read
Requests/sec: 32213.38
Transfer/sec: 5.84MB
zuul bench (8081)
~% wrk -t 10 -c 200 -d 30s http://localhost:8081/hello.txt
Running 30s test @ http://localhost:8081/hello.txt
10 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.56ms 13.35ms 195.11ms 86.33%
Req/Sec 2.09k 215.10 4.28k 71.81%
625781 requests in 30.09s, 123.05MB read
Requests/sec: 20800.13
Transfer/sec: 4.09MB
linkerd bench (4140)
~% wrk -H "Host: web" -t 10 -c 200 -d 30s http://localhost:4140/hello.txt
Running 30s test @ http://localhost:4140/hello.txt
10 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 7.62ms 5.45ms 53.51ms 69.82%
Req/Sec 2.82k 184.58 4.11k 72.17%
843418 requests in 30.07s, 186.61MB read
Requests/sec: 28050.76
Transfer/sec: 6.21MB
no proxy bench (8000)
~% wrk -t 10 -c 200 -d 30s http://localhost:8000/hello.txt
Running 30s test @ http://localhost:8000/hello.txt
10 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.09ms 2.07ms 28.37ms 85.89%
Req/Sec 11.77k 2.07k 45.46k 70.97%
3516807 requests in 30.10s, 637.24MB read
Requests/sec: 116841.15
Transfer/sec: 21.17MB
简单总结
多种网关中Nginx的性能无疑是最好的,无论是淘宝的Tengine的功能增强,还是OpenResty的模块增强,都是对Nginx优化。不过从定位来说,我比较倾向于把它定位为传统的只是承载请求转发的工具,对于我们开发的技术栈没那么友好。另外,OpenResty有一个lua-resty-mysql模块,可做mysql的网关,我们没用过,不知道性能如何。
zuul和gateway,都是可以无缝对接spring cloud,结合服务发现,对服务层来说可以做到屏蔽机器资源(ip或内外网域名等),服务对机器无依赖性。它们的定位是融合在微服务的网关,承载着对微服务增强的功能。对于二次开发的易用性来说,两者对我们开发上手都比较容易。
zuul和gateway对比,根据测试情况,gateway的性能还是比zuul好很多的。另外,gateway的也有很多zuul没有的功能,比如支持http2、websocket,根据域名转发等。对于做服务转发,而不是数据库转发这种高性能要求,性能上和Nginx差距不大。
linkerd则是服务网格的概念了,linkerd的原理是系统代理请求,对服务是无侵入性的,有比较成熟的监控管理界面。gateway的官方测试是,gateway性能比linkerd好很多,但是在我的虚拟机上测试,两者差不多。linkerd结合docker和k8s使用,对机器资源的抽象就更上一层。linkerd更像是应用程序或者说微服务间的 TCP/IP,网络监控、限流、熔断对服务层来说是透明无感的。
系统推荐
- 微博关注关系如何实现
- MySQL高可用
- JDK命令行工具
- 是时候使用MapStruct替代BeanUtils了
- Spring RetryTemplate
- Thread & ExecutorService & ThreadPoolExecutor 总览
- ShadowsockServer
- Redis高可用
- 分布式事务Seata
- Git历史记录修改用户名和邮箱
- ESRally性能测试步骤
- BBR加速
- 随机毒鸡汤:有时候觉得自己变丑了,拿出身份证一看,发现多虑了。