Spring Cloud——OpenFeign

  • OpenFeign是一个声明式的Web服务客户端
  • OpenFeign基本上就是当前微服务之间调用的事实标准。
  • 使用OpenFeign只需创建一个Rest接口并在该接口上添加注解@FeignClient即可。
    在这里插入图片描述

一、OpenFeign能干嘛

  • 我们之前使用Spring Cloud LoadBalancer + RestTemplate时,利用RestTemplatehttp请求的封装处理形成了一套模板化的调用方法。
  • 但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可。
  • 可以在使用OpenFeign时提供客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与Spring Cloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
  • OpenFeign默认就支持负载均衡。

二、OpenFeign的基本使用

  • 第一步,修改pom.xml添加依赖
    • 注意: 对于feign依赖的添加,是谁想获取其他的服务就在谁的pom文件中添加feign依赖。
    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  • 第二步,在主启动类上添加注解@EnableFeignClients表示开启OpenFeign功能并激活
    @SpringBootApplication
    @EnableFeignClients
    public class MainFeign80 {
        public static void main(String[] args) {
            SpringApplication.run(MainFeign80.class, args);
        }
    }
    
  • 第三步,定义Feign客户端
    • 注意:如果是在一个单独的通用模块中进行Feign接口定义的,这个模块中也需要添加Feign相关的依赖。
    /**
    * 注解的value属性就是想要调用服务的名称,
    * 注意: 如果参数列表中如果有参数, 注解不可以省略,注解不可以省略,注解不可以省略, feign不支持, 踩过
    * 错: String getDesc(String name);
    * 对: String getDesc(@RequestParam(“name”) String name);
    */
    @FeignClient("cloud-payment-service")
    public interface PayFeignAPI {
        @GetMapping(value = "/pay/get/info")
        String getInfoByConsul();
    }
    
  • 第四步,定义控制器
    @Slf4j
    @RestController
    @RequestMapping("/feign")
    public class OrderController {
        @Resource
        private PayFeignAPI payFeignAPI;
    
        @GetMapping("/pay/get/info")
        public String getPort() {
            return payFeignAPI.getInfoByConsul();
        }
    }
    

三、Feign的高级特性

1.OpenFeign超时控制

  • OpenFeign客户端默认等待60秒钟,但是服务端处理超过规定时间会导致Feign客户端返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,默认60秒太长或者业务时间太短都不好。
  • OpenFeign主要通过两个参数来进行超时控制。
    在这里插入图片描述
  • 全局配置和局部配置
    spring:
    	cloud:
    		openfeign:
    			client:
    				config:
          				# 全局配置 openfeign 的超时时间限制
          				default:
    			          # 连接超时时间
    			          connectTimeout: 3000
    			          # 读取超时时间(业务处理时间)
    			          readTimeout: 3000
    			     	# 局部 openfeign 的超时时间限制,全局配置和局部配置可以同时存在,遵循局部优先原则
          				cloud-payment-service: # 这里写的是具体配置的服务名
    			            # 连接超时时间
    			            connectTimeout: 20000
    			            # 读取超时时间(业务处理时间)
    			            readTimeout: 20000
    

2.OpenFeign重试机制

  • OpenFeign的重试机制默认是关闭的。
    在这里插入图片描述
  • 添加配置类开启重试机制
    @Configuration
    public class FeignConfig {
        /**
         * 设置 feign 的重试机制
         */
        @Bean
        public Retryer myRetryer() {
            //Feign 默认配置是不走重试策略的
    //        return Retryer.NEVER_RETRY;
            //最大请求次数为 3, 初始时间间隔为 100ms,重试最大间隔为 1s.
            return new Retryer.Default(100, 1, 3);
        }
    }
    

3.OpenFeign之性能优化HttpClient5

  • OpenFeignhttpClient如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送请求,由于默认HttpURLConnection没有连接池,性能和效率比较低。
  • 使用Apache HttpClient5替换OpenFeign默认的HttpURLConnection
    在这里插入图片描述
    在这里插入图片描述
  • 第一步,修改pom.xml添加依赖
    <!-- httpclient5-->
    <dependency>
        <groupId>org.apache.httpcomponents.client5</groupId>
        <artifactId>httpclient5</artifactId>
        <version>5.3</version>
    </dependency>
    <!-- feign-hc5-->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-hc5</artifactId>
        <version>13.1</version>
    </dependency>
    
  • 添加配置开启HttpClient5
    #  Apache HttpClient5 配置开启
    spring:
      cloud:
        openfeign:
          httpclient:
            hc5:
              enabled: true
    
    在这里插入图片描述

4.OpenFeign请求和响应压缩

spring:
  cloud:
    # 配置OpenFeign
    openfeign:
      # 设置 request 和 response 是否进行 gzip 压缩
      compression:
        request:
          # 开启请求压缩
          enabled: true
          # 请求触发压缩的最小值
          min-request-size: 2048
          # 请求触发压缩的数据类型
          mime-types: text/html, application/xml, application/json
        response:
          # 开启响应压缩
          enabled: true
  • 使用gizp压缩前
    在这里插入图片描述
  • 使用gizp压缩后
    在这里插入图片描述

5.OpenFeign之Feign日志打印

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

  • Feign的日志级别
    在这里插入图片描述

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

    @Configuration
    public class FeignConfig {
        /**
         * 设置 feign 的日志级别
         */
        @Bean
        public Logger.Level feigenLoggerLevel() {
            return Logger.Level.FULL;
        }
    }
    
  • 第二步,开启Feign日志功能

    • 公式(三段):logging.level + 含有@FeignClient注解的完整带包名的接口名+debug
    # feign日志以什么级别监控哪个接口
    logging:
      level:
        com:
          atguigu:
            cloud:
              apis:
                PayFeignApi: debug 
    

    在这里插入图片描述


四、参考

[1]. feign的启动异常:The bean ‘XXX.FeignClientSpecification’, defined in null, could not be registered

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小宝945

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

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

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

打赏作者

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

抵扣说明:

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

余额充值