场景
SpringCloud中集成OpenFeign实现服务调用:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124822349
在上面实现使用OpenFeign进行服务调用之后。
默认Feign客户端只等待一秒钟,但是如果服务端处理超过1秒钟时就会导致Feign客户端不想等待
了,直接返回报错。为了避免这种情况,有时需要设置Feign客户端的超时控制。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
1、找到前面服务消费者的application.yml
设置feign客户端超时时间
#设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000
完整pom文件
server: port: 88 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #设置feign客户端超时时间(OpenFeign默认支持ribbon) ribbon: #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 #指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000
2、为了测试该中响应时间长场景下,在服务提供者8001服务上新增
一个接口,不进行任何逻辑,只是让其耗费3秒钟。
@GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout() { // 业务逻辑处理正确,但是需要耗费3秒钟 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return serverPort; }
3、然后在服务消费者,Feign客户端的service调用添加对该服务的调用
package com.badao.springclouddemo.service; import com.badao.springclouddemo.entities.CommonResult; import com.badao.springclouddemo.entities.Payment; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @Component @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentFeignService { @GetMapping(value = "/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); @GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout(); } 再在Controller调用该service @GetMapping(value = "/consumer/payment/feign/timeout") public String paymentFeignTimeout() { // OpenFeign客户端一般默认等待1秒钟 return paymentFeignService.paymentFeignTimeout(); }
4、再次访问该接口进行测试