高并发会给微服务带来什么样的的问题?
在微服务架构中,我们将业务拆分成一个个的服务,服务和服务之间可以互相调用,但是由于网络原因或者自身的原因,服务并不能保证服务100%是可用的,如果单个服务出现问题,调用这个服务的时候就会出现网络延迟在系统中一直阻塞等待(阻塞就意味着线程不能释放,大量的线程都会占用在这里),此时如果有大量的网络请求(高并发)涌入,会形成任务堆积,最终导致服务瘫痪
tomcat支持的线程是200-400,如果大于这个访问量就会无法访问
如果系统因为某个方法阻塞太久会直接影响到这个系统的其他方法,这个下面我们就去演示
以代码的形式模拟上述场景
进行以下修改
1 由于OrderController中代码已经很多了,这里新建一个测试的OrderController2用来模拟高并发带来微服务出问题带来的阻塞问题
2 为了保证只有一个OrderController能够运行,我们把正常的OrderController的@RestController注掉
3 模拟调用商品微服务需要两秒阻塞
4 为了不产生大量垃圾数据,把保存信息注掉
5 由于tomcat支持的线程数是200-400,我们为了方便测试修改配置文件让tomcat最大线程数改成10,默认是200
#端口server:
server :
port : 8091
#显示tomcat最大线程数为10 默认200
tomcat :
max-threads : 10
6 新增测试方法 用来演示:如果系统因为某个方法阻塞太久(下单方法)会直接影响到这个系统的其他方法(测试方法)
//测试高并发
@RequestMapping( "order/test" )
public String test(){
return "测试高并发" ;
}
修改完之后重启Order服务进行测试,正常访问测试方法是没有任何问题的而且访问速度很快
接下来就要测试高并发下会给我们的测试方法带来什么样的影响
测试之前,我们需要借助一个工具进行测试jmeter
下面就安装jmeter以及进行高并发测试
什么是Jmeter?
Jmeter是Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。它的功能十分强大,今天我们只做测试高并发请求
下载Jmeter
下载网址:https://jmeter.apache.org/download_jmeter.cgi
下载到本地进行解压缩目录如下
我们只需要关心两个地方 启动文件和配置文件
Jmeter进行汉化
打开配置文件修改国际语言
language=zh_CN
保存重启服务(双击bat文件)
汉化前
汉化后
汉化成功
使用Jmeter进行高并发测试
1 添加线程组
2 配置线程并发数
3 添加HTTP取样
右键刚才配置好的线程组新增HTTP取样器
4 配置取样 根据项目配置和接口路径填写即可
5 为了方便查看并发发送结果,添加一个监听器 察看结果树
右键HTTP请求
6 启动jmeter高并发发送请求测试接口
点击启动按钮并且点击yes并且保存启动jmeter高并发发送请求
点击save保存
发现jemter已经启动成功并且已经发送了大量请求,绿色表示发送成功
这时候再访问我们的测试方法.看看他是不是会受到订单方法阻塞而受到影响 http://localhost:8091/order/test
很明显已经被影响了,虽然可以正常访问,但是没有那么快了,至此我们的代码测试和jmeter测试完成!
总结
通过测试发现,由于order方法囤积了大量阻塞线程请求,导致test方法出现了问题,这就是服务雪崩的雏形