SpringCloud04_OpenFeign概述、使用、超时配置、重试、请求响应压缩、日志打印功能

①. OpenFeign是什么

  • ①. Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,以及对使用Spring Web中默认使用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在使用Feign时提供负载平衡的http客户端。
    在这里插入图片描述

  • ②. feign的官网地址 github网址

  • ③. openfeign是一个声明式的Web服务客户端,只需创建一个Rest接口并在该接口上添加注解@FeignClient即可
    在这里插入图片描述

②. OpenFeign能干嘛

  • ①. 前面在使用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可

  • ②. OpenFeign同时还集成SpringCloud LoadBalancer
    可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

  • ③. 提炼下

  1. 可插拔的注解支持,包括Feign注解和JAX-RS注解
  2. 支持可插拔的HTTP编码器和解码器
  3. 支持Sentinel和它的Fallback
  4. 支持SpringCloudLoadBalancer的负载均衡
  5. 支持HTTP请求和响应的压缩

③. OpenFeign通用步骤

  • ①. 此次业务说明
    服务消费者80 → 调用含有@FeignClient注解的Api服务接口 → 服务提供者(8001/8002)
    在这里插入图片描述

  • ②. 搭建cloud-consumer-feign-order80工程

  1. 引入依赖
<!--openfeign-->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
   </dependency>
  1. 写yaml
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
  1. 主启动(修改类名为MainOpenFeign80)
    在这里插入图片描述
  • ③. 业务类
  1. 按照架构说明图进行编码准备
    在这里插入图片描述
  2. 修改cloud-api-commons通用模块
    引入openfeign依赖
<!--openfeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

新建服务接口PayFeignApi,头上配置@FeignClient注解
在这里插入图片描述参考微服务8001的Controller层,新建PayFeignApi接口

@FeignClient("cloud-payment-service")
public interface PayFeignApi {
    /**
     * 新增一条支付相关流水记录
     * @param payDTO
     * @return
     */
    @PostMapping("/pay/add")
    public ResultData addPay(@RequestBody PayDTO payDTO);

    /**
     * 按照主键记录查询支付流水信息
     * @param id
     * @return
     */
    @GetMapping(value = "/pay/get/{id}")
    public ResultData getPayInfo(@PathVariable("id") Integer id);

    /**
     * openfeign天然支持负载均衡演示
     * @return
     */
    @GetMapping(value = "/pay/get/info")
    public String mylb();
}

在这里插入图片描述

  • ④. 拷贝之前的80工程进cloud-consumer-feign-order80,记得去掉部分代码和LoadBalancer不相关特性

  • ⑤. 修改Controller层的调用

@RestController
@Tag(name = "Feign支付微服务模块", description = "支付CRUD")
public class OrderController {

    @Resource
    private PayFeignApi payFeignApi;

    @PostMapping(value = "/feign/pay/add")
    public ResultData addOrder(@RequestBody PayDTO payDTO) {
        ResultData resultData = payFeignApi.addPay(payDTO);
        return resultData;
    }
    /**
     * openfeign天然支持负载均衡演示
     *
     * @return
     */
    @GetMapping(value = "/feign/pay/mylb")
    public String mylb() {
        return payFeignApi.mylb();
    }
}
  • ⑥. 测试
    在这里插入图片描述
    在这里插入图片描述

④. OpenFeign超时控制

  • ①. 本次OpenFeign的版本要注意,最新版和网络上你看到的配置不一样
    在这里插入图片描述
  • ②. 超时设置,故意设置超时演示出错情况,自己使坏写bug
  1. 服务提供方cloud-provider-payment8001故意写暂停62秒钟程序
    在这里插入图片描述
  2. 80服务调用结果
    在这里插入图片描述
  • ③. 官网解释+配置处理 关键配置
  1. 默认OpenFeign客户端等待60秒钟,但是服务端处理超过规定时间会导致Feign客户端返回报错
  2. 为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,默认60秒太长或者业务时间太短都不好
  3. connectTimeout:连接超时时间
  4. readTimeout:请求处理超时时间
    在这里插入图片描述
    在这里插入图片描述
  • ④. yaml文件如何配置
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
            connectTimeout: 3000 #连接超时时间
            readTimeout: 3000 #读取超时时间
          cloud-payment-service:
            connectTimeout: 2000 #连接超时时间 两秒
            readTimeout: 2000 #读取超时时间 两秒

⑤. OpenFeign重试机制

  • ①. 默认重试是关闭的,给了默认值
    在这里插入图片描述

  • ②. 默认关闭重试机制,测试看看
    在这里插入图片描述

  • ③. 开启Retryer功能,新增配置类FeignConfig并修改Retryer配置

@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer() {
        //return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的

        //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
        return new Retryer.Default(100, 1, 3);
    }
}

在这里插入图片描述

⑥. OpenFeign默认HttpClient修改

  • ①. 默认用的是什么
    在这里插入图片描述
  • ②. Apache HttpClient5 配置开启说明
#  Apache HttpClient5 配置开启
spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true
  • ③. 替换之后 在这里插入图片描述

⑦. OpenFeign请求/响应压缩

  • ①. 官网说明
    在这里插入图片描述
  • ②. 对请求和响应进行GZIP压缩
  1. Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗
  2. 通过下面的两个参数设置,就能开启请求与相应的压缩功能:
    spring.cloud.openfeign.compression.request.enabled=true
    spring.cloud.openfeign.compression.response.enabled=true
  • ③. 细粒度化设置
  1. 对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限
  2. 只有超过这个大小的请求才会进行压缩:
    spring.cloud.openfeign.compression.request.enabled=true
    spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型
    spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小
  • ④. yaml文件配置
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
          #cloud-payment-service:
            #连接超时时间
                        connectTimeout: 4000
            #读取超时时间
                        readTimeout: 4000
      httpclient:
        hc5:
          enabled: true
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true

⑧. OpenFeign日志打印功能

  • ①. Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,说白了就是对Feign接口的调用情况进行监控和输出

  • ②. 日志级别

  1. NONE:默认的,不显示任何日志
  2. BASIC:仅记录请求方法、URL、响应状态码及执行时间
  3. HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  4. FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
    在这里插入图片描述
  • ③. 配置日志bean
@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer() {
        //return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的

        //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
        return new Retryer.Default(100, 1, 3);
    }

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
  • ④. YML文件里需要开启日志的Feign客户端
    在这里插入图片描述
# feign日志以什么级别监控哪个接口
logging:
  level:
    com:
      xiaozhi:
        cloud:
          apis:
            PayFeignApi: debug 
  • ⑤. 带着压缩调用和去掉压缩调用
    在这里插入图片描述在这里插入图片描述
  • ⑥. 重试演示结果
    在这里插入图片描述
  • ⑦. 本节内容最后的YML
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
            connectTimeout: 2000 #连接超时时间
                        readTimeout: 2000 #读取超时时间
           httpclient:
        hc5:
          enabled: true
      compression:
         request:
           enabled: true
           min-request-size: 2048
           mime-types: text/xml,application/xml,application/json
         response:
           enabled: true
          #cloud-payment-service:
            #connectTimeout: 4000 #连接超时时间
            #readTimeout: 4000 #读取超时时间

# feign日志以什么级别监控哪个接口
logging:
  level:
    com:
      xiaozhi:
        cloud:
          apis:
            PayFeignApi: debug
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所得皆惊喜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值