开发者

Feign的原理及概念详解

目录
  • 1.什么是Feign
  • 2.Feign的调用流程(核心)
  • 3.Feign原理
  • 4.Feign优化
    • 4.1日志配置
    • 4.2超时时间配置
    • 4.3契约配置(了解即可)
    • 4.4客户端组件配置
    • 4.5GZIP 压缩配置
    • 4.6编码器解码器配置
    • 4.7拦截器配置
  • 5.Feign整体架构(RPC架构)
    • 总结

      1.什么是Feign

      Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。编程Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

      Spring Cloud OpenFeign对Feign进行了增强,使其支持Spring MVC注解,从而使得Feign的使用更加方便。

      官方文档: Spring Cloud OpenFeign

      2.Fandroideign的调用流程(核心)

      Feign的原理及概念详解

      3.Feign原理

      1.将feign接口的代理类扫描到Spring容器中

      @EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理

      2.为接口的方法创建RequestTemplate

      当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplat编程客栈e(url,参数)

      3.发出请求

      代理类会通过RequestTemplate创建Request,然后client(URLConnect、HttpClient、OkHttp)使用Request发送请求

      4.Feign优化

      4.1日志配置

      • NONE【性能最佳www.devze.com,默认值】:不记录任何日志。
      • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
      • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
      • FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。

      配置方式

      (1)定义一个配置类,指定日志级别

      // 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置@Configuration
      @Configuration
      public class FeignConfig {
         /**
         * 日志级别
         */
         @Bean
         public Logger.Level feignLoggerLevel() {
           return Logger.Level.FULL;
         }
      }

      (2) 在application.yml配置文件中配置 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径=debug"

      logging: 
        level: 
          com.tuling.mall.feigndemo.feign: debug

      4.2超时时间配置

      OpenFeign使用两个超时参数:

      • connectTimeout:可以防止由于较长的服务器处理时间而阻塞调用者。
      • readTimeout:从连接建立时开始应用,当返回响应花费太长时间时触发。

      补充说明: Feign的底层用的是Ribbon或者LoadBalancer,但超时时间以Feign配置为准

      4.3契约配置(了解即可)

      Spring Cloud 在 Feign 的基础上做了扩展,可以让 Feign 支持 Spring MVC 的注解来调用。

      原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是SpringMvcContract。

      4.4客户端组件配置

      我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的;所以HTTP连接池帮助我们节省了这一步。

      同时Feign的HTTP客户端支持三种框架:

      HttpURLConnection、HttpClient、OkHttp;默认是HttpURLConnection。

      Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,没有连接池,js我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient5,OkHttp。

      Feign发起调用真正执行逻辑:feign.Client#execute (扩展点)

      4.5GZIP 压缩配置

      开启压缩可以有效节约网络资源,提升接口性能,我们可以配置 GZIP 来压缩数据。

      4.6编码器解码器配置

      Feign 中提供了自定义的编码解码器设置,同时也提供了多种编码器的实现,比如 Gson、Jaxb、Jackson。

      我们可以用不同的编码解码器来处理数据的传输。

      如果你想传输 XML 格式的数据,可以自定义 XML 编码解码器来实现,或者使用官方提供的 Jaxb。

      4.7拦截器配置

      通过拦截器实现参数传递。

      扩展点: feign.RequestInterceptor

      使用场景:

      (1)传递分布式事务ID,标明哪个微服务属于同一事物

      (2)token校验的参数传递(实现认证逻辑)

      5.Feign整体架构(RPC架构)

      Feign的原理及概念详解

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜