Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4.3章,解决feign第一次调用失败的问题 #18

Closed
homeant opened this issue Oct 29, 2018 · 0 comments
Closed

4.3章,解决feign第一次调用失败的问题 #18

homeant opened this issue Oct 29, 2018 · 0 comments

Comments

@homeant
Copy link
Member

homeant commented Oct 29, 2018

我并没有看过书籍,我在这里说出我的疑问:

FeignAutoConfiguration的源代码中,明确指出

	// the following configuration is for alternate feign clients if
	// ribbon is not on the class path.
	// see corresponding configurations in FeignRibbonClientAutoConfiguration
	// for load balanced ribbon clients.
	@Configuration
	@ConditionalOnClass(ApacheHttpClient.class)
	@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
	@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
	protected static class HttpClientFeignConfiguration {

		@Autowired(required = false)
		private HttpClient httpClient;

		@Bean
		@ConditionalOnMissingBean(Client.class)
		public Client feignClient() {
			if (this.httpClient != null) {
				return new ApacheHttpClient(this.httpClient);
			}
			return new ApacheHttpClient();
		}
	}	

    @Configuration
	@ConditionalOnClass(OkHttpClient.class)
	@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
	@ConditionalOnProperty(value = "feign.okhttp.enabled", matchIfMissing = true)
	protected static class OkHttpFeignConfiguration {

		@Autowired(required = false)
		private okhttp3.OkHttpClient okHttpClient;

		@Bean
		@ConditionalOnMissingBean(Client.class)
		public Client feignClient() {
			if (this.okHttpClient != null) {
				return new OkHttpClient(this.okHttpClient);
			}
			return new OkHttpClient();
		}
	}
  1. 首先,cloud代码中先是使用的是httpClient,但是在下面的代码有又有只要存在okhttp包,启用okhttp,仔细看咱们的源码,可以看出,咱们引用了okhttp的包,所以是生效的,只要feign.okhttp.enabled=true那么,okhttp就是生效的,咱们的配置文件就没有作用了。
  2. 我们考虑首次为何会失败的问题,查阅代码能找到,feign默认的超时参数是这样的
private final int connectTimeoutMillis;
private final int readTimeoutMillis;

public Options(int connectTimeoutMillis, int readTimeoutMillis) {
  this.connectTimeoutMillis = connectTimeoutMillis;
  this.readTimeoutMillis = readTimeoutMillis;
}

public Options() {
  this(10 * 1000, 60 * 1000);
}

啥意思呢

  1. connectTimeoutMillis连接超时的时间为:10*1000 就是10秒
  2. readTimeoutMillis 读取超时时间为:60*1000 也就是一分钟

那么@SoftwareKing 同学提交的代码是怎么样的呢:

 @Bean
 public okhttp3.OkHttpClient okHttpClient(){
     return new okhttp3.OkHttpClient.Builder()
              //设置连接超时
             .connectTimeout(60, TimeUnit.SECONDS)
             //设置读超时
             .readTimeout(60, TimeUnit.SECONDS)
             //设置写超时
             .writeTimeout(60,TimeUnit.SECONDS)
             //是否自动重连
             .retryOnConnectionFailure(true)
             .connectionPool(new ConnectionPool())
             //构建OkHttpClient对象
             .build();
 }

设置了,一分钟的超时时间,所以就解决了首次超时的问题。

为何10秒钟连接不到服务或者响应不会来呢,想必书籍里面应该已经提及到了,我就不就阐述了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants