SpringCloud之OpenFeign

一、OpenFeign简介

        Feign为微服务架构下服务之间的调用提供了解决方案,Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
       OpenFeign添加了对于Spring MVC注解的支持,同时集成了Spring Cloud LoadBalancer和Spring Cloud CircuitBreaker,在使用OpenFeign时,提供负载均衡和熔断降级的功能。

二、OpenFeign与Feign的区别

Feign

  • Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端
  • Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务
  • Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

OpenFeign

  • OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等
  • OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
  • OpenFeign集成了LoadBalancer和CircuitBreaker

三、OpenFeign使用案例

1、引入依赖

在这里插入图片描述

2、使用@EnableFeignClients开启Feign功能

在这里插入图片描述

3、创建feign客户端

        在注解@FeignClient注解中,“cloud-payment-service”是服务名,使用这个名字来从Eureka服务列表中得到相应的服务,来创建LoadBalancer客户端,也可以使用url属性,指定服务的URL。
在这里插入图片描述

4、在消费者controller中调用服务

在这里插入图片描述

四、OpenFeign超时配置

        默认Feign 客户端只等待1秒钟,但是服务端处理需要超过1秒钟,导致Feign 客户端不想等待了,直接返回报错。
        为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制。

feign:
  client:
    config:
      default: #默认给所有feignClient配置超时时间
        connectTimeout: 5000 #建立连接超时时间(毫秒)
        readTimeout: 5000 #读取数据超时时间
feign:
  client:
    config:
      cloud-payment-servcie: #给指定的服务(对应着一个feignClient)设置超时时间
        connectTimeout: 5000 #建立连接超时时间(毫秒)
        readTimeout: 5000 #读取数据超时时间

五、OpenFeign日志打印

1、日志打印介绍

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

2、日志打印级别

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

3、配置日志打印级别

在这里插入图片描述

4、在配置文件中设置日志记录级别和要扫描的包

logging:
  level:
    com.kkb: debug

六、OpenFeign集成熔断器

1、添加依赖

在这里插入图片描述

2、开启Feign的熔断器支持

在配置文件中增加如下配置:

feign:
  circuitbreaker:
    enabled: true

3、配置熔断降级类

        Spring Cloud CircuitBreaker支持降级概念,当熔断器打开,或者调用是出现错误,则执行降级方法。@FeignClient的fallback属性指定降级的类,注意服务降级类需要在spring容器中注册。通过fallback调用的降级类需要实现@FeignClient修饰的接口:

@FeignClient(value = "cloud-payment-service", fallback = PaymentClient.Fallback.class)
public interface PaymentClient {

    @GetMapping("/payment/{id}")
    public Payment payment(@PathVariable("id") Integer id);

    @Component
    static class Fallback implements PaymentClient {
        @Override
        public Payment payment(Integer id) {
            Payment payment = new Payment(id, "熔断降级方法返回");
            return payment;
        }
    }
}

        如果想要获得熔断降级的异常信息,比如打印异常日志,则可以使用fallbackFactory属性指定熔断降级工厂类,通过工厂类来访问熔断降级类并打印异常信息;通过fallbackFactory调用的工厂类需要实现FallbackFactory接口:

@FeignClient(value = "cloud-payment-service", fallbackFactory = PaymentClient.FallBackFactory.class)
public interface PaymentClient {

    @GetMapping("/payment/{id}")
    public Payment payment(@PathVariable("id") Integer id);

    @Component
    static class Fallback implements PaymentClient {
        @Override
        public Payment payment(Integer id) {
            Payment payment = new Payment(id, "熔断降级方法返回");
            return payment;
        }
    }
    @Component
    static class FallBackFactory implements FallbackFactory<Fallback> {
        @Override
        public Fallback create(Throwable cause) {
            cause.printStackTrace();
            return new Fallback();
        }
    }
}

七、OpenFeign请求和响应压缩

在配置文件中添加如下配置:

feign:
  compression:
    request:
      enabled: true # 请求压缩
      mime-types: text/xml,application/xml,application/json # 压缩的类型
      min-request-size: 2048 # 请求最小压缩的阈值
    response:
      enabled: true #响应压缩
      useGzipDecoder: true #使用gzip解码器解码响应数据

版权声明:本文为zxc412728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。