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; } }
来源:oschina
链接:https://my.oschina.net/u/2408030/blog/3022597