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. 使用zipkin配置spring boot的链路器(httpclient、restTemplate)

    一.首先导入zipkin需要的依赖 <!--zipkin-brave start--> <dependency> <groupId>io.zipkin.brave& ...

  2. 东方通信基于 KubeSphere 的云计算落地经验

    作者:周峰 吴昌泰 公司简介 东方通信股份有限公司(以下简称"东方通信")创立于 1958 年,是一家集硬件设备.软件.服务为一体的整体解决方案提供商.公司于 1996 年成功改制 ...

  3. 如何使用 VuePress 搭建博客网站并 Vercel 部署

    先来看一下网站截图: 快速上手 1.创建并进入一个新目录 mkdir vuepress-starter && cd vuepress-starter 2.使用你喜欢的包管理器进行初始化 ...

  4. AWS服务 简介

    1 Amazon Elastic Compute Cloud (Amazon EC2) 是一种提供可调节计算容量的 Web 服务 – 简单来说,就是 Amazon 数据中心里的服务器 – 您可以使用它 ...

  5. 串(C语言实现)

    文章目录 1.串的数据类型定义 数据对象 1.1 数据关系 1.2 基本操作 2.串的存储结构 2.1 串的顺序存储 2.2 串的链式存储 3.串的模式匹配算法 3.1BF 算法 3.2KMP 算法 ...

  6. BasicDataSourceFactory类简介

    BasicDataSourceFactory实现了javax.naming.spi.ObjectFactory接口.   因此,先从ObjectFactory学习.  一.ObjectFactory接 ...

  7. [Apache Doris] Apache Doris 架构及代码目录解读

    一.系统架构 Doris是一个MPP的OLAP系统,主要整合了Google Mesa(数据模型),Apache Impala(MPP Query Engine)和Apache ORCFile (存储格 ...

  8. ubuntu环境安装街机风格的太空飞船游戏(2D飞机射击游戏)游戏——Chromium_B.S.U.

    相关: https://en.wikipedia.org/wiki/Chromium_B.S.U. https://manpages.ubuntu.com/manpages/focal/en/man6 ...

  9. 2-2 C++变量

    目录 2.2.1 变量定义:列表初始化(list initialization) 2.2.2 变量的定义与声明 C++分离式编译 定义与声明 2.2.3 C++变量命名 2.2.4 变量名的作用域(s ...

  10. 服务器cli模式下的定时器

    有时候需要一部分后台业务异步的处理,比如处理redis队列啊,处理mysql统计啊,数据同步啊,这种长时间任务,但是又需要每段时间去看看的,发现linux cron最小只能支持每分钟的任务 分 时 天 ...