Feign http 请求跟踪—乱码及连接池

痴心易碎 提交于 2019-12-04 19:46:26

 

feign使用http client配置见上文:Feign http 请求跟踪

 

至此遇到问题

1,feign 使用Apache Http Client 乱码

2,默认线程池管理不符合业务要求

 

解决方法:

1,feign 使用Apache Http Client 乱码

记得某issue有对Content-Type做兼容,配置了下确实可以

配置feign 拦截器,设置Content-type

@Configuration
public class FeignHeaderInterceptor implements RequestInterceptor {
    RequestContext context = RequestContext.getContext();
    requestTemplate.header("Content-Type", "application/json; charset=UTF-8");
}

2,默认线程池管理不符合业务要求

默认feign http client配置类HttpClientFeignLoadBalancedConfiguration,对于一些主机连接配置默认值,性能较差的系统不太适合,需要重写下

@Bean
@ConditionalOnMissingBean(HttpClientConnectionManager.class)
public HttpClientConnectionManager connectionManager(
      ApacheHttpClientConnectionManagerFactory connectionManagerFactory,
      FeignHttpClientProperties httpClientProperties) {
   final HttpClientConnectionManager connectionManager = connectionManagerFactory
         .newConnectionManager(httpClientProperties.isDisableSslValidation(), httpClientProperties.getMaxConnections(),
               httpClientProperties.getMaxConnectionsPerRoute(),
               httpClientProperties.getTimeToLive(),
               httpClientProperties.getTimeToLiveUnit(), registryBuilder);
   this.connectionManagerTimer.schedule(new TimerTask() {
      @Override
      public void run() {
         connectionManager.closeExpiredConnections();
      }
   }, 30000, httpClientProperties.getConnectionTimerRepeat());
   return connectionManager;
}

 

自定配置及客户端,系统采用ribbon对基本http 请求参数配置,这边直接复用

/**
 * feign http client 配置
 * @author yugj
 * @date 2019/3/14 上午11:09.
 */
@Configuration
public class FeignApacheHttpClientConfiguration {
​
    @Value("${ribbon.MaxConnectionsPerHost}")
    private Integer maxConnectionPerHost;
    @Value("${ribbon.MaxTotalConnections}")
    private Integer maxTotalConnections;
​
    @Value("${ribbon.ReadTimeout}")
    private Integer readTimeout;
    @Value("${ribbon.ConnectTimeout}")
    private Integer connectTimeout;
​
​
    private final ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(2,
            new BasicThreadFactory.Builder().namingPattern("apache-connection-manager-timer-%d").daemon(true).build());
​
    /**
     * 连接池管理配置
     * 替换HttpClientFeignLoadBalancedConfiguration HttpClientConnectionManager 默认配置
     * @return manager
     */
    @Bean
    public HttpClientConnectionManager httpClientConnectionManager() {
​
        final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.MILLISECONDS);
​
        connectionManager.setMaxTotal(maxTotalConnections);
        connectionManager.setDefaultMaxPerRoute(maxConnectionPerHost);
​
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                connectionManager.closeExpiredConnections();
            }
        }, 20000, FeignHttpClientProperties.DEFAULT_CONNECTION_TIMER_REPEAT,TimeUnit.MILLISECONDS);
​
​
​
        return connectionManager;
​
    }
​
    /**
     * http client bean
     * @param httpClientConnectionManager connectionManager
     * @return client
     */
    @Bean
    public CloseableHttpClient httpClient(HttpClientConnectionManager httpClientConnectionManager) {
​
        HttpClientBuilder builder = HttpClientBuilder.create().disableCookieManagement().useSystemProperties();
​
        //默认请求配置 一般不需配置,对应client在包装使用时会重写对应值
        RequestConfig defaultRequestConfig = RequestConfig.custom()
                .setConnectTimeout(connectTimeout)
                .setSocketTimeout(readTimeout)
                .build();
​
        CloseableHttpClient httpClient = builder.
                setDefaultRequestConfig(defaultRequestConfig).
                setConnectionManager(httpClientConnectionManager).
                setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()).build();
​
        return httpClient;
​
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!