返回

多用户同时在线:httpclient如何应对?

见解分享

在使用httpclient做接口相关测试的过程中,遇到过一个障碍:如何处理多用户同时登陆。之前用户身份凭证一般都是做公参里面处理或者在header中单独定义一个或者几个字段,cookie都是使用httpclient自带的管理器自动管理的。

后来用户凭证存到了cookie里,这里就遇到了一个问题,在进行并发请求的时候,每个线程都是独立的,相互之间不共享cookie,那么如何才能保证每个用户都能获取到自己的cookie呢?

一个办法就是利用HttpClient的线程安全特性,让多个线程共享同一个HttpClient对象,这样就可以保证每个线程都能获取到自己的cookie。

HttpClient httpClient = new HttpClient();
//设置cookie策略
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
//设置用户凭证
httpClient.getState().addCookie(new BasicClientCookie("username", "zhangsan"));
httpClient.getState().addCookie(new BasicClientCookie("password", "123456"));

另一个办法是利用httpclient的线程池来管理线程,这样就可以保证每个线程都能获取到自己的HttpClient对象。

ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            HttpClient httpClient = new HttpClient();
            //设置cookie策略
            httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
            //设置用户凭证
            httpClient.getState().addCookie(new BasicClientCookie("username", "zhangsan"));
            httpClient.getState().addCookie(new BasicClientCookie("password", "123456"));

            //执行请求
            HttpGet httpGet = new HttpGet("http://localhost:8080/login");
            HttpResponse httpResponse = httpClient.execute(httpGet);
        }
    });
}
executorService.shutdown();

除了上面两种方法之外,还可以利用负载均衡器来分发请求,这样就可以将请求均匀地分配到不同的服务器上,避免单台服务器压力过大。

负载均衡器 --> 服务器1 --> 用户1
负载均衡器 --> 服务器2 --> 用户2
负载均衡器 --> 服务器3 --> 用户3

总之,httpclient在处理多用户同时在线时,可以通过利用cookie和session实现用户身份验证、采用多线程和负载均衡提高并发性能等方法来解决问题。