微服务网关哪家强?一文看懂Zuul, Nginx, Spring Cloud, Linkerd性能差异
2018-08-03 08:59
996 查看
导语: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访问
- 尽管我们不选择直接访问,但是我们在第一步额外做了直接访问的测试,用于衡量代理的理想值,这个测试我们不会在后面的步骤中进行。
- 尽管Spring Cloud Gateway依然没有官方稳定版,我们会在最后那步评估它。
- Zuul随后的性能比第一次压测的性能更好。我们估计出现这种情况的原因是第一次压测进行了JIT优化,所以我们把针对Zuul的第一次压测当成“预热”。在总结表中的值是预热之后的性能。
- 我们知道Linkerd是资源密集型代理,所以我们只在高资源配置的最后一步对比。
- 我们计划去评估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做性能测试,将在我们的下一篇博客中共享结果。
相关文章推荐
- API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)
- SpringCloud的服务网关zuul
- SpringCloud 微服务 (十四) 服务网关 Zuul 过滤器(Pre&Post)
- spring-cloud-zuul服务网关(五)
- Spring Cloud(七)服务网关 Zuul Filter 使用
- spring cloud Zuul(API网关服务)
- spring cloud 学习(6) - zuul 微服务网关
- 干货分享微服务spring-cloud(6.Api网关服务zuul)
- 第二十一章 Spring CLoud Zuul使用 API 网关构建微服务
- SpringCloud 微服务 (十三) 服务网关 Zuul 路由
- SpringCloud调研系列5.2:服务网关Zuul组合API之Filter研究
- SpringCloud系列:利用Zuul实现统一服务网关服务,简单实现IP白名单功能
- Spring Cloud(六)服务网关 zuul 快速入门
- Spring Cloud Zuul微服务网关的API限流
- 纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比
- Spring Cloud Zuul微服务网关的API限流
- SpringCloud之API网关服务Spring Cloud Zuul实例
- Spring Cloud Zuul--服务网关
- spring cloud zuul网关服务重试请求配置和源码分析
- springcloud(十):服务网关zuul