高并发带来的问题:
身体再健康的人也免不了生病。
如果某一个服务发生问题,那么调用服务就会发生等待,当大量的请求产生堆积时,就会出现雪崩!
在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
重写controller类的逻辑:
/**
* @author Dragon code!
* @create 2022-05-04 16:46
*/
@RestController
@Slf4j
public class OrderController1 {
@Resource
private OrderService orderService;
@Resource
private ProductService productService;
@RequestMapping("/order/prod/{pid}")
public Order save(@PathVariable Integer pid){
log.info("准备调用商品服务查询商品信息");
//直接使用微服务名字, 从nacos中获取服务地址
String url = "service-product";
//通过fegin调用商品微服务
Product product = productService.findByPid(pid);
log.info("商品微服务返回的商品"+ JSON.toJSONString(product));
log.info("创建订单对象");
Order order = new Order();
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
order.setPid(product.getPid());
order.setUsername("测试用户");
orderService.save(order);
return order;
}
//当前面的方法发生请求拥塞时。本方法是否可用?
@RequestMapping("/order/message")
public String message(){
return "高并发下的问题测试,测试服务阻塞";
}
}
正常情况下都可以正常的访问!
接下来模拟高并发下的场景:
默认情况下同一时刻可以有两百个线程对两百个请求进行处理!
我们刻意的将它设置小一点
使用jmeter工具测试访问压力:
添加线程组和http请求以及断言
点击运行后就可以看到10000个线程同时发请求,数据库短时间内涌入大量数据。
使用Sentinel实现服务容错
# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
设置控制台的运行端口与通信端口:
访问控制台:
实现一个接口的限流
对message的请求只允许一秒钟访问两次
正常访问时:
多次刷新,一秒超过两次时:
出现限流提示!