查看网关_suse 查看网关_ubuntu如何查看网关

过去一段时间,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实例发起压测请求。

查看网关_suse 查看网关_ubuntu如何查看网关

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

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

性能压测总结

测试策略

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

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

测试配置

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

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

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

测试结果

性能压测结果如下

suse 查看网关_查看网关_ubuntu如何查看网关

查看网关_suse 查看网关_ubuntu如何查看网关

测试详情

直接访问

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

suse 查看网关_ubuntu如何查看网关_查看网关

Nginx反向代理

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

查看网关_suse 查看网关_ubuntu如何查看网关

Zuul反向代理

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

suse 查看网关_查看网关_ubuntu如何查看网关

这是我们的application.yml文件:

ubuntu如何查看网关_查看网关_suse 查看网关

Zuul第1次测试结果如下:

suse 查看网关_ubuntu如何查看网关_查看网关

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

suse 查看网关_ubuntu如何查看网关_查看网关

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

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

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

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

ubuntu如何查看网关_查看网关_suse 查看网关

查看网关_ubuntu如何查看网关_suse 查看网关

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

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

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

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

查看网关_suse 查看网关_ubuntu如何查看网关

suse 查看网关_ubuntu如何查看网关_查看网关

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

Linkerd压测

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

ubuntu如何查看网关_查看网关_suse 查看网关

Spring Cloud Gateway性能测试

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

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

ubuntu如何查看网关_查看网关_suse 查看网关

由上图可见,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的性能。下一步我们的计划如下:

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

文中链接

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

本文作者Turgay Çelik,由邓启明翻译,转载本文请注明出处,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击网站首页每天更新
站 长 微 信: aiwo51889