我必须不断检查成千上万的代理服务器。
为了加快速度,我正在考虑创建一批大小为 N(比如 50)并同时向它们发送请求。每个代理服务器都有唯一的 IP/端口和用户名/密码验证。
由于我正在检查代理,我将配置请求以使用给定的代理并向目标站点发送请求并测量响应。
以下是使用 Apache 客户端文档中的身份验证代理的示例:
public static void main(String[] args)throws Exception {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("localhost", 8889),
new UsernamePasswordCredentials("squid", "nopassword"));
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
try {
httpclient.start();
HttpHost proxy = new HttpHost("localhost", 8889);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
HttpGet httpget = new HttpGet("https://httpbin.org/");
httpget.setConfig(config);
Future<HttpResponse> future = httpclient.execute(httpget, null);
HttpResponse response = future.get();
System.out.println("Response: " + response.getStatusLine());
System.out.println("Shutting down");
} finally {
httpclient.close();
}
}
如您所见,如果您使用的是经过身份验证的代理,则需要在客户端本身中提供凭据。这意味着如果我同时检查 50 个代理服务器,那么我必须为每个代理服务器创建一个新客户端。这意味着如果我只使用多线程解决方案,请求将不会并发并且更好。
问题是,如果我使用多线程,那么我会给服务器带来过多的负载,因为大多数线程会阻塞 I/O。并发非阻塞 I/O 更适合此类挑战。
如果我必须为每个代理服务器创建一个客户端,如何同时检查多个经过身份验证的代理服务器?