HttpClient代理IP及设置连接读取超时

博客内容介绍了HttpClient中代理IP的类型,包括透明代理、匿名代理、混淆代理和高匿代理,详细解释了各类代理的工作原理,并强调了高匿代理在保护用户IP方面的优势。同时,提到了设置连接和读取超时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、不废话,上代码:

public static void main(String[] args) throws Exception {
		CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建HttpClient实例
		HttpGet httpGet = new HttpGet("http://www.tuicool.com"); // 创建Httpget实例
		//设置Http报文头信息
		httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0");
		HttpHost httoHost = new HttpHost("113.2.63.7",8118);//代理Ip
		//RequestConfig requestConfig = RequestConfig.custom().setProxy(httoHost).build();
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(10000)//设置连接超时时间
				.setSocketTimeout(10000)//设置读取超时时间
				.setProxy(httoHost)//设置代理
				.build();
		httpGet.setConfig(requestConfig);
		CloseableHttpResponse response = null;
		response = httpClient.execute(httpGet); // 执行http get请求
		HttpEntity httpEntity = response.getEntity(); // 获取返回实体
		String web = EntityUtils.toString(httpEntity, "utf-8"); // 解析实体
		System.out.println("网页内容是:");
		System.out.println(web);
		response.close(); // 关闭response
		httpClient.close(); // 关闭HttpClient实体
}


2、关于IP代理

IP代理分为:透明代理、匿名

<think>我们正在配置RestHighLevelClient,需要设置连接超时时间和最大连接数。根据引用[2]和引用[4],我们可以通过配置RestClientBuilder来实现。在引用[2]中,我们看到了单机配置的基本方式,而引用[4]中提到了连接超时时间(connect-timeout)和套接字超时时间(socket-timeout)的配置,但未提及最大连接数。实际上,RestHighLevelClient底层使用Apache HttpClient,因此我们需要通过HttpClientConfigCallback来配置连接池和超时时间。 步骤: 1. 创建RestClientBuilder,通过RestClient.builder()传入一个或多个HttpHost。 2. 使用setHttpClientConfigCallback方法设置HttpClient的配置,其中我们可以自定义RequestConfig(设置连接超时读取超时等)和连接管理器(设置最大连接数)。 具体配置项: - 连接超时connectTimeout):建立TCP连接超时时间。 - 套接字超时(socketTimeout):等待数据的超时时间(即服务器响应时间)。 - 连接请求超时connectionRequestTimeout):从连接池获取连接超时时间。 - 最大连接数:连接池的最大连接数。 在HttpClientConfigCallback中,我们可以使用HttpClientBuilder来设置这些参数。 参考引用[3]中设置RestTemplate超时时间的思路(虽然对象不同,但超时设置原理类似),以及引用[4]中提到的超时参数,我们可以这样配置: 配置示例: 首先,我们需要引入Apache HttpClient的依赖(如果还没有的话),因为RestHighLevelClient底层使用它。 然后,在配置类中,我们可以这样写: ```java import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class EsConfig { // 从配置文件中读取这些值 private String host = "localhost"; private int port = 9200; private String scheme = "http"; // 连接超时时间(毫秒) private int connectTimeout = 1000; // 套接字超时时间(毫秒) private int socketTimeout = 30000; // 连接请求超时时间(毫秒) private int connectionRequestTimeout = 500; // 最大连接数 private int maxConnTotal = 30; @Bean public RestHighLevelClient restHighLevelClient() { // 创建连接池管理器 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); // 设置最大连接connectionManager.setMaxTotal(maxConnTotal); // 设置每个路由(即每个目标主机)的最大连接数(默认是2,可以根据需要设置connectionManager.setDefaultMaxPerRoute(10); RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, scheme)) .setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setConnectionManager(connectionManager); // 设置超时时间 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(connectTimeout) .setSocketTimeout(socketTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .build(); return httpClientBuilder.setDefaultRequestConfig(requestConfig); }); return new RestHighLevelClient(builder); } } ``` 注意: - 这里我们使用了`PoolingHttpClientConnectionManager`来管理连接池,并设置了最大连接数(`setMaxTotal`)和每个路由的最大连接数(`setDefaultMaxPerRoute`)。 - 通过`RequestConfig`设置三种超时时间。 - 这些超时时间和连接数的具体值应该根据实际需求从配置文件(如application.yml)中读取,这里为了清晰直接写成了常量。 在Spring Boot的application.yml中,我们可以这样配置: ```yaml spring: elasticsearch: rest: ip: localhost port: 9200 scheme: http connect-timeout: 1000 socket-timeout: 30000 connection-request-timeout: 500 max-conn-total: 30 max-conn-per-route: 10 ``` 然后在配置类中使用@Value注入这些值。 但是请注意,引用[4]中使用了`spring.data.elasticsearch`前缀,而引用[2]使用了`spring.elasticsearch.rest`。我们可以选择其中一个,但需要保持配置文件中前缀的一致性。 修改配置类,使用@Value注入: ```java import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class EsConfig { @Value("${spring.elasticsearch.rest.ip}") private String ip; @Value("${spring.elasticsearch.rest.port}") private int port; @Value("${spring.elasticsearch.rest.scheme}") private String scheme; @Value("${spring.elasticsearch.rest.connect-timeout}") private int connectTimeout; @Value("${spring.elasticsearch.rest.socket-timeout}") private int socketTimeout; @Value("${spring.elasticsearch.rest.connection-request-timeout}") private int connectionRequestTimeout; @Value("${spring.elasticsearch.rest.max-conn-total}") private int maxConnTotal; @Value("${spring.elasticsearch.rest.max-conn-per-route}") private int maxConnPerRoute; @Bean public RestHighLevelClient restHighLevelClient() { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(maxConnTotal); connectionManager.setDefaultMaxPerRoute(maxConnPerRoute); RestClientBuilder builder = RestClient.builder(new HttpHost(ip, port, scheme)) .setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setConnectionManager(connectionManager); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(connectTimeout) .setSocketTimeout(socketTimeout) .setConnectionRequestTimeout(connectionRequestTimeout) .build(); return httpClientBuilder.setDefaultRequestConfig(requestConfig); }); return new RestHighLevelClient(builder); } } ``` 这样,我们就完成了RestHighLevelClient的连接超时时间和最大连接数的配置。 注意:在Spring Boot 2.2.x及以上版本,官方推荐使用`RestHighLevelClient`,但请注意,在Spring Boot 2.3.x开始,官方已经将`RestHighLevelClient`标记为过时,并推荐使用新的`ElasticsearchRestTemplate`和`ElasticsearchOperations`。不过,如果仍需要使用`RestHighLevelClient`,以上配置仍然适用。 另外,确保在pom.xml中引入了Apache HttpClient的依赖(通常`elasticsearch-rest-high-level-client`会传递依赖HttpClient,但为了版本兼容,建议检查): ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> <!-- 版本根据实际情况调整 --> </dependency> ``` 如果项目中已经引入了,则无需重复引入。 总结:通过自定义`RestClientBuilder`,使用`setHttpClientConfigCallback`方法配置连接池和超时参数,可以满足设置连接超时时间和最大连接数的需求。</think>### RestHighLevelClient 配置连接超时时间和最大连接数 要配置 RestHighLevelClient 的连接超时时间和最大连接数,需要通过 `RestClientBuilder` 自定义底层 HTTP 客户端配置。以下是完整解决方案: #### 1. 配置类实现(Java 代码) ```java import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ElasticsearchConfig { @Value("${spring.elasticsearch.host}") private String host; @Value("${spring.elasticsearch.port}") private int port; @Value("${spring.elasticsearch.connect-timeout:1000}") // 默认1秒 private int connectTimeout; @Value("${spring.elasticsearch.connection-request-timeout:500}") // 默认0.5秒 private int connectionRequestTimeout; @Value("${spring.elasticsearch.socket-timeout:30000}") // 默认30秒 private int socketTimeout; @Value("${spring.elasticsearch.max-conn-total:100}") // 默认最大连接数100 private int maxConnTotal; @Value("${spring.elasticsearch.max-conn-per-route:10}") // 默认单路由连接数10 private int maxConnPerRoute; @Bean public RestHighLevelClient restHighLevelClient() { // 1. 创建连接池管理器 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(maxConnTotal); // 最大连接connectionManager.setDefaultMaxPerRoute(maxConnPerRoute); // 单路由最大连接数 // 2. 配置超时参数 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(connectTimeout) // 连接超时 .setConnectionRequestTimeout(connectionRequestTimeout) // 请求超时 .setSocketTimeout(socketTimeout) // 数据传输超时 .build(); // 3. 构建RestClientBuilder RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig) ); return new RestHighLevelClient(builder); } } ``` #### 2. application.yml 配置示例 ```yaml spring: elasticsearch: host: 192.168.1.100 port: 9200 connect-timeout: 1000 # 连接超时时间(ms) socket-timeout: 30000 # 数据传输超时(ms) connection-request-timeout: 500 # 请求超时(ms) max-conn-total: 200 # 最大连接数 max-conn-per-route: 20 # 单路由最大连接数 ``` #### 关键配置说明: 1. **连接超时时间**: - `connect-timeout`:建立TCP连接的最长等待时间(单位:毫秒) - 建议值:`500-5000ms`,生产环境推荐 `1000ms`[^1][^4] 2. **最大连接数**: - `max-conn-total`:连接池最大连接数 - `max-conn-per-route`:单个ES节点的最大连接数 - 建议比例:`max-conn-per-route = max-conn-total / 节点数`[^2] 3. **其他关键参数**: - `connection-request-timeout`:从连接池获取连接的等待时间 - `socket-timeout`:两次数据传输间的最大间隔时间[^4] > **性能调优建议**: > - 高并发场景:建议 `max-conn-total ≥ 100`,`max-conn-per-route ≥ 10` > - 超时设置:生产环境 `socket-timeout` 应 ≥ 30s,避免大数据查询超时[^4] > - 连接泄漏防护:建议添加 `ConnectionEvictionPolicy` 定期检测空闲连接 #### 3. 验证配置生效 ```java RestHighLevelClient client = ... // 获取Bean CloseableHttpClient httpClient = (CloseableHttpClient) client.getLowLevelClient().getHttpClient(); // 验证连接池配置 PoolingHttpClientConnectionManager mgr = (PoolingHttpClientConnectionManager) httpClient.getConnectionManager(); System.out.println("最大连接数: " + mgr.getMaxTotal()); System.out.println("单节点最大连接: " + mgr.getDefaultMaxPerRoute()); ``` #### 注意事项: 1. 需要添加 Apache HttpClient 依赖: ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> ``` 2. 在 Spring Boot 2.3+ 中建议使用官方新客户端 `ElasticsearchRestTemplate`[^4] 3. 连接池监控:建议通过 JMX 监控连接池状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值