OpenFeign的超时控制

57 阅读2分钟

前言

讲解这个之前,我们先来想一个场景,home是我们的首页微服务,sku是我们的商品微服务,我们的首页调用商品,对于用户来说最佳的时间就是500ms左右,假设接口层面,我们没有做任何的超时控制,如果sku一直处于不返回数据的异常情况,那么首页一直在等待,就会造成一直白屏,最佳的是要有降级的。降级后续讲hystrix会给大家提到。

扩展一个场景题

如果A服务调用B服务,B服务日常的tp99是500ms,这个时候,A的超时时间应该设置为多少?(100,200,800,1000)。800是正常的,我们不要小于b提供的时间,也不要大的离谱,

再继续扩展一个问题,如果在高并发的情况下,我们是否要做重试。其实是不要做的,我们应该快速失败,因为在高并发的情况下,如果不断重试,会导致服务产生问题。

代码实践

sku微服务调整

我们在原有的sku服务里面增加一个方法。

@GetMapping("timeOut")
public String timeOut() throws InterruptedException {
    Thread.sleep(3000L);
    return "hello Sku world time Out";
}

home微服务调整

在原有的feign接口里增加一个超时接口。

@GetMapping("timeOut")
public String timeOut();

原有的controller里面增加调用测试。

@GetMapping("TestTimeOut")
public String TestTimeOut() {
    return skuFeignService.timeOut();
}

发现等了3秒之后,返回了结果。

设置超时时间--配置文件配置

feign:
  client:
    config:
      default: #配置的所有东西默认生效,也可以换成指定微服务名称,只有该微服务生效
        read-timeout: 2000 #响应超时时间
        connect-timeout: 2000 #连接超时时间
#      ape-cloud-sku: 
#        read-timeout: 2000 
#        connect-timeout: 2000 

OpenFeign默认超时时间为10s

如果我们想针对不同的设置不同的时间,我们就可以把default进行替换为服务的名称。