4.feign超时时间设置策略

1. 简介

feign封装了ribbon,支持ribbon的超时配置。

2. 配置方法

# 全局ribbion超时配置
ribbon:
  ConnectTimeout: 500
  ReadTimeout: 500

# service-a服务ribbion超时配置,优先于全局ribbon超时配置
service-a:
  ribbon:
    ConnectTimeout: 500
    ReadTimeout: 2000

3. 源码分析

LoadBalancerFeignClient.execute()方法内的getClientConfig()方法用于获取配置requestConfig,其中包含真正的超时配置

public class LoadBalancerFeignClient implements Client {
    public Response execute(Request request, Request.Options options) throws IOException {
        //......
        IClientConfig requestConfig = getClientConfig(options, clientName);
        //......
    }

	IClientConfig getClientConfig(Request.Options options, String clientName) {
		IClientConfig requestConfig;
		if (options == DEFAULT_OPTIONS) {
			requestConfig = this.clientFactory.getClientConfig(clientName);
		} else {
            //如果指定了超时时间,则替换超时时间
			requestConfig = new FeignOptionsClientConfig(options);
		}
		return requestConfig;
	}

    static class FeignOptionsClientConfig extends DefaultClientConfigImpl {
        //......
		public FeignOptionsClientConfig(Request.Options options) {
			setProperty(CommonClientConfigKey.ConnectTimeout,
					options.connectTimeoutMillis());
			setProperty(CommonClientConfigKey.ReadTimeout, options.readTimeoutMillis());
		}
        //......
    }
}

真实的请求超时时间,可以拦截LoadBalancerCommand.submit的形参operation.requestConfig中获取ConnectTimeout和ReadTimeout。

public class LoadBalancerCommand<T> {
    //......
    public Observable<T> submit(final ServerOperation<T> operation) {
        //......
    }
}

9. 坑

9.1 Request.Options

  • 如果在程序自定义了Request.Options对象,则配置文件设置的超时配置都无效。
  • feign中默认的超时时间来自于DefaultClientConfigImpl。
  • 配置Request.Options示例:
    //严重不建议通过如下方法,全局配置超时时间。
    @Bean
    public Request.Options options() {
        return new Request.Options(1000, 10000);
    }

转载于:https://my.oschina.net/andChow/blog/1608698

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Feign进行服务之间的调用时,有时会遇到调用超时的情况。调用超时通常是由于网络延迟、目标服务负载过高或者调用方设置超时时间过短所引起的。然而,即使发生调用超时,仍然可以通过一些处理方式来保证调用的成功。 首先,可以通过适当调整Feign超时设置来解决调用超时的问题。可以增加Feign超时时间,以便给目标服务更多的时间来响应请求。这样,就有更多的机会使调用在超时之前完成,并成功处理返回结果。通过调整超时时间,可以适应不同场景下的调用耗时需求,以确保调用的成功与稳定。 其次,可以通过使用断路器来处理调用超时的情况。断路器可以将调用超时的请求直接快速失败,而不是一直等待超时结束。通过断路器的配置,可以设置一个适当的超时时间阈值,当调用超过这个时间后就会触发断路器的降级操作。在断路器触发后,可以通过提供默认结果或者进一步处理异常来保证调用的成功。 最后,可以结合重试策略来处理调用超时。当一个调用发生超时时,可以通过重新发起调用的方式进行重试。通过合理设置重试次数和间隔时间,可以增加调用成功的机会。同时,可以结合断路器来避免无限制的重试,以保护系统的稳定性。 总结而言,当Feign调用超时但是处理成功时,可以通过调整超时时间、使用断路器和结合重试策略等方式来保证调用的成功。这些处理方式可以根据实际情况进行灵活选择,以提高系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值