高并发模拟多个用户同时访问接口

前些天客户需要测试一下接口可以承受多大的并发量!!!

当时就想到了countDownLatch,就小小的提了一下意见就被安排到我的头上!

废话就不多说了(为了不浪费你们的时间,先说好这代码是测试单个接口或者方法的并发量的)。

先说思路,再上代码(整体代码在下边哟)

思路

先定义一个countDownLatch

  		//发令枪
        CountDownLatch countDownLatch = new CountDownLatch(10);

countDownLatch 就是一个发令枪,比如操场上的赛跑一样,十个运动员,要十个运动员全部到场才可以开始,每当到场一个运动员,需要等待的运动员数量就会少一个,当等待的运动员数量为0时。裁判员枪声一响,就开始赛跑了。

这里的运动员数量减一就要用的countDownLatch.countDown();这一个方法。

那么先到的运动员说:我为什么要等他们呢? 就因为countDownLatch.await();这一个方法。等待数量不为0时都需要在这里阻塞着等待着其他运动员。

然后把你所要测试的接口或者方法写在**countDownLatch.await()**下面就可以了。

思路就是这么个思路,中间还会用到线程池这些。

话不多说,直接贴代码!!!

图解

执行的顺序,代码在下边

代码

import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.concurrent.*;

public class hightConcurrent {
    static int num = 0;    //访问失败次数
    static int fwnum = 0;  // 总访问次数
    int ThreadNum = 100;   //定义线程数
    //    static List<Map<String,Object>> infences = new ArrayList<>();
    
    //发令枪
    CountDownLatch countDownLatch = new CountDownLatch(ThreadNum);

    public void runThread() {
        //定义线程池
        ExecutorService executorService = Executors.newFixedThreadPool(ThreadNum);
        for (int i = 0; i < ThreadNum; i++) {
            executorService.submit(buildThread());
        }
    }

    public Thread buildThread() {
        //创建线程
        Thread thread = new Thread(new Runnable() {
            public void run() {
                synchronized (countDownLatch) {  //这一步不知道有没有必要,但是我还是加了
                    //发令枪减1
                    countDownLatch.countDown();
                }

                try {
                    System.out.println("线程:" + Thread.currentThread().getName() + "准备");
                    //线程阻塞
                    countDownLatch.await();
                    //这一步是调用线上的接口,发送HTTP请求    127.0.0.1可以换成你的ip地址     post是我的请求方式
                    Object appectContext = appectContext("http://127.0.0.1:9300/related/game/getFeatured", "post");
                    fwnum++;       //访问的总次数
                    if (appectContext == null) {
                        num++;     //访问失败的次数
                    }
                    System.out.println("接受的值" + appectContext);
                    System.out.println("错误次数" + num);
                    System.out.println("总次数" + fwnum);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        return thread;
    }

    public static void main(String[] args) {
        hightConcurrent h = new hightConcurrent();
        h.runThread();
    }


    public Object appectContext(String url, String states) {
        // 配置请求信息(请求时间)
        RequestConfig rc = RequestConfig.custom().setSocketTimeout(5000)
                .setConnectTimeout(5000).build();
        // 获取使用DefaultHttpClient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 返回结果
        String result = null;
        if (url != null) {   //请求路径不是null
            if (states.equals("post")) {   //post请求
                //System.out.println("post请求");
                HttpPost httpPost = new HttpPost(url);    //这些post请求和get请求我就不多说了   json格式的参数自己在网上搜一搜
                httpPost.setConfig(rc);
                try {
                    CloseableHttpResponse response = httpclient.execute(httpPost);
                    HttpEntity entity = response.getEntity();
                    result = EntityUtils.toString(entity, "UTF-8");
                    return result;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else if (states.equals("get")) {    //get请求
                //System.out.println("get请求");
                HttpGet httpGet = new HttpGet(url);
                httpGet.setConfig(rc);
                try {
                    CloseableHttpResponse response = httpclient.execute(httpGet);
                    return response;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else { 
                System.out.println("请求失败");
            }
        } else {     //传的路径是null
            System.out.println("路径是null");
        }
        return null;
    }
}

效果图

在这里插入图片描述

这就是一个完整的测试流程!

主要是要理解CountDownLatch,这个就很好写了!!

当然还有其他方法了,这只是一个省事的方法,如果有错误的地方还请指点一二。
不要批评我,我不接受批评,如果你批评我,那我就生气。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45729937/article/details/107234931
今日推荐