栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Feign源码分析(四) - 自定义扩展点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Feign源码分析(四) - 自定义扩展点

@Author:zxw
@Email:502513206@qq.com


目录

    Feign源码分析(一) - 初探FeignFeign源码分析(二) - builder构建Feign源码分析(三) - Client调用​
1.模块

对于Feign的整体流程已经分析完了,接下来就看看有哪些我们可以自定义的扩展点。首先回顾下Feign中有哪些配置模块。像之前FeignBuilder里还有Options,Retryer等,下面只列了我们主要使用的自定义配置。

1.1 Client

对于Client只有一个作用,就是发起网络请求。那么在这个地方我们能够扩展的Client就比较多了,比如使用OKHTTP、apache的HttpClient等。像Feign就使用了原生的java网络请求。

1.2 Encoder

请求参数编码器,主要是在构造请求模板RequestTemplate时会使用,ReflectiveFeign中主要提供了三种请求模板的工厂类,分别为

    BuildFormEncodedTemplateFromArgsBuildEncodedTemplateFromArgsBuildTemplateByResolvingArgs

在构建工厂时,会将对应的encoder类传入。不过只有在参数为Map或者参数配置的@Param在链接中不存在映射时才会使用1,2的工厂类。这时我们自定义的编码器才会生效,具体的生成代码如下

BuildTemplateByResolvingArgs buildTemplate;
        if (!md.formParams().isEmpty() && md.template().bodyTemplate() == null) {
          // 会使用自定义的编码器
          buildTemplate =
              new BuildFormEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
        } else if (md.bodyIndex() != null) {
          // 会使用自定义的编码器
          buildTemplate = new BuildEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
        } else {
          // 不会使用自定义的编码器
          buildTemplate = new BuildTemplateByResolvingArgs(md, queryMapEncoder, target);
        }

1.3 Decoder

解码器主要使用在http请求结束时,对响应数据Response的后续操作。Feign会为我们提供了默认的解码器AsyncResponseHandler,若要使用自己的解码器则需要配置Feign中的forceDecoding属性为true才会使用自定义的编码器

if (forceDecoding) {
      this.decoder = decoder;
      this.asyncResponseHandler = null;
    } else {
      this.decoder = null;
      this.asyncResponseHandler = new AsyncResponseHandler(logLevel, logger, decoder, errorDecoder,
          decode404, closeAfterDecode);
    }
1.4 Contract

该模块用于对接口解析,想要扩展的话就实现其子类baseContract,如果我们想使用自定义的注解来对Feign整体进行封装的话,那么可以实现该类中的所有方法,就能按照自定义的方式解析接口了。

1.5 RequestInterceptor

RequestTemplate请求模板的拦截器,Feign在发起http请求前,首先需要从RequestTemplate.facotry工厂构造出RequestTemplate请求模板对象,随后在通过RequestTemplate构造出具体的Request请求对象,Feign在构造Request请求对象时,就会调用我们拦截器的相关逻辑,这时我们可以往RequestTemplate中增加一些请求头参数等。

Request targetRequest(RequestTemplate template) {
    for (RequestInterceptor interceptor : requestInterceptors) {
      interceptor.apply(template);
    }
    return target.apply(template);
  }
2.总结

对于Feign常用的扩展点大概就这些,后面会继续分析spring对Feign的结合,以及ribbon与Feign结合。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/719446.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号