一、Feign Encoder/Decoder 如何被使用?

《Feign如何进行服务间请求调用#Feign Clietn 调用流程》中讨论 Feign 进行服务间调用的本质就是拼接 RequestTemplate 对象,发起 HTTP 请求。
Feign 在拼接 RequestTemplate 前后提供了扩展点,Encoder 和 Decoder 。
Encoder:HTTP 请求发起前,对 Request 进行编码处理
Decoder:HTTP 响应结果后,对 Response 进行解码操作

简单来说,
Encoder :在发起 HTTP 请求前,对 Request 请求进行定制化处理,如:参数加密、编码格式转化等。
Decoder:针对 HTTP 响应结果 Response 进行处理,如:将JSON字符串转成JSON、针对加密的字符进行解密等。

Feign 提供的 Encoder 、Decoder 与 HTTP 请求的关系如下:
image.png

通过源码的方式查看 Encoder/Decoder 与 Request 与 Response 的关系

相关 UML 图,如下:
image.png

SynchronousMethodHandler#invoke 关键代码如下:
image.png

  • buildTemplateFromArgs#create 涉及 encode 处理
  • executeAndDecode 涉及 decode 处理

    更多内容自行阅读源码

二、Encoder 和 Decoder 实现类

2.1、Encoder

Encoder 实现的接口类为 Encoder,该接口只有一个方法定义,相关代码如下:
image.png

Feign 提供了两个 Encoder 实现

  • feign.codec.Encoder.Default
  • feign.form.FormEncoder

Feign 与 springframework 和 Spring Cloud 关联后,又提供了三个 Encoder

  • feign.form.spring.SpringFormEncoder
  • org.springframework.cloud.openfeign.support.SpringEncoder
  • org.springframework.cloud.openfeign.support.PageableSpringEncoder

上述五种 Encoder 实现类,汇总类图结构如下:
image.png
下面简单了解一下,这几个 Encoder 各自的作用

2.1.1、Default

全限定名:feign.codec.Encoder.Default
处理:字符串 和 byte 数组

相关代码如下:
image.png
Encoder 功能:如果 Body 内容不为空,那么 body 中的内容必须是字节数组或者字符串,否则报错。

2.1.2、SpringEncoder

全限定名:org.springframework.cloud.openfeign.support.SpringEncoder
处理:multipart/form-data 的数据 和通过 HttpMessageConverters 对参数进行处理

image.png
Encoder 功能:如果 body 不为空进行处理,

  • bodyType is MultipartFile
    如果 content Type = multipart/form-data ,则将处理交给 SpringFormEncoder 来处理
    反之,抛出异常
  • bodyType 不是 MultipartFile
    使用 Spring 容器中加载的 HttpMessageConverters 对参数进行处理

    2.1.3、PageableSpringEncoder

    全限定名:org.springframework.cloud.openfeign.support.PageableSpringEncoder

相关代码如下:

2.1.4、FormEncoder

全限定名:feign.form.FormEncoder

2.1.5、SpringFormEncoder

全限定名:feign.form.spring.SpringFormEncoder 功能:调用的 FormEncoder 进行处理

相关代码如下:
image.png
Encoder功能:SpringFormEncoder 并没有提供任何操作,只是将入参强制转换为 MultipartFile 类型然后调用 FormEncoder 进行处理。

2.2、Decoder

Decoder 实现的接口类为 Decoder,该接口只有一个方法定义,相关代码如下:
image.png

Feign 提供了五个 Decoder 实现

  • feign.codec.Decoder.Default
  • feign.optionals.OptionalDecoder
  • feign.Feign.ResponseMappingDecoder
  • feign.stream.StreamDecoder
  • feign.codec.StringDecoder

Feign 与 springframework 和 Spring Cloud 关联后,又提供了两个 Decoder

  • org.springframework.cloud.openfeign.support.SpringDecoder
  • org.springframework.cloud.openfeign.support.ResponseEntityDecoder

上述七种 Decoder 实现类,汇总类图结构如下:
image.png
下面简单了解一下,这几个 Decoder各自的作用

2.2.1、StringDecoder

全限定名:feign.codec.StringDecoder
功能:Response 响应为字符串的处理

相关代码如下:
image.png
Decoder 功能:Response body 内容为空或者为字符串时进行处理,否则报错。

2.2.2、Default

全限定名:feign.codec.Decoder.Default 功能:字节数组 和 字符串 的处理

相关代码如下:
image.png
Decoder功能:提供了 byte 数组的处理,并且继承了 StringDecoder 所以具备字符串处理

2.2.3、SpringDecoder

全限定名:org.springframework.cloud.openfeign.support.SpringDecoder
功能:通过 Spring 的 HttpMessageConverters 来处理返回值

相关代码如下:
image.png

2.2.4、ResponseEntityDecoder

全限定名:org.springframework.cloud.openfeign.support.ResponseEntityDecoder
功能:

相关代码如下:
image.png

2.2.5、ResponseMappingDecoder

全限定名:feign.Feign.ResponseMappingDecoder

2.2.6、OptionalDecoder

全限定名:feign.optionals.OptionalDecoder

2.2.7、StreamDecoder

全限定名:feign.stream.StreamDecoder