前言

公司打算举办一场活动,现场参与活动人数比较多。针对于可能访问比较密集的接口进行压力测试。使用jmeter进行测试,请求并发稍微多些,系统就会挂起。

  针对压力测试出现的问题,因为并发超过1秒钟100笔就会出现问题,Spring Cloud作为一个成熟的框架,不可能是框架不支持。所以首先想到的是配置上需要进行调优。

1、Spring Cloud配置调优

  请求从jmeter发出后,需要通过Zuul网关,然后到Spring Cloud微服务端。所以,整个调优方向分为两个地方:微服务端和zuul网关。

1.2、微服务应用

  当jmeter调整到每秒钟70个并发请求时,服务应用端的日志中出现了很多hystrix回滚,并且有很多HystrixRuntimeException。

com.netflix.hystrix.exception.HystrixRuntimeException ... could not be queued for execution...

  原因:Hystrix请求线程池缺省为最大10个线程,在大量请求下,很容易超过这个数值,导致抛出异常。

  解决方法:在配置文件中修改线程池中的coreSize(properties方式的配置文件)

hystrix.threadpool.default.coreSize=500

  配置上测试后,客户端不再出现hystrix的异常了,但是并发请求数进一步提高到100以上后,依然会无法响应请求。

1.3、zuul网关

  由于网关也配置使用了Hystrix,在并发请求过大时,也会抛出异常:

com.netflix.hystrix.exception.HystrixRuntimeException: ggx-test short-circuited and no fallback available

  显示的异常时,具体的ggx-test服务系统短路并且没有熔断可用,但ggx-test系统还正在运行,所以问题出现在zuul网关上。

  ① zuul内部路由可以理解为使用一个线程池去发送路由请求,所以我们也需要扩大这个线程池的容量。

zuul.host.maxTotalConnections=1000
zuul.host.maxPerRouteConnections=1000

  ② zuul使用Hystrix,而Hystrix有隔离策略: THREAD 以及 SEMAPHORE ,默认是 SEMAPHORE ,默认大小是100。请求的并发线程超过100就会报错。

zuul.semaphore.max-semaphores=5000

  配置完上述配置后,重新进行测试,在日志中不会出现错误了,但是并发请求超过100/S时,系统挂起,不再响应请求。于是,排查各种可能后,想到了可能是数据库连接池的问题。

2、数据库连接池

  我们系统使用数据库连接池是c3p0,最大的数据库配置的连接数为30个,尝试将数据库最大连接数修改到100时,使用jmeter测试,并发请求能够稍微提高些。这样能够定位到问题就在数据库连接池上。

  目前市场上主流的开源数据库连接池有:C3P0,DBCP,Druid,HikariCp。其中C3P0和DBCP是出现的比较早的数据库连接,比较稳定,在低并发的情况下,整体表现还不错,但是在高并发下,响应时间变长,性能很差,甚至于死锁。Druid是阿里巴巴开源的高性能数据库连接池,虽然性能不及HikariCp,但是它提供的各种维度的统计分析的功能,在国内市场流行度很高。

  相关的数据库连接池对比:

C3P0/DBCP

Druid

hikariCP

应用

主要在Hibernate

各大主流平台

起源于boneCP

性能

较差

很强

线程池容器

Blocking Queue

List Reentrantlock

  综合,Druid性能比较优异,网上文档资料很健全,加上可视化的统计分析很适合我们解决当前问题。我们将数据库连接池从C3P0换到了Druid。

3、总结

  经过上面优化,压力测试达到了预期,jmeter每秒钟发送1000个并发请求,系统能够在预期时间内顺利返回响应结果。虽然不是很高,但是应对我们当前业务需求是足够的。没有最优的架构,只有最合适的架构,一切系统设计原则都要以解决业务问题为最终目标,脱离实际业务的技术情怀架构往往会给系统带入大坑。当然这并不能影响我们对技术的追求,在碰到并发请求大的情况下,有几个维度可以进行尝试优化:首先就是限流,将请求拦截下来,不要对系统造成太大压力;其次使用各种缓存,对于不需要访问数据库的资源缓存起来,提高响应速度,减少数据库压力;然后使用分布式部署,使用集群替代单机;还有优化接口对SQL进行调优等等。

记一次Spring Cloud压力测试的更多相关文章

  1. Spring Cloud使用样例

    Spring Cloud Demo 项目地址:https://github.com/hackyoMa/spring-cloud-demo 组件 基于Spring Boot 2.0.4.Spring C ...

  2. Spring cloud Eureka错误锦集(二)

    最近学习spring cloud,在测试Eureka作为服务注册中心的时候碰到了问题,错误提示如下: "D:\Program\Java\JDK1.8\bin\java" -XX:T ...

  3. 5.Spring Cloud初相识-------Hystrix熔断器

    前言: 1.介绍Hystrix 在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情.Hy ...

  4. Spring Cloud Config采坑记

    1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...

  5. Spring Cloud Gateway入坑记

    Spring Cloud Gateway入坑记 前提 最近在做老系统的重构,重构完成后新系统中需要引入一个网关服务,作为新系统和老系统接口的适配和代理.之前,很多网关应用使用的是Spring-Clou ...

  6. 记一次完整的java项目压力测试

    总结:通过这次压力测试,增加了对程序的理解:假定正常情况下方法执行时间为2秒,吞吐量为100/s,则并发为200/s:假设用户可接受范围为10s,那么并发量可以继续增加到1000/s,到这个时候一切还 ...

  7. Spring Cloud Contract 微服务契约测试

    简介 使用场景 主要用于在微服务架构下做CDC(消费者驱动契约)测试.下图展示了多个微服务的调用,如果我们更改了一个模块要如何进行测试呢? 传统的两种测试思路 模拟生产环境部署所有的微服务,然后进行测 ...

  8. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...

  9. SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们 ...

随机推荐

  1. 【原创】go语言学习(五)函数详解1

    目录 1.函数介绍 2.多返回值和可变参数 3.defer语句 4.内置函数介绍 1.函数介绍 1.1定义: 有输⼊入.有输出,⽤用来执⾏行行⼀一个指定任务的代码块. func functionnam ...

  2. kvm 学习(三)存储池

    创建kvm存储池 1.查看系统已经存储的存储池 [root@runstone ~ ::]#virsh pool-list Name State Autostart ------------------ ...

  3. (转)glances用法

    借鉴:https://www.ibm.com/developerworks/cn/linux/1304_caoyq_glances/index.html glances 可以为 Unix 和 Linu ...

  4. Python 学习随笔 - 1 - 基础数据类型、变量 及 基本运算

    仅有的C语言的基础都是大学时学的: 准备赶潮流,开始学习Python. 随笔记录学习过程中,靠一点点C语言基础难以去理解的地方,以及区别于C语言的地方,做些笔记作为以后参考. Python 解释器直接 ...

  5. 虚拟机VMware安装及Linux系统基础配置(CentOS 7)

    PS: 我是 VMware 14 安装 CentOS 7 来配置Linux虚拟机,想要安装 Ubuntu 18.04 的可以自行其他搜或者参考博客:https://blog.csdn.net/gith ...

  6. Flutter移动电商实战 --(44)详细页_首屏自定义Widget编写

    把详细页的图片.标题.编号和价格形成一个单独的widget去引用 详情页的顶部单独封装个插件 在pages下面新建detials_page的文件件并在里面新建页面details_top_area.da ...

  7. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

  8. 从零配置webpack(react+less+typescript+mobx)

    本文目标 从零搭建出一套支持react+less+typescript+mobx的webpack配置 最简化webpack配置 首页要初始化yarn和安装webpack的依赖 yarn init -y ...

  9. Linux C Socket编程:文件上传

    一个服务端等待, 客户端上传文件到服务端,通过输入要上传的文件名,目前只做到仅对当前执行文件的目录下的文件,应该在服务端收到文件路径之后进行处理的. 服务端代码: #include <netin ...

  10. osg HUD 前景色

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...