在上一篇的OpenFeign服务调用中,虽然可以使用OpenFeign来实现服务之间的调用,但是一旦调用提供服务方的时候超时就会报错;所以这里就需要了解到OpenFeign的超时控制。
在提供服务端暴露一个接口,设置睡眠3秒钟,方便测试
@Value("${server.port}")
private String serverPort;
// 返回端口号
@GetMapping(value = "/feign/timeout")
public String paymenyFeignTimeout()
{
try
{
TimeUnit.SECONDS.sleep(3);
}catch (Exception e){
e.printStackTrace();
}
return serverPort;
}
然后在调用方的接口新增接口 相对应
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService
{
@GetMapping(value = "/better/payment/feign/timeout")
String paymentFeignTimeout();
}
controller实现
@GetMapping(value = "/consumer/payment/feign/timeout")
public String paymentFeignTimeout()
{
String result = paymentFeignService.paymentFeignTimeout();
return result;
}
分别启动eureka、提供服务端、调用端,网页中输入localhost/consumer/payment/feign/timeout测试会发现3秒后会报错
因为OpenFeign默认的超时为1秒,我们设置了睡眠时间为3秒,所以会报错。
但是我们可以根据业务的需求,手动设置超时控制的时间。
openFeign中整合了ribbon,它的超时控制是由ribbon 进行控制的
在yml中添加配置项,设置为5秒大于之前设置的睡眠时间(3秒)
#设置feign 客户端超时时间(openFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
注意:如果没有生效的话就去看一下引入的包是否冲突了,包名后带(omitted for duplicate)的字样就说明包有冲突,根据自己的情况调整版本。
yml配置好后,重启一下调用端,再进行测试
调用成功,通了~