开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第二阶段:高并发带来的问题】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/684/detail/11868
高并发带来的问题
一、高并发带来的问题
1. 了解服务容错之前,需要清楚当前代码出现的问题
2. 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,
但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
图示讲解上述情况:
假设 A 服务里有两个方法,分别是 a1 和 a2,再假设 B 服务也有两个方法,分别是b1和b2,A 服务中的 a1 方法是需要调动 B 服务中的 b1 方法的
设计模型如下:
当一个请求从外部进来,要访问A服务的a1方法时,a1方法就会调用B 服务,到此时出现了问题,由于B服务的自身原因或者网络原因,B 服务没有反应,请求遇到堵塞,线程无法释放,
如图所示:
大量请求进来,高并发情况出现了,大量请求进来都访问 a1方法,进而大量的请求会被堵塞,即大量的线程都会占用,如图所示:
对于外部中间件,线程数量具有一定的限制,以 tomact 为例,官方推荐最大线程在200—400之间,如果超过这个数值,tomact 就无法访问,假设是用 tomact 做的中间件,请求一直往a1上发,当发到400的时候,即占了400个线程,
如图所示:
现在选择访问a2方法,不访问a1方法,此时a2方法不调用错误的B服务,a2也已经无法访问,其中原因是a2无法从Tomact 中拿到线程了,即A服务中所有方法都不能进行访问,整个A服务在这瘫痪了。
3.模拟一个高并发的场景
⑴编写 java 代码
@RestController
@slf4j
public class OrderController2 {
@Autowired
Private Orderservice orderservice;
@Autowired
Private Orderservice orderservice;
用代码形式复述这个情况,首先找到订单微服务,找到 Order Controller,复制里面的代码,即20行@RestContronller 之后的代码,新建Order Controller2
把代码粘贴到新建的里面,现在做些调整,把名字改成Order Controller2,把15行和16行的public class OrderController2 删除
其次整理格式,在最后面加上},把不需要的东西删除,如下单后的 fegin 。
现模拟异常,第一个模拟中在31行中写上
Thread.sleep(millis:2001);把异常找出,在32行写上//模拟调用商品微服务需要2s的时间,接着在50行写上//为了不产生大量的额垃圾数据,暂时不保存订单入库,注意在20行最前面加上//,代码到这里完成
由于Tomact 线程过大,不便于模拟
⑵修改配置文件中tomcat的并发数,即在第4行调整成 max-threads:10,代码到此修改完毕,如下所示:
Server:
Port:8091
Tomcat:max-threads: 10 #tomcatd
的最大并发值修改为10,默认是200
接着启动微服务,选择 OrderApplication ,进而进行访问,得出代码没有问题.
现有订单微服务和商品微服务,缺少a2方法,打开Order Controller2,在最后打上如下代码:
//测试高并发
@RequestMapping("/order/message")
Public String message() {
Return
"测试高并发";
}
重新启动 Order Controller2,接着访问/order/message
⑶接下来使用压测工具,对请求进行压力测试
下载地址 https://jmeter.apache.org/.
需要下载安装包,通过访问可以获得最新安装包
①第一步:修改配置,并启动软件
进入bin目录,修改 jmeter.properties 文件中的语言支持为 language=zh_CN,然后点击 jmeter.bat 启动软件。
②第二步:添加线程组
③第三步:配置线程并发数
④第四步:添加 Http 取样
⑷访问 message 方法观察效果
添加察看结果树,可查看发送之后的结果
点击启动按钮,发送请求
⑸结论:
此时会发现,由于 order 方法囤积了大量请求,导致 message方法的访问出现了问题,这就是服务雪崩的雏形。