OpenFeign

Spring Cloud OpenFeign(官方文档)

Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得更加容易,只需创建一个接口并在接口上添加注解即可。

基本使用

依赖:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
xml

在消费者端,直接在接口上添加@FeignClient注解,然后再填上服务提供者的调用接口:

@Service @FeignClient("CLOUD-PAYMENT-SERVICE") public interface PaymentFeignService { @GetMapping("/payment/get/{id}") CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
java

之后直接注入后使用即可:

@RestController public class OrderFeignController { private PaymentFeignService paymentFeignService; @Autowired public void setPaymentFeignService(PaymentFeignService paymentFeignService) { this.paymentFeignService = paymentFeignService; } @GetMapping("/payment/{id}") public CommonResult<Payment> queryPayment(@PathVariable Long id) { return paymentFeignService.getPaymentById(id); } }
java

超时控制

若调用远程服务时间过长,则会抛出一个java.net.SocketTimeoutException: Read timed out表示请求超时。默认是5秒超时。

在配置文件中修改超时控制

feign: client: config: # 服务名 CLOUD-PAYMENT-SERVICE: # 日志级别 logger-level: NONE # 连接超时 默认2秒 connect-timeout: 1 # 请求处理超时,默认5秒 read-timeout: 1
yaml

全局配置超时时间

@Configuration public class FeignConfig { @Bean public Request.Options options() { return new Request.Options(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS, true); } }
java

日志增强

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。可以对Fegin的调用情况进行监控。

Feign日志级别:

  • NONE: 默认的,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中订单的信息之外,还有请求和响应的正文以及元数据

可以通过配置文件配置,也可以通过Spring配置:

@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
java