HttpClientManager
HttpClientManger
package com.gateway.http.client; import com.fasterxml.jackson.core.type.TypeReference;
import com.apollo.common.http.HttpMethod;
import com.apollo.gateway.common.HttpConstant;
import com.apollo.gateway.util.JsonUtil;
import okhttp3.*;
import okhttp3.internal.Util;
import okhttp3.logging.HttpLoggingInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
*
* @author muzhi
* @date 2022-11-21 19:17:28
*/
public class HttpClientManager {
private static final Logger log = LoggerFactory.getLogger(HttpClientManager.class);
private static final Map<Long, OkHttpClient> map = new HashMap<>();
private static final Long TIMEOUT = 5000L;
private <T> T request(HttpMethod httpMethod, OkHttpClient httpClient, final String url, Map<String, String> header, final Object param,
final TypeReference<T> typeReference) throws IOException {
final Request.Builder builder = new Request.Builder();
//add header
if(header != null && !header.isEmpty()){
header.forEach((k, v) -> {
if(v != null){
builder.addHeader(k, v);
}
});
} switch (httpMethod){
case POST:
if(param != null){
if(param instanceof byte[]){
builder.post(new ByteRequestBody((byte[]) param));
} else {
String content = JsonUtil.toJson(param);
RequestBody requestBody = RequestBody.create(HttpConstant.JSON_MEDIA_TYPE, content);
builder.post(requestBody);
}
} else {
builder.post(RequestBody.create(HttpConstant.JSON_MEDIA_TYPE, "{}"));
}
builder.url(url);
break;
case GET:
StringBuilder str = new StringBuilder(url);
if(param != null && param instanceof Map){
if(!url.contains("?")){
str.append("?");
}
Map body = (Map) param;
if(body != null && !body.isEmpty()){
StringJoiner joiner = new StringJoiner("", "&", "");
body.forEach((k, v) -> {
joiner.add(k + "=" + v);
});
str.append("&").append(joiner.toString());
}
}
builder.url(str.toString()).get();
break;
default:
throw new RuntimeException("request method not supported");
} Response execute = httpClient.newCall(builder.build()).execute();
String response = execute.body().string();
if(typeReference == null){
return (T) response;
}
return JsonUtil.readValue(response, typeReference);
} private <T> T request(HttpMethod httpMethod, final String accessCode, final String url, final Object param,
final TypeReference<T> typeReference) throws IOException {
OkHttpClient httpClient = map.computeIfAbsent(TIMEOUT, k -> buildHttpClient());
Map<String, String> header = new HashMap<>();
return request(httpMethod, httpClient, url, header, param, typeReference);
} // public <T> T post(final String accessCode, final String url, final Object param,
// final TypeReference<T> typeReference, Long timeout) throws IOException {
// return request(HttpMethod.POST, accessCode, url, param, typeReference, timeout);
// } public <T> T post(final String accessCode, final String url, final Object param,
final TypeReference<T> typeReference) throws IOException {
return request(HttpMethod.POST, accessCode, url, param, typeReference);
} private OkHttpClient buildHttpClient() {
try {
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
// add timeout
okHttpBuilder
.readTimeout(60_000, TimeUnit.MILLISECONDS)
.connectTimeout(60_000, TimeUnit.MILLISECONDS)
.callTimeout(60_000, TimeUnit.MILLISECONDS)
.connectionPool(new ConnectionPool(500, 5 * 60, TimeUnit.SECONDS)); // Install the all-trusting trust manager
//okHttpBuilder.addInterceptor(new RetryInterceptor(httpClientParam.getMaxRetry(), httpClientParam.getRetryInterval()));
configNoSSL(okHttpBuilder);
configDispatcher(okHttpBuilder);
configLogBody(okHttpBuilder, true);
return okHttpBuilder.build();
} catch (Exception e) {
log.error("buildHttpClient error", e);
}
return null;
} private void configDispatcher(final OkHttpClient.Builder okHttpBuilder) {
ThreadPoolExecutor executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<>(),
Util.threadFactory("lambada-OkHttp-Dispatcher", false)
);
Dispatcher dispatcher = new Dispatcher(executorService);
dispatcher.setMaxRequests(200);
dispatcher.setMaxRequestsPerHost(200);
okHttpBuilder.dispatcher(dispatcher);
} private static void configLogBody(OkHttpClient.Builder okHttpBuilder, boolean ignoreLargeContent) {
HttpLogger logger = new HttpLogger();
logger.setIgnoreLargeContent(ignoreLargeContent);
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(logger);
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpBuilder.addNetworkInterceptor(logInterceptor);
} private static void configNoSSL(OkHttpClient.Builder okHttpBuilder) throws KeyManagementException, NoSuchAlgorithmException {
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
okHttpBuilder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
okHttpBuilder.hostnameVerifier((hostname, session) -> true);
} private static final TrustManager[] trustAllCerts =
new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType) {
} @Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType) {
} @Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[] {};
}
}
};
}
HttpClientManager的更多相关文章
- Using HttpClient properly to avoid CLOSE_WAIT TCP connections
Apache的HttpComponent组件,用的人不在少数.但是能用好的人,却微乎其微,为什么?很简单,TCP里面的细节实现不是每个人都能捕获到的(细节是魔鬼),像并发请求控制&资源释放,N ...
- Web API的接口访问安全性
使用签名获取Token 首先我们自定义appkey.appSecret.可用GUID随机生成,AppSecret要不定期更换.然后放到配置文件中. Appkey=1AF62C68-B970-46E7- ...
- httpclient httpclient连接回收
httpclient连接释放 httpClient必须releaseConnection,但不是abort.因为releaseconnection是归还连接到到连接池,而abort是直接抛弃这个连接, ...
随机推荐
- eBPF 概述:第 1 部分:介绍
1. 前言 有兴趣了解更多关于 eBPF 技术的底层细节?那么请继续移步,我们将深入研究 eBPF 的底层细节,从其虚拟机机制和工具,到在远程资源受限的嵌入式设备上运行跟踪. 注意:本系列博客文章将集 ...
- 018 人生中第一次用 Python 写的一个小程序_猜年龄(再次强调,重视基础)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- Bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法 _2021-11-10
Bootstrap 栅栏布局中 col-xs-.col-sm-.col-md-.col-lg- 区别及使用方法 全文转自:https://www.cnblogs.com/tangbohu2008/p/ ...
- VMware安装Ubuntu操作系统 2024.9.27
1.安装 Ubuntu的官方网站是:https://www.ubuntu.com/download 点进去可以直接下载 文件下载会比较慢,我这点用了约5分钟 然后就可以打开vmware,选择: 就可以 ...
- github/gitee个人博客到底是什么一个运行原理?
本文主要讲的是GitHub.Gitee这样的代码存储网站上提供的个人博客建站的原理分析,需要注意的是,本文并不介绍GitHub.Gitee上建立个人blog的操作步骤,本文只介绍原理,不介绍实操步骤. ...
- 问题:深度学习时代的初期最为火热的AI安全问题已经很少有人讨论了,那么是不是已经解决该问题了呢?
答案: 先说结果,该问题并没有被解决. 之所以该问题已经不是最初的那么火热的讨论和研究热点了,其主要原因是大家发现这个神经网络在深度学习时代是十分的work的,虽然AI安全问题一直没有解决,但是比较发 ...
- 3.9 Linux查看目录中的文件(ls命令)
通过学习cd 和 pwd 命令,相信读者已经能够在庞大的 Linux 文件系统中,随心所欲地游荡并确定自己所在的位置了.本节继续来学习,如何知道某目录中存放了哪些文件或子目录. ls 命令,list ...
- 使用flask进行Mock Server模拟接口操作及问题解决
1.flask介绍 flask是一个轻量级的python web 微框架 2.Mock Server介绍 Mock Server是一个开源的模拟服务器,它可以定义和记录API交互,支持各种http方法 ...
- html代码新手教学
HTML 是超文本标记语言(HyperText Markup Language)的缩写,是用来描述网页结构的标记语言.在这篇教学中,我们将介绍一些 HTML 基础知识,帮助新手快速学习并掌握如何编写简 ...
- ubuntu界面文件夹出现了很多隐藏文件夹如何不显示
突然发现文件夹下很多隐藏文件夹都显示出来了,也不知道怎么弄得,想隐藏他们,百度提问无果,提到隐藏这种关键字全是ls这种让我终端查看文件列表. 自己仔细看了看文件夹资源管理器,发现有个按钮 就是这个选项 ...