OpenFeign超时控制
前面简单介绍了Feign和OpenFeign的关系,言归正传,接下来我们看看OpenFeign如何设置调用超时,openFeign其实是有默认的超时时间的,默认分别是连接超时时间10秒、读超时时间60秒,源码在feign.Request.Options#Options()这个方法中。
Feign的原理
虽然有了接口,但是仅仅有接口是不够的,因为接口又不能创建对象,我们得需要对象。
Feign为了方便我们为接口创建对象,提供的Feign.Builder这个内部类
OpenFeign 超时场景
默认Feign 客户端只等待1秒钟,但是服务端处理需要超过1秒钟,导致Feign 客户端不想等待了,直接返回报错
为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制
一、服务提供方8001写暂停程序模拟调用超时
在cloud-provider-payment8001 模拟调用超时
//模拟openfegin调用超时@GetMapping(value = "/payment/feign/timeout")public String paymentFeignTimeout() {// 业务逻辑处理正确,但是需要耗费3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}return serverPort;}
二、服务消费方80添加方法
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {@GetMapping(value = "/payment/feign/timeout")public String paymentFeignTimeout();}
三、服务消费方80添加超时方法
@RestController
@Slf4j
public class OrderFeignController {@Resourceprivate PaymentFeignService paymentFeignService;@GetMapping(value = "/consumer/payment/feign/timeout")public String paymentFeignTimeout() {// OpenFeign客户端一般默认等待1秒钟return paymentFeignService.paymentFeignTimeout();}
}
四、测试
OpenFeign 只等待1秒,超过后报错:
五、在 yml 配置超时控制
openFeign 内与 ribbon 整合了,支持负载均衡,它的超时控制也由最底层的 ribbon 进行控制,yml 添加配置:
#设置feign 客户端超时时间(openFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000
重启80后 测试
数据在3秒后返回,没有报错。
OpenFeign 默认是1秒钟,部分业务时间长了可以通过这个方法进行设置