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的更多相关文章

  1. Using HttpClient properly to avoid CLOSE_WAIT TCP connections

    Apache的HttpComponent组件,用的人不在少数.但是能用好的人,却微乎其微,为什么?很简单,TCP里面的细节实现不是每个人都能捕获到的(细节是魔鬼),像并发请求控制&资源释放,N ...

  2. Web API的接口访问安全性

    使用签名获取Token 首先我们自定义appkey.appSecret.可用GUID随机生成,AppSecret要不定期更换.然后放到配置文件中. Appkey=1AF62C68-B970-46E7- ...

  3. httpclient httpclient连接回收

    httpclient连接释放 httpClient必须releaseConnection,但不是abort.因为releaseconnection是归还连接到到连接池,而abort是直接抛弃这个连接, ...

随机推荐

  1. 使用ftrace查找Kernel启动阶段的延时原因

    查找Kernel启动阶段的延时原因 1.确保内核配置了如下选项 CONFIG_FTRACE: "Tracers" CONFIG_FUNCTION_TRACER: "Ker ...

  2. 《An Image Patch is a Wave: Phase-Aware Vision MLP》结构图+个人做的验证实验

    今天阅读了<An Image Patch is a Wave: Phase-Aware Vision MLP>这篇论文,根据代码绘制的它的结构图.如果有错误,还请指正. Wave_MLP_ ...

  3. iOS中RunLoop和线程的关系

    RunLoop又叫运行循环,主要用来管理线程.一个线程对应一个RunLoop,一个RunLoop又有五种模式.只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出.其他线程的 ...

  4. 云原生爱好者周刊:mist.io 开源多云管理平台

    开源项目推荐 Mist Mist 是一个开源的多云管理平台,它提供了跨云和内部基础设施的可观测性,以及生命周期管理能力.同时还提供了一些功能更强大的商业组件. rga rga 是一个类似于 grep ...

  5. 云原生爱好者周刊:利用 DNS 计算圆周率

    开源项目推荐 dns.toys dns.toys 是一个比较有创意的 DNS 服务器,它利用 DNS 协议提供了很多非常有趣的功能和服务.例如查询时间.天气.圆周率.单位换算等等. Submarine ...

  6. AOT漫谈专题(第六篇): C# AOT 的泛型,序列化,反射问题

    一:背景 1. 讲故事 在 .NET AOT 编程中,难免会在 泛型,序列化,以及反射的问题上纠结和反复纠错尝试,这篇我们就来好好聊一聊相关的处理方案. 二:常见问题解决 1. 泛型问题 研究过泛型的 ...

  7. numpy的一些基本操作

    文章目录 1.numpy数组的多种创建方式 1.1使用np.array()创建 1.2使用plt创建 1.3使用np的routine函数创建 2.numpy的常用属性 2.1shape 2.2ndim ...

  8. c++设计模式:设计原则

    c++设计八大原则(降低改变带来的代码修改) 一.依赖倒置原则(DIP) 1.高层模块(稳定)不应该依赖于低层模块(变化),二者应该依赖于抽象(更稳定) <高层模块 包括 低层模块所依赖的抽象, ...

  9. 2024ICPC 武汉邀请赛题解 更新至 8 题

    目录 Preface Problem I. 循环苹果串 Problem K. 派对游戏 Problem B. 无数的我 Problem F. 订制服装 Problem E. 回旋镖 Problem D ...

  10. 【已解决】无法打开受保护的PDF

    笔者在使用三星笔记导入PDF时提示"无法打开受保护的PDF",经查询需要使用在线破解工具来破解,重新下载就可以了 方法一:在线破解网站(适用于文件较小的PDF) 这里提供两个破解在 ...