|  | @@ -0,0 +1,136 @@
 | 
											
												
													
														|  | 
 |  | +package com.tzld.piaoquan.recommend.server.util;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +import com.google.common.collect.Lists;
 | 
											
												
													
														|  | 
 |  | +import lombok.extern.slf4j.Slf4j;
 | 
											
												
													
														|  | 
 |  | +import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.HttpRequestInterceptor;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.client.config.RequestConfig;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.config.Registry;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.config.RegistryBuilder;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.conn.HttpClientConnectionManager;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.conn.socket.ConnectionSocketFactory;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.conn.socket.PlainConnectionSocketFactory;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.conn.ssl.NoopHostnameVerifier;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.impl.client.CloseableHttpClient;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.impl.client.HttpClientBuilder;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 | 
											
												
													
														|  | 
 |  | +import org.apache.http.ssl.SSLContexts;
 | 
											
												
													
														|  | 
 |  | +import org.slf4j.MDC;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +import javax.net.ssl.SSLContext;
 | 
											
												
													
														|  | 
 |  | +import java.security.KeyManagementException;
 | 
											
												
													
														|  | 
 |  | +import java.security.KeyStoreException;
 | 
											
												
													
														|  | 
 |  | +import java.security.NoSuchAlgorithmException;
 | 
											
												
													
														|  | 
 |  | +import java.util.List;
 | 
											
												
													
														|  | 
 |  | +import java.util.concurrent.ScheduledExecutorService;
 | 
											
												
													
														|  | 
 |  | +import java.util.concurrent.ScheduledThreadPoolExecutor;
 | 
											
												
													
														|  | 
 |  | +import java.util.concurrent.TimeUnit;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +@Slf4j
 | 
											
												
													
														|  | 
 |  | +public class HttpClientFactory {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    private static final ScheduledExecutorService SCHEDULED_CLOSED_EXECUTOR = new ScheduledThreadPoolExecutor(1,
 | 
											
												
													
														|  | 
 |  | +            new BasicThreadFactory.Builder().namingPattern("http conn-closed-thread-%s").priority(Thread.NORM_PRIORITY).daemon(false).build(), (r, e) -> log.error(" monitor push reject task error={}", e.toString()));
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    private static final List<HttpClientConnectionManager> HTTP_CLIENT_CONNECTION_MANAGERS = Lists.newArrayList();
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    static {
 | 
											
												
													
														|  | 
 |  | +        SCHEDULED_CLOSED_EXECUTOR.schedule(() -> HTTP_CLIENT_CONNECTION_MANAGERS.forEach(HttpClientConnectionManager::closeExpiredConnections), 5, TimeUnit.SECONDS);
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    private static HttpRequestInterceptor getInterceptor() {
 | 
											
												
													
														|  | 
 |  | +        HttpRequestInterceptor requestInterceptor = (request, context) -> {
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +                String missSpanId = MDC.get("missSpanId");
 | 
											
												
													
														|  | 
 |  | +                String missTraceId = MDC.get("request-id");
 | 
											
												
													
														|  | 
 |  | +                if (missTraceId != null && !"".equals(missTraceId.trim())) {
 | 
											
												
													
														|  | 
 |  | +                    request.setHeader("request-id", missTraceId);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +                if (missSpanId != null && !"".equals(missSpanId.trim())) {
 | 
											
												
													
														|  | 
 |  | +                    request.setHeader("missSpanId", missSpanId);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +            } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +                log.error(e.getMessage(), e);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  | 
 |  | +        return requestInterceptor;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +//    public String request(HttpRequestBase request) {
 | 
											
												
													
														|  | 
 |  | +//
 | 
											
												
													
														|  | 
 |  | +//        HttpEntity entity = null;
 | 
											
												
													
														|  | 
 |  | +//        try {
 | 
											
												
													
														|  | 
 |  | +//            log.info("request={}", JSONUtils.toJson(request));
 | 
											
												
													
														|  | 
 |  | +//            CloseableHttpResponse chr = request((HttpUriRequest) request);
 | 
											
												
													
														|  | 
 |  | +//            log.info("response={}", JSONUtils.toJson(chr));
 | 
											
												
													
														|  | 
 |  | +//            if (chr == null
 | 
											
												
													
														|  | 
 |  | +//                    || chr.getStatusLine() == null
 | 
											
												
													
														|  | 
 |  | +//                    || chr.getStatusLine().getStatusCode() != 200) {
 | 
											
												
													
														|  | 
 |  | +//                log.error("request failed http status exception!");
 | 
											
												
													
														|  | 
 |  | +//                return Strings.EMPTY;
 | 
											
												
													
														|  | 
 |  | +//            }
 | 
											
												
													
														|  | 
 |  | +//            entity = chr.getEntity();
 | 
											
												
													
														|  | 
 |  | +//            if (entity == null) {
 | 
											
												
													
														|  | 
 |  | +//                return Strings.EMPTY;
 | 
											
												
													
														|  | 
 |  | +//            }
 | 
											
												
													
														|  | 
 |  | +//            String content = EntityUtils.toString(entity, "UTF-8");
 | 
											
												
													
														|  | 
 |  | +//            log.info("response entity={}", JSONUtils.toJson(content));
 | 
											
												
													
														|  | 
 |  | +//        } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +//            log.error("request error url={}", request.getURI().getPath(), e);
 | 
											
												
													
														|  | 
 |  | +//        } finally {
 | 
											
												
													
														|  | 
 |  | +//            if (request != null) {
 | 
											
												
													
														|  | 
 |  | +//                request.abort();
 | 
											
												
													
														|  | 
 |  | +//            }
 | 
											
												
													
														|  | 
 |  | +//            EntityUtils.consumeQuietly(entity);
 | 
											
												
													
														|  | 
 |  | +//        }
 | 
											
												
													
														|  | 
 |  | +//    }
 | 
											
												
													
														|  | 
 |  | +//
 | 
											
												
													
														|  | 
 |  | +//
 | 
											
												
													
														|  | 
 |  | +//    public CloseableHttpResponse request(HttpUriRequest request) {
 | 
											
												
													
														|  | 
 |  | +//        try {
 | 
											
												
													
														|  | 
 |  | +//            CloseableHttpResponse execute = closeableHttpClient.execute(request);
 | 
											
												
													
														|  | 
 |  | +//            return execute;
 | 
											
												
													
														|  | 
 |  | +//        } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +//            log.error(String.format("http timeout request url = %s .", request.getURI().getPath()));
 | 
											
												
													
														|  | 
 |  | +//            throw new RuntimeException(e);
 | 
											
												
													
														|  | 
 |  | +//        }
 | 
											
												
													
														|  | 
 |  | +//    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    /**
 | 
											
												
													
														|  | 
 |  | +     * @param connectTimeout 连接超时时间 ms
 | 
											
												
													
														|  | 
 |  | +     * @param socketTimeout  读超时时间(等待数据超时时间)ms
 | 
											
												
													
														|  | 
 |  | +     * @param maxPerRoute    每个路由的最大连接数
 | 
											
												
													
														|  | 
 |  | +     * @param maxTotal       最大连接数
 | 
											
												
													
														|  | 
 |  | +     * @param retryCount     重试次数
 | 
											
												
													
														|  | 
 |  | +     * @return httpclient instance
 | 
											
												
													
														|  | 
 |  | +     */
 | 
											
												
													
														|  | 
 |  | +    public static CloseableHttpClient create(int connectTimeout, int socketTimeout, int maxPerRoute, int maxTotal,
 | 
											
												
													
														|  | 
 |  | +                                                int retryCount, int connectionWaitTimeout) {
 | 
											
												
													
														|  | 
 |  | +        try {
 | 
											
												
													
														|  | 
 |  | +            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout).setConnectionRequestTimeout(connectionWaitTimeout).build();
 | 
											
												
													
														|  | 
 |  | +            CloseableHttpClient client = HttpClientBuilder.create()
 | 
											
												
													
														|  | 
 |  | +                    .setDefaultRequestConfig(requestConfig)
 | 
											
												
													
														|  | 
 |  | +                    .setConnectionManager(createConnectionManager(maxPerRoute, maxTotal))
 | 
											
												
													
														|  | 
 |  | +                    .setRetryHandler(new DefaultHttpRequestRetryHandler(retryCount, false)).addInterceptorFirst(getInterceptor()).build();
 | 
											
												
													
														|  | 
 |  | +            return client;
 | 
											
												
													
														|  | 
 |  | +        } catch (Throwable e) {
 | 
											
												
													
														|  | 
 |  | +            log.error("create HttpPoolClient exception", e);
 | 
											
												
													
														|  | 
 |  | +            throw new RuntimeException("create HttpPoolClient exception");
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    private static PoolingHttpClientConnectionManager createConnectionManager(int maxPerRoute, int maxTotal) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
 | 
											
												
													
														|  | 
 |  | +        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true).build();
 | 
											
												
													
														|  | 
 |  | +        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
 | 
											
												
													
														|  | 
 |  | +                .register("http", PlainConnectionSocketFactory.getSocketFactory())
 | 
											
												
													
														|  | 
 |  | +                .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)).build();
 | 
											
												
													
														|  | 
 |  | +        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
 | 
											
												
													
														|  | 
 |  | +        cm.setDefaultMaxPerRoute(maxPerRoute);
 | 
											
												
													
														|  | 
 |  | +        cm.setMaxTotal(maxTotal);
 | 
											
												
													
														|  | 
 |  | +        HTTP_CLIENT_CONNECTION_MANAGERS.add(cm);
 | 
											
												
													
														|  | 
 |  | +        return cm;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +}
 |