feign使用http client配置見上文:Feign http 請求跟蹤apache
至此遇到問題json
1,feign 使用Apache Http Client 亂碼app
2,默認線程池管理不符合業務要求ide
解決方法:性能
1,feign 使用Apache Http Client 亂碼ui
記得某issue有對Content-Type作兼容,配置了下確實能夠this
配置feign 攔截器,設置Content-type線程
@Configuration public class FeignHeaderInterceptor implements RequestInterceptor { RequestContext context = RequestContext.getContext(); requestTemplate.header("Content-Type", "application/json; charset=UTF-8"); }
2,默認線程池管理不符合業務要求get
默認feign http client配置類HttpClientFeignLoadBalancedConfiguration,對於一些主機鏈接配置默認值,性能較差的系統不太適合,須要重寫下it
@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; } }