apache httpclient速成

2024-08-25 22:04
文章标签 apache httpclient 速成

本文主要是介绍apache httpclient速成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录标题

  • 快速使用
  • 连接池
    • 参数
      • 连接池状态
      • 清除闲置连接evictIdleConnections
      • 删除过期连接 timeToLive 和evictExpiredConnections
  • 注意释放内存
    • 关闭流
  • http和netty的关系

导入依赖

     <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.1</version></dependency>

快速使用

不关注其他,只需要发起请求,然后收到即可:

        CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建clientHttpPost request = new HttpPost("https://www.baidu.com/"); // 请求信息request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");RequestConfig config =RequestConfig.custom().setResponseTimeout(5000, TimeUnit.MILLISECONDS).build();request.setConfig(config); // 设置连接超时等参数// 发起调用String response = httpClient.execute(request, new HttpClientResponseHandler<String>() {@Overridepublic String handleResponse(ClassicHttpResponse classicHttpResponse) throws HttpException, IOException {System.out.println(classicHttpResponse.getCode());HttpEntity entity = classicHttpResponse.getEntity();InputStream content = entity.getContent();return EntityUtils.toString(entity);}});System.out.println(response);

连接池

http的连接池有什么用?
主要好处在于连接复用,减少创建/销毁 tcp 连接的开销(因为三次握手和四次挥手)。

需要注意的是:
1.http连接池不是万能的,过多的长连接会占用服务器资源,导致其他服务受阻
2.http连接池只适用于请求是经常访问同一主机(或同一个接口)的情况下
3.并发数不高的情况下资源利用率低下
4.httpclient是一个线程安全的类,没有必要由每个线程在每次使用时创建,全局保留一个即可。
比如:

    PoolingHttpClientConnectionManager poopManager = new PoolingHttpClientConnectionManager();poopManager.setMaxTotal(5); // 设置连接池最大连接数poopManager.setDefaultConnectionConfig( // 为所有路由设置连接参数ConnectionConfig.custom().setConnectTimeout(1000, TimeUnit.MILLISECONDS).setSocketTimeout(1000, TimeUnit.MILLISECONDS).build());poopManager.setMaxPerRoute( // 单独为一个路由设置最大连接数new HttpRoute(new HttpHost(InetAddress.getByName("www.baidu.com"), 443)),1);CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(poopManager).build();

参数

用如下代码作为示例。设置了连接池最大连接数是20,每个路由最大连接是2。
代码一共有四个路由,每一个网站都用一个异步线程调用10次

package com.example.springbootproject.httpclient;import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.pool.PoolStats;import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class HttpUtil {public static final CloseableHttpClient httpClient;public static final PoolingHttpClientConnectionManager poolManager;static {poolManager = new PoolingHttpClientConnectionManager();poolManager.setDefaultMaxPerRoute(2);poolManager.setMaxTotal(20);httpClient = HttpClients.custom()// 设置连接池管理.setConnectionManager(poolManager).build();}public static void main(String[] args) {HttpUtil.execute("http://www.baidu.com");HttpUtil.execute("https://juejin.cn/");HttpUtil.execute("https://www.zhihu.com/hot");HttpUtil.execute("https://www.bilibili.com/?utm_source=gold_browser_extension");// 创建一个定时线程池,包含单个线程ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);// 安排任务在初始延迟后执行,然后每隔一定时间打印状态executor.scheduleAtFixedRate(() -> {HttpUtil.httpPoolStats();}, 0, 1, TimeUnit.SECONDS);}public static void execute(String url) {for (int i = 0; i < 10; i++) {ExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(() -> {HttpGet get = new HttpGet(url);CloseableHttpResponse response = null;try {Thread.sleep(1000);String execute = HttpUtil.httpClient.execute(get, new HttpClientResponseHandler<String>() {@Overridepublic String handleResponse(ClassicHttpResponse response) throws HttpException, IOException {return EntityUtils.toString(response.getEntity());}});} catch (Exception e) {throw new RuntimeException(e);}});}}public static void httpPoolStats() {// 获取所有路由的连接池状态PoolStats totalStats = poolManager.getTotalStats();System.out.println("Total status:" + totalStats.toString());}
}

连接池状态

PoolStats totalStats = poolManager.getTotalStats();打印出来是这样的[leased: 0; pending: 0; available: 0; max: 20]

  • leased:连接池正在使用的连接(Gets the number of persistent connections tracked by the connection manager currently being used to execute requests.The total number of connections in the pool is equal to {@code available} plus {@code leased})
  • pending:等待空闲连接的数量(Gets the number of connection requests being blocked awaiting a free connection. This can happen only if there are more worker threads contending for fewer connections.)
  • available:当前线程池空闲的连接数量(Gets the number idle persistent connections.)
  • max:最大允许的容量
    在这里插入图片描述
    可以看到,leased +available = 池子中的连接数。因为一共四个路由,每个路由最大可以有两个连接,所以一共是8个可用连接数。其中pending表示等待空闲的连接数量。

清除闲置连接evictIdleConnections

关闭闲置2s的连接
HttpClients.custom().evictIdleConnections(TimeValue.ofMilliseconds(2000))

或者自己开一个线程调用poolManager.closeIdle(TimeValue.ofMilliseconds(2000));
最终如下

在这里插入图片描述

删除过期连接 timeToLive 和evictExpiredConnections

timeToLive 的定义:
Defines the total span of time connections can be kept alive or execute requests.
timeToLive 推荐不设置值,使用默认即可。同时打开evictExpiredConnections,
这样会使用服务器返回的keepalive,只要在keepalive时间范围内,连接就不会关闭。


设置timetolive值
poolManager.setDefaultConnectionConfig( ConnectionConfig.custom().setTimeToLive(1000, TimeUnit.MILLISECONDS).build());
和打开删除过期的连接HttpClients.custom().evictExpiredConnections()

注意释放内存

关闭流

代码中有写到,接response转为字符串返回。其实这个entity.getContent()是一个流,需要被关闭。

  HttpEntity entity = classicHttpResponse.getEntity();String s = EntityUtils.toString(entity);

如何关闭?

  1. 手动关闭使用 EntityUtils.consume(entity);
  2. 实现一个HttpClientResponseHandler,就像我们上面中的那样。底层实现里面就已经调用过了。
    在这里插入图片描述

http和netty的关系

http是协议,netty是java的一个NIO的编程框架。比如使用netty我们搭建一个高性能的http 服务器,也可以用netty自定义协议通信。

参考:https://juejin.cn/post/7292029688998068243

这篇关于apache httpclient速成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106771

相关文章

Apache Tiles 布局管理器

陈科肇 =========== 1.简介 一个免费的开源模板框架现代Java应用程序。  基于该复合图案它是建立以简化的用户界面的开发。 对于复杂的网站,它仍然最简单,最优雅的方式来一起工作的任何MVC技术。 Tiles允许作者定义页面片段可被组装成在运行一个完整的网页。  这些片段,或Tiles,可以用于为了降低公共页面元素的重复,简单地包括或嵌入在其它瓦片,制定了一系列可重复使用

Apache HttpClient使用详解

转载地址:http://eksliang.iteye.com/blog/2191017 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟

开源Apache服务器安全防护技术精要及实战

Apache 服务简介   Web服务器也称为WWW服务器或HTTP服务器(HTTPServer),它是Internet上最常见也是使用最频繁的服务器之一,Web服务器能够为用户提供网页浏览、论坛访问等等服务。   由于用户在通过Web浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而Web在Internet上一推出就得到了爆炸性的发展。现在Web服务器已

项目一(一) HttpClient中的POST请求和GET请求

HttpClient中的POST请求和GET请求 一、HttpClient简述 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLU

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片 卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据 全连接层 —进行分类 输出层 —输出分类概率 4、基于LeNet

Java中WebService接口的生成、打包成.exe、设置成Windows服务、及其调用、Apache CXF调用

一、Java中WebService接口的生成: 1、在eclipse工具中新建一个普通的JAVA项目,新建一个java类:JwsServiceHello.java package com.accord.ws;import javax.jws.WebMethod;import javax.jws.WebService;import javax.xml.ws.Endpoint;/*** Ti

【虚拟机/服务器】XAMPP错误: Apache shutdown unexpectedly解决办法

XAMPP安装好之后启动,但有些用户在启动apache的时候会出现: 11:41:38 [Apache] Status change detected: running11:41:38 [Apache] Status change detected: stopped11:41:38 [Apache] Error: Apache shutdown unexpectedly.11:41:38

HttpClient的快速入门使用

目录 一、介绍 二、Get方式请求发送入门案例  实现步骤:  测试结果: 三、Post方式请求发送入门案例  实现步骤: 测试结果: 一、介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HttpCl

windows下安装apache及php需要注意的问题

1.php5.2版本不扩展模块顺序有问题 把php_mbstring.dll放在php_exif.dll上面,后者依赖前者

部署Apache网站

简易部署自己的apache网站 写在前面:先安装好mysql,再来搭建站点 1.安装php [root@localhost ~]# yum install php -y##安装了php,默认会和apache结合工作 2.创建文件编写php网页代码 [root@localhost ~]# vim /var/www/html/index.php ##创建php的代码,index.p