发送Http请求的HttpClientUtil工具
代码如下:
/*** @author xuan* @create 2023/11/6*/
public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();// http客户端private static CloseableHttpClient httpClient;static {//连接池最大连接数connMgr.setMaxTotal(200);//每个路由的最大连接数connMgr.setDefaultMaxPerRoute(20);//连接的过期时间connMgr.setValidateAfterInactivity(1000*60);}public static void post(String url, Map<String, String> params) {//这里之所以有两个检查是否为null的语句,主要是支持高并发的,比如现在一次性的有很多个请求过来,首先这些请求先判断第一个if,发现httpClient == null//是成立的,接着这些请求就会跑到synchronized关键字的上面,然后因为同步原因,第一个请求会先进去,进去之后发现httpClinet == null仍然是成立的,接着//当前请求就去给httpClient赋值;然后当前请求走出代码同步块,接着第二个请求会进去,发现httpClient已经不等于空了,所以就不会重新给httpClient进行赋值了,//因此第二个null是很有必要写的,可以提升代码的效率if(httpClient == null) {synchronized(HttpUtil.class) {if(httpClient == null) {httpClient = HttpClients.custom().setConnectionManager(connMgr).build();}}}//创建Post请求HttpPost httpPost = new HttpPost(url);//设置参数List<NameValuePair> formParams = new ArrayList<>();for(Map.Entry<String, String> entry : params.entrySet()) {String name = entry.getKey();String value = entry.getValue();formParams.add(new BasicNameValuePair(name, value));}UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, StandardCharsets.UTF_8);httpPost.setEntity(entity);try {CloseableHttpResponse response = httpClient.execute(httpPost);System.out.println(response);} catch (IOException e) {throw new RuntimeException(e);} finally {httpPost.releaseConnection();}}public static void main(String[] args) {Map<String, String> params = new HashMap<>();params.put("rid", "666");params.put("level", "666");params.put("content", "666");params.put("server", "666");params.put("logType", "666");params.put("sid", "666");params.put("time", new Date().getTime() + "");HttpUtil.post("http://192.168.10.232:9898/addOne", params);}
}
注意这里有一个http请求连接池,功能和数据库连接池的功能差不多,都是用来提高连接效率的。如下图:
使用http请求连接池,可以把一些http连接放到池子里面,这样我们就不用频繁的进行http连接和断开http连接了,需要的时候直接去连接池里面去拿,用完之后就放回到池子里面。
为什么频繁的进行http连接和断开http连接消耗性能呢?
- 避免反复的三次握手和四次握手。长连接的建立需要进行三次握手,而连接的释放需要进行四次握手,这是发生在系统层面的两个动作,对于单条连接来说耗时微乎其微,但在高吞吐场景时,耗时则不能忽略。
执行main方法,如下图:
返回的状态码是200,插入成功!