一、OpenFeign概述

1. OpenFeign是什么

  • Feign是一个声明式WebService客户端,使用Feign能让编写Web Service客户端更加简单,只需要创建一个接口并添加注解即可
  • 他的使用方法时定义一个服务接口然后在上面添加注解,Feign也支持可插拔式的编码器和解码器。Spring Cloud 对Feign进行了封装。使其支持了SpringMVC 标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
  • https://github.com/spring-cloud/spring-cloud-openfeign

    2. Feign和OpenFeign的区别

    Feign是一个声明式WebService客户端,服务调用只需在自己的接口上添加相应的注解。其简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发过程,其实 Feign 底层集成了 Ribbon 和 RestTemplate。
    image.png
    Feign被OpenFeign被取代,如图上。

    二、OpenFeign的使用

  1. 新建一个order项目,用于feign测试,名称为 cloud-consumer-feign-order80
  2. pom文件,比原始的多一个openfeign依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>
    5. <!--eureka client-->
    6. <dependency>
    7. <groupId>org.springframework.cloud</groupId>
    8. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    9. </dependency>
  3. 写yaml ```yaml server: port: 80

spring: application: name: cloud-order-service

eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka


4. 主启动类
```java
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //开启Feign
public class OrderFeignApplication80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignApplication80.class, args);
    }
}
  1. 接口

    @Component
    @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService {
    
     @PostMapping("/payment/create")
     CommonResult<Payment> create(Payment payment);
    
     @GetMapping("/payment/get/{id}")
     CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    
  2. Controller测试

    @RestController
    public class OrderController {
     @Resource
     private PaymentFeignService paymentFeignService;
    
     @PostMapping("/consumer/payment/create")
     CommonResult<Payment> create(Payment payment) {
         return paymentFeignService.create(payment);
     }
    
     @GetMapping("/consumer/payment/get/{id}")
     CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
         return paymentFeignService.getPaymentById(id);
     }
    }
    

    三、OpenFeign超时控制

    OpenFeign 默认等待时间是1秒,超过1秒会直接报错。
    image.png
    image.png

    1. 修改超时时间

    设置feign 客户端超时时间 (OpenFeign默认支持ribbon)
    image.png

    四、OpenFeign日志打印功能

    Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。说白了就是:对Feign接口的调用情况进行监控和输出。

ONE 默认的,不显示任何日志
BASIC 仅记录请求方法、URL、响应状态码及执行时间
HEADERS 除了BASIC中定义的信息之外,还有请求和响应的头信息
FULL 除了HEADERS中定义的信息外,还有请求和响应的正文及元数据。
  1. 在配置类中添加OpenFeign的日志类

    @Configuration
    public class FeignLogConfig {
     @Bean
     public Logger.Level feignLoggerLevel() {
         //指定日志的运行级别
         return Logger.Level.FULL;
     }
    }
    
  2. 写yml:为指定类设置日志级别

    logging:
    level:
     # feign 日志以什么级别监控哪个接口
     com.tao.service.*: debug
    
  3. 效果图

image.png

五、Ribbon和OpenFeign如何选择?

调用微服务访问两种方法:微服务名字(ribbon)、接口和注解(feign),如果喜欢REST风格使用Ribbon,如果喜欢社区版的面向接口风格使用Feign。但是现在Ribbon已经停更进维,因此建议使用OpenFeign。

六、服务降级/熔断,OpenFeign的处理?

1、fallback
image.png
2、fallbackFactory
image.png