问题由来
使用Feign能够完成服务间调用,可是总存在一种状况:服务提供方特别慢,可是服务提供方是运行正常,若是咱们自定义设置timeout,就出现feign.RetryableException: Read timed out executing GET http://user-service/v1/usersWithSleep/2?sleepTimeMillis=6000 异常, 致使没法继续工做git
那么如何设置timeout?github
解决办法
完完整代码这这里, user-servcie, feignusercommodity-service, 欢迎加星,fork。
主要使用consul 1.2.0, Spring Boot 2.0.1, Spring Cloud Finchley.RELEASE。spring
从文档2能够看到 “ Feign already uses Ribbon, so, if you use @FeignClient, this section also applies.”数据库
配置文件application.properties中设置ribbon的timeoutapp
ribbon.ConnectTimeout=30000
ribbon.ReadTimeout=7000
代码简要说明,user-servcie有个接口A能够根据userId查询用户,可是sleep以后才返回,sleep由调用方提供(个人示例代码只是为了演示timeout效果,实际中有的接口可能须要查询数据库并对查询结果进行各类转换致使接口比较慢)ide
feignusercommodity-service服务会调用user-servcie的接口A,当你传入的sleep较小时,能够正常返回,可是当sleep较大时,由于ribbon.ReadTimeout限制就会出现feign.RetryableException: Read timed out executing GET http://user-service/v1/usersWithSleep/2?sleepTimeMillis={yourSleepTime}svg
效果截图
第一张截图
user-server服务工做正常,http://localhost:7001/v1/usersWithSleep/2?sleepTimeMillis=6000一直都能返回数据,就是等待时间较长,
当咱们没有设置ribbon.ReadTimeout=7000时,调用feignusercommodity-service的http://localhost:7010/my/usersWithSleep/2?sleepTimeMillis=6000出现异常,以下图微服务
第二张截图
当咱们在feignusercommodity-service的配置文件中设置ribbon.ReadTimeout=7000后,调用feignusercommodity-service的http://localhost:7010/my/usersWithSleep/2?sleepTimeMillis=6000正常,以下图
第三张截图
当咱们在feignusercommodity-service的配置文件中设置ribbon.ReadTimeout=7000后,调用feignusercommodity-service的http://localhost:7010/my/usersWithSleep/2?sleepTimeMillis=7001出现异常,以下图