导语:API Gateway是实现微服务重要的组件之一。面对诸多的开源API Gateway,如何进行选择也是架构师需要关注的焦点。本文作者对几个较大的开源API Gateway进行了压力测试,对于架构师来说,相信可以提供不少帮助。

过去一段时间,OpsGenie的员工数量和产品特性都经历了快速发展。去年,仅仅是我们的工程师团队就由15人增长到了50人。针对开发团队的划分,我们遵循两个披萨原则[1]将每个团队控制在8个工程师。

如你所料的,我们的产品还是一个单体应用。对并行开发的团队来说,CI/CD等过程,开发和运维都是有挑战的。我们跟随当前的技术趋势,正处于单体应用到微服务架构的过渡期。你可以阅读Martin Fowler的这篇文章[2],了解更多微服务架构和它的好处。

这里有一些关于微服务概念推荐的架构模式[3]。其中的一个模式是API网关[4]。API网关是所有客户端的统一入口。API网关对于任意一种处理请求有两种方式处理。一部分请求只要简单路由到相应的服务;还有一些请求需要拆分到多个服务。

API网关模式是开始微服务架构很好的切入点,因为它能路由具体的请求到拆分出来的不同服务。事实上,API网关对我们来说不是一个新概念。到目前为止,我们已经使用过Nginx放在我们的单体应用前面充当API网关,但是我们想重新评估过渡时期继续使用Nginx的合理性。我们关心性能、可扩展性和其他的扩展能力,例如限流。首先,评估大流量下的性能,确保它们能满足我们的需求。

在这篇文章中,我们讲解如何设置我们的测试环境,并且对比这些网关的性能: Zuul 1[5], Nginx[6], Spring Cloud Gateway[7], Linkerd[8]。事实上,我们还有另外两个选择Envoy[9]和 UnderTow[10]。我们将会对这些工具做相同的测试,并且在后面的博客中公布测试结果。

Zuul 1由于使用Java开发,并且对Spring框架有很强的支持,对我们来说似乎很合适。尽管有很多文章对比过Zuul和Nginx,但是我们还想跟Spring Cloud Gateway和Linkerd一起评估。此外,我们计划做高负载的测试,所以我们决定设置我们自己的测试环境。

为了评估API网关各自的性能,我们为OpsGenie产品创建了一个隔离的独立测试环境。我们使用Apache的ab作为压测工具。

首先,我们参照Nginx文档在一个单核1G内存的AWS EC2实例上安装了一个Nginx。这个环境是我们的初始测试环境,然后我们安装Zuul和Spring Cloud Gateway到这个环境中。Nginx为静态资源提供web服务,我们通过Nginx、Zuul和Spring Cloud Gateway定义反向代理到这个web服务。我们同样启动了另外一个单核1G内存的EC2实例发起压测请求。

图片中的箭头是我们的测试路径。这里有4种情况:

  • 直接访问

  • Nginx反向代理访问

  • Zuul访问

  • Spring Cloud Gateway访问

  • Linkerd访问

我们知道大家急于想看测试结果,所以,我们先给测试结果,然后再做详细说明。

性能压测总结


测试策略

我们使用Apache的ab做压测工具。我们发起总共10000个请求、使用200个并发线程分别进行压测。

我们将在3种不同配置的AWS EC2服务器上进行测试。我们会缩小每一步的测试用例的范围:

  • 尽管我们不选择直接访问,但是我们在第一步额外做了直接访问的测试,用于衡量代理的理想值,这个测试我们不会在后面的步骤中进行。

  • 尽管Spring Cloud Gateway依然没有官方稳定版,我们会在最后那步评估它。

  • Zuul随后的性能比第一次压测的性能更好。我们估计出现这种情况的原因是第一次压测进行了JIT优化,所以我们把针对Zuul的第一次压测当成“预热”。在总结表中的值是预热之后的性能。

  • 我们知道Linkerd是资源密集型代理,所以我们只在高资源配置的最后一步对比。

测试配置

T2.Micro——单核1G内存:我们对比测试直接访问、Nginx反向代理和Zuul(预热之后)。

M4.Micro ——双核8G内存:我们对比测试Nginx反向代理和Zuul(预热之后)。

M4.2xLarge——8核32G内存:我们对比测试Nginx反向代理、Zuul(预热之后)、Spring Cloud Gateway和Linkerd。

测试结果

性能压测结果如下

测试详情

直接访问

首先,我们不使用代理,直接访问静态资源。结果如下,单个请求平均30ms。

Nginx反向代理

我们的第2个测试,通过Nginx反向代理访问资源。单次请求平均耗时40ms。可以说,Nginx代理对比直接访问,平均增加了33%的耗时。

Zuul反向代理

接下来,我们创建了一个Spring Boot应用:

这是我们的application.yml文件:

Zuul第1次测试结果如下:

直接访问Nginx单次请求是30ms,通过Nginx反向代理访问是40ms。Zuul首次访问单次请求在388ms。如在另外一篇博客[12]中提到的,JVM预热会有作用。我们重新压测,结果如下:

预热后Zuul代理的性能更好(单次请求是200ms),但是跟Nginx反向代理的40ms对比,仍然不好。

服务器升级到双核8G内存会怎么样呢?

前面的测试服务器配置是单核1G内存。Nginx是C++应用,Zuul是基于Java的。我们知道,Java应用对环境要求更苛刻。所以我们将服务器配置换成双核8G内存实例。

我们重新对Nginx和Zuul做压测,结果如下

由上面图片可见,Nginx反向代理和Zuul代理单次请求花费时间分别是32ms和95ms。这次压测结果比单核1G内存的40ms和200ms更好。

由此可见,使用Spring Boot部署的Zuul有额外的消耗。很可能Zuul的独立应用会有更好的性能。

服务器升级到8核32G内存会怎么样呢?

我们继续评估8核32G内存的服务器配置。Nginx和Zuul的压测结果如下

在8核32G的配置上,Zuul跑赢了Nginx。我们想找到Netflix的Zuul实例部署在哪种类型的ec2服务器上,但是我们没有找到任何信息。一些博客中,有人说了Zuul的性能,并且询问Netflix如何处理的。我们认为这可能是答案,Zuul使用CPU绑定。

Linkerd压测

Linkerd是CNCF的项目,是Scala开发的service mesh应用。他提供反向代理能力用于扩展service mesh能力,例如服务发现。我们评估Linkerd性能并且给出如下结果。Linkerd跟Zuul的性能很接近。

Spring Cloud Gateway性能测试

Spring Cloud组织也开发了一个Gateway模块。尽管官方还没有正式版本,我们觉得还是有必要跟其他选择进行对比。但是,我们按照我们的测试环境修改了Gateway的例子。

我们用Apache的ab使用了20个线程、发了总共10000个请求做了同样的压测。测试结果在下面这张图中:

由上图可见,Spring Cloud Gateway每秒能处理873个请求,单次请求平均耗时229ms。根据我们的测试结果,Spring Cloud Gateway不能达到Zuul、Linkerd、Nginx的性能水平,这是他们目前最新版本测试的结果。Nginx、Zuul、Linkerd和Spring Cloud Gateway的最后一次测试结果上面已经给出。

接下来呢?

这篇文章中,我们使用Apache的工具ab对比了Zuul、Nginx、Linkerd和Spring Cloud Gateway的性能。下一步我们的计划如下:

  • 我们计划去评估Envoy。事实上,Envoy不止是API网关,它是service mesh,但是也提供了API网关功能,能放在应用的前面。

  • Undertow也有反向代理能力,所以我们也计划去评估一下。

  • Netflix基于Netty的非阻塞重新设计了Zuul应用,新的版本叫“Zuul 2”。如果官方发布了新版本的Zuul,我们也会进行性能压测,然后将压测结果分享出来。

  • Spring Cloud Gateway依然在开发中,基于Netty的非阻塞的Java网关,所以对我们来说是一个很好的候选。我们将会评估它的官方稳定版的性能。

  • 一些API网关(Zuul 1)是阻塞的,另外一些(Zuul 2、Linkerd、Envoy)是非阻塞的。阻塞架构对开发和跟踪请求友好,但是阻塞可能产生扩展性问题。非阻塞架构对于团队开发和跟踪更复杂,但是有更好的可扩展和弹性。我们之后将会决定使用阻塞架构还是使用非阻塞架构。

  • 我们将使用Gatling做性能测试,将在我们的下一篇博客中共享结果。

我们将会在博客中共享每一步的成功结果,敬请期待!

文中链接

[1] http://www.businessinsider.com/jeff-bezos-two-pizza-rule-for-productive-meetings-2013-10

[2] https://martinfowler.com/articles/microservices.html

[3] http://microservices.io/patterns/microservices.html

[4] http://microservices.io/patterns/apigateway.html

[5] https://github.com/Netflix/zuul

[6] http://www.nginx.com/

[7] https://github.com/spring-cloud/spring-cloud-gateway

[8] https://linkerd.io/

[9] http://envoyproxy.io/

[10] http://undertow.io/

[11] https://httpd.apache.org/docs/2.4/programs/ab.html

[12] http://instea.sk/2015/04/netflix-zuul-vs-nginx-performance/

[13] https://gatling.io/

微服务网关哪家强?一文看懂Zuul, Nginx, Spring Cloud, Linkerd性能差异相关推荐

  1. 天线巴伦制作和原理_一文看懂巴伦(功能原理、性能参数、基本类型)

    原标题:一文看懂巴伦(功能原理.性能参数.基本类型) 巴伦(英语为balun)为一种三端口器件,或者说是一种通过将匹配输入转换为差分输出而实现平衡传输线电路与不平衡传输线电路之间的连接的宽带射频传输线 ...

  2. 打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nuxt.js

    前言 Spring Cloud项目属于微服务项目,也就是含有多个Sping Boot模块集合而成的项目 Nuxt.js项目属于前端基于Vue的服务端渲染项目 最近在服务器部署上线了一个基于Spring ...

  3. 一文看懂ingress nginx实现灰度发布和蓝绿发布过程

    背景信息 灰度及蓝绿发布是为新版本创建一个与老版本完全一致的生产环境,在不影响老版本的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版 ...

  4. 四超多强 一文看懂中国CV独角兽格局

    关注网易智能,聚焦AI大事件,读懂下一个大时代! 文/丁广胜 通过短短两三年的攻城略地,中国CV(Computer Vision,计算机视觉)行业形成"四超多强"的格局. 商汤.云 ...

  5. mesh和wifi中继的区别_一文看懂Mesh路由和无线中继的差异

    随着时代的发展,如今人们的生活与从前相比已经是有了天翻地覆的变化,就单单拿住房条件来说,20年还没有如今这么多的高楼大厦,人们的居住用房也基本上是矮层居民楼,户型也普遍较小,一家人住起来十分紧凑.如今 ...

  6. 第五章 微服务网关Spring Cloud Gateway

    5.1 微服务网关简介 第三章我们介绍了通过Spring Cloud LoadBalancer实现了微服务之间的调⽤和负载均衡,以及使⽤Spring Cloud OpenFeign声明式调⽤,那我们的 ...

  7. 百亿流量微服务网关的设计与实现

    百亿流量微服务网关的设计与实现 本文从百亿流量交易系统微服务网关(API Gateway)的现状和面临的问题出发,阐述微服务架构与 API 网关的关系,理顺流量网关与业务网关的脉络,分享 API 网关 ...

  8. 绝了,GitHub程序员的微服务资源库太强了,每份学习手册都优质详细

    都说程序员工资高.待遇好, 2022 金九银十到了,你的小目标是 30K.40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算 ...

  9. 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway

    作者:博云BoCloud| 前言 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用. ...

最新文章

  1. String字符串类的获取功能
  2. Async_Await;
  3. 小波的秘密2_MATLAB图像多尺度分析
  4. Java面试总结系列之Collections.sort()
  5. PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
  6. c++ 2.常量定义
  7. Java 8的默认方法:可以做什么和不能做什么?
  8. 各种说明方法的答题格式_语文万能答题公式,给孩子收藏吧!
  9. 【离散数学】含有两个量词的谓词逻辑公式
  10. Python数据可视化实战——iris数据集可视化
  11. Sublime Text 3配置与vim模式(待完整)
  12. 【 2015-2016 XVI Open Cup, Grand Prix of Bashkortostan, SKB Kontur Cup Stage 2】题目总结
  13. Java Applet
  14. html空间登录页面制作,免费HTML网页空间(每月200 GB 流量托管静态网页超简单)...
  15. 营销推广的好工具:博客营销
  16. 常见的保险产品类别-年金保险、意外险
  17. Form(窗体)的FormBorderStyle属性的不同效果
  18. 出海季,互联网出海锦囊之本地化
  19. 电脑屏幕亮度能否自动调节
  20. 信息系统建设服务和能力评估和计算机信息系统集成CS资质的区别

热门文章

  1. C# selecd,new,virtual,abstract与override
  2. 联通和阿里云合作 试点打通全国IT系统
  3. 《火球——UML大战需求分析》(第2章 耗尽脑汁的需求分析工作)——2.3 给客户带来价值,需求分析之正路...
  4. window下搭建虚拟Linux操作系统
  5. 点是否在面内算法(Point-In-Polygon Algorithm)
  6. Linux系统下挂载Windows分区
  7. Apache与Nginx网络模型
  8. linux下aio异步读写详解与实例
  9. linux下修改MySQL 密码
  10. POSIX标准总体分析