微服务架构应用设计目的为了应对高并发环境!
1. 什么是并发,并行
并发:指在同一时间段内,多个任务或进程同时执行或交替执行的能力。
并行:指多个任务在同一时间段内同时执行,需要多个处理器或多核处理器来实现。
总的来说,并发更多地强调任务之间的交替执行,而并行更多地强调任务的同时执行。
2. 高并发带来的问题
在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用。
但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
什么是服务雪崩:由于服务与服务之间的依赖性,当高并发访问造成故障后,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩效应” 。
3. 利用Jmeter模拟高并发
下载地址https://jmeter.apache.org/
3.1 将Jmeter改成中文
进入bin目录,修改jmeter.properties文件中的语言支持为language=zh_CN,然后点击jmeter.bat。启动软件。
3.2 调整代码,以Springcloud Alibaba-4-Feign远程调用为例
server:
port: 8091
tomcat:
threads:
max: 10 #tomcat的最大并发值修改为10
@RestController
@RequestMapping("/order")
public class OrderController {
@GetMapping("/test001")
public String test001(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "模拟高并发";
}
@GetMapping("/test002")
public String test001(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "模拟高并发22222";
}
}
3.3 使用Jmeter模拟50个线程同时访问test001接口
4. 常见容错方案
为了解决上述情况以及服务雪崩等问题,我们就需要就要做好服务的容错。
容错:保护接口不被其他接口拖累,导致自己也出错。
容错方案:
- 隔离机制
比如服务A内限制有100个线程, 现在服务A可能会调用服务B、服务C、服务D。
我们在服务A进行远程调用的时候,给不同的服务分配固定的线程,不会把所有线程都分配给某个微服务。
比如:B分配30个线程、C分配30个线程、D分配40个线程。
这样进行资源的隔离,保证即使下游某个服务挂了,也不至于把服务A的线程消耗完。
比如服务B挂了,这时候最多只会占用服务A的30个线程,服务A还有70个线程可以调用服务C和服务D。
- 超时机制
在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
- 限流机制
限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
- 熔断机制
当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
服务熔断一般有三种状态:
1. 熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
2. 熔断开启状态(Open)
后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
3. 半熔断状态(Half-Open)
尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断开启状态。
标签:test001,调用,服务,SpringCloud,Alibaba,并发,熔断,线程
From: https://www.cnblogs.com/itlihao/p/18051112