热门标签 | 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上只部署网关的话,相信性能应该会比较客观。


推荐阅读
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了GregorianCalendar类的基本信息,包括它是Calendar的子类,提供了世界上大多数国家使用的标准日历系统。默认情况下,它对应格里高利日历创立时的日期,但可以通过调用setGregorianChange()方法来更改起始日期。同时,文中还提到了GregorianCalendar类为每个日历字段使用的默认值。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了Hive常用命令及其用途,包括列出数据表、显示表字段信息、进入数据库、执行select操作、导出数据到csv文件等。同时还涉及了在AndroidManifest.xml中获取meta-data的value值的方法。 ... [详细]
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社区 版权所有