目录

 

1、高并发带来的问题

2、模拟高并发的场景

2.1、编写两个接口

2.2、修改tomcat线程数

2.3、使用JMeter对接口进行压力测试

2.3.1、下载JMeter

2.3.2、修改配置,并启动软件

2.3.3、添加线程组

2.3.4、添加Http取样

2.3.5、启动压测,浏览器访问message接口观察效果

2.4、结论


1、高并发带来的问题

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证100%可用。如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。

2、模拟高并发的场景

2.1、编写两个接口

package cn.jack.controller;

import cn.jack.domain.Order;
import cn.jack.domain.Product;
import cn.jack.service.OrderService;
import cn.jack.service.ProductService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
public class OrderController2 {

    @Autowired
    private OrderService orderService;
    @Autowired
    private ProductService productService;

    /**
     * 下单 -- 基于Feign实现服务调用
     * @param pid   商品id
     * @return
     */
    @RequestMapping("/order/prod/{pid}")
    public Order order(@PathVariable("pid") Long pid) {
        log.info("收到下单请求,准备查询商品信息。pid={}", pid);

        // 通过Feign调用商品微服务,查询商品信息
        Product product = this.productService.findByPid(pid);
        log.info("商品信息查询成功。内容为:{}", JSON.toJSONString(product));

        // 模拟请求延迟2s
        try {
            Thread.sleep(20001);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 生成商品信息保存
        Order order = new Order();
        order.setNumber(1);
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setUid(1);
        order.setUsername("陈家宝");

        // 暂时注释,避免产生大量垃圾数据
        // this.orderService.createOrder(order);
        log.info("订单信息保存成功。内容为:{}", JSON.toJSONString(order));

        return order;
    }

    @RequestMapping("/order/message")
    public String message() {
        return "模拟高并发";
    }

}

2.2、修改tomcat线程数

修改服务消费者(这里为订单微服务)的application.yml文件,将tomcat的最大线程数修改为10,方便测试。

server:
  port: 8091
  tomcat:
    max-threads: 10

2.3、使用JMeter对接口进行压力测试

2.3.1、下载JMeter

下载地址https://jmeter.apache.org/

2.3.2、修改配置,并启动软件

进入bin目录,修改jmeter.properties文件中的语言支持为language=zh_CN,然后双击jmeter.bat启动。

2.3.3、添加线程组

2.3.4、添加Http取样

2.3.5、启动压测,浏览器访问message接口观察效果

2.4、结论

测试发现,message接口访问变得响应缓慢。意味着由于order方法囤积了大量请求,导致message方法的访问也出现了问题,这就是服务雪崩的雏形。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐