热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实测SpringCloudGateway网关性能(Wrk和Jmeter)

 SpringCloud的Gateway网关性能到底如何,网上各种传言太多。我用Wrk和Jmeter

  SpringCloud 的Gateway网关性能到底如何,网上各种传言太多。我用WrkJmeter两种测试工具,在相同环境和代码下进行压测。这里分享一下Wrk压测过程的数据和结果,希望对你的技术选型等有所助益。

    已把网关项目上传到csdn,可免费下载使用 https://download.csdn.net/download/u012246511/12651700

  (不知道为啥csdn上传的资源,所需积分/C币 老是自己变,而且还需要审核...所以提供个百度云的)

    百度云盘 链接:https://pan.baidu.com/s/1EtEnOI7ATs3v--l4X9GJzw
                   提取码:plfe
 


  • Wrk压测时可能出现超时甚至报错,很大可能是工具问题。用比较专业的Jmeter就几乎没有出现超时和报错。

     不想看过程的可直接跳到第四章节,我会贴出wrk和jmeter两种压测结果,几乎一致。

目录

 

1、测试环境

2、测试所用命令及参数

3、测试过程

3.1做简单路由  只是匹配所有/test/** 请求路由到下游SpringBoot项目,把我提供网关项目yml中的spring提供的默认过滤器、5个自定义过滤器及aop代理全注掉。如图​Get测试结果:

3.2 简单路由+Gateway提供的两个默认过滤器增加AddRequestParameterGatewayFilterFactory和SetRequestHeaderGatewayFilterFactory两个默认的过滤器。 配置如图:​ Get请求测试结果:

 

3.3 路由+默认过滤器+1个自定义全局过滤器自定义全局过滤器用来修改Post请求时request body的

 

3.4 路由+默认过滤器+3个自定义全局过滤器+1个aop代理

3.5  路由+默认过滤器+5个自定义全局过滤器+1个aop代理

4、 结论 (重点.....)

    Wrk压测结果:

   Jmeter压测结果:

 


1、测试环境
  •  网关  

    SpringCloud版本:Hoxton.SR6  

    Gateway 版本:2.2.3.RELEASE

  • 下游服务

    SpringBoot版本: 2.2.8.RELEASE
     
  • 服务主机(本地Windows10)

    内存:8G

    Cpu:  Intel(R) Core(TM) i5-9400F @ 2.90GHz   

    核数:6核

  • 测试客户端(Centos7)

    内存:8G

    Cpu : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz

    核数:4核

  • 安装Wrk
    我是在Centos7上通过 yum 安装的,过程简单,无非就是先装个git ,然后clone代码,再ln个快捷引用就完事了;可参照如下命令:

    cd /usr/local/src
    yum install git -y
    git clone https://github.com/wg/wrk.git
    cd wrk
    yum -y install gcc
     make
    ln -s /usr/local/src/wrk/wrk /usr/local/bin
    wrk -t 2 -c 50 -d 20 --latency http://localhost:8081

2、测试所用命令及参数

    以下命令皆使用15个线程500个连接,进行10秒的压测,并要求在压测结果中输出响应延迟信息。

  •  get请求 :./wrkbin  -t 15 -c500 -d 10 --latency  http://localhost:8081/test/mt
  • post请求: ./wrkbin  -t 15 -c500 -d 10 --latency -s post.lua  http://192.168.2.252:8081/test/mt
    post请求需要使用lua脚本,这里也贴下:


    wrk.method = "POST"
    wrk.headers["Content-Type"] = "application/json"
    wrk.body = "{}"



    3、测试过程

  • 3.1做简单路由

      只是匹配所有/test/** 请求路由到下游SpringBoot项目,把我提供网关项目yml中的spring提供的默认过滤器、5个自定义过滤器及aop代理全注掉。如图

    Get测试结果:

    第一次---->

     

    第二次---->

     

    第三次->

     

    结论: 三次压测平均QPS:4719,出现超时。

  • Post测试结果

    第一次---->

     

    第二次---->

     

    第三次----->

     

    第四次----->

     

    第五次----->

     

    结论: 五次压测平均QPS:3545,出现超时。

3.2 简单路由+Gateway提供的两个默认过滤器
增加AddRequestParameterGatewayFilterFactory和SetRequestHeaderGatewayFilterFactory两个默认的过滤器。 配置如图:


 Get请求测试结果:
 

第一次---->

 

第二次---->

 

第三次->

 

第四次-->

 

结论: 三次压测平均QPS:5193,出现超时及错误。

Post测试结果

第一次---->

第二次---->

第三次----->

第四次----->

第五次----->

结论: 五次压测平均QPS:3357,出现超时。

 

  • 3.3 路由+默认过滤器+1个自定义全局过滤器
    自定义全局过滤器用来修改Post请求时request body的

Post测试结果

第一次---->

第二次---->

第三次----->

第四次----->

第五次----->

  结论: 五次压测平均QPS:979,出现超时及错误。

 

  • 3.4 路由+默认过滤器+3个自定义全局过滤器+1个aop代理

       Post测试结果:

第一次---->

 

第二次---->

 

第三次----->

 

第四次----->

 

第五次----->

 

 

  结论: 五次压测平均QPS:724,出现超时及错误。

  •           3.5  路由+默认过滤器+5个自定义全局过滤器+1个aop代理


           post测试结果:

第一次---->

 

第二次---->

 

第三次----->

 

 

结论: 三次压测平均QPS:431,出现超时及错误。

 

4、 结论 (重点.....)
  •        Wrk压测结果:

用途

QPS

备注

只做简单路由

4131

当请求方式为get时直接放行,并没有修改request body,所以其QPS看起来较高。

路由+默认过滤器

4275

竟然比第一个要高点?其实不尽然....跟我收集的数据和计算有点关系,但不影响整体测试结果。

路由+默认过滤器+1个自定义全局过滤器

979

 

路由+默认过滤器+3个自定义全局过滤器+1个aop代理

724

 

路由+默认过滤器+5个自定义全局过滤器+1个aop代理

431

 

   注1:当有get和post两种QPS时,下表中的QPS=(get+post)%2

    注2:由于2.x  gateway 使用的是netty,可通过设置netty下的reactor.netty.ioWorkerCount参数来优化并发,适当增加一倍后与以上测试结果基本一致,不合理的设置反而会降低QPS。
   
        

 

  •    Jmeter压测结果:
     

    用途

    QPS

    测试次数

    备注

    只做简单路由

    5170

    10

     

    路由+默认过滤器

    4257

    5

     

    路由+默认过滤器+1个自定义全局过滤器

    1469

    5

     

    路由+默认过滤器+3个自定义全局过滤器+1个aop代理

    792

    5

     

    路由+默认过滤器+5个自定义全局过滤器+1个aop代理

    579

    5

     

 Jmeter测试环境和过程跟wrk完全一样,这里我只测的最常用的Post请求。

 Jmeter在linux测post请求时可能需要*.jmx文件,可以在你的windows客户端装个jmeter,在界面上配置好保存后找到本地的*.jmx文件,上传到liunx就可以直接用。

  • 高并发两大杀手锏:1、单机 。 2、复杂操作。
  • 自定义过滤器里不过是从网上找了一段修改request body的代码,个人觉得并不能算是复杂操作,而是常用操作。
    至于为什么qps下降如此之大还没有在代码层面做调研,欢迎指正、解惑。
  • spencergibb 在GIt上也有一个gateway和其他网关的性能测试,,参见
    https://github.com/spencergibb/spring-cloud-gateway-bench   (将所有请求路由到一个go搭建的取静态文件的服务中)

               

注意:其实当我们使用了默认提供的过滤器、自定义过滤器和aop代理这些技术导致性能降低时,其实瓶颈可能并不在网关本身了。

比如你的网关层还有访问数据库、redis缓存之类的操作,那QPS会进一步降低这是显而易见的。

 延迟和吞吐量是衡量性能的重要标准,我网关环境的机器并不是只有网关服务,其Cpu和内存并不是只为网关服务,所以如果一台Liunx上只部署网关的话,相信性能应该会比较客观。


推荐阅读
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
author-avatar
6易0k醉人也s易
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有