一、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 请求的关系如下:
通过源码的方式查看 Encoder/Decoder 与 Request 与 Response 的关系
相关 UML 图,如下:
SynchronousMethodHandler#invoke 关键代码如下:
- buildTemplateFromArgs#create 涉及 encode 处理
- executeAndDecode 涉及 decode 处理
更多内容自行阅读源码
二、Encoder 和 Decoder 实现类
2.1、Encoder
Encoder 实现的接口类为 Encoder,该接口只有一个方法定义,相关代码如下:
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 实现类,汇总类图结构如下:
下面简单了解一下,这几个 Encoder 各自的作用
2.1.1、Default
全限定名:feign.codec.Encoder.Default
处理:字符串 和 byte 数组
相关代码如下:
Encoder 功能:如果 Body 内容不为空,那么 body 中的内容必须是字节数组或者字符串,否则报错。
2.1.2、SpringEncoder
全限定名:org.springframework.cloud.openfeign.support.SpringEncoder
处理:multipart/form-data 的数据 和通过 HttpMessageConverters 对参数进行处理
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 进行处理
相关代码如下:
Encoder功能:SpringFormEncoder 并没有提供任何操作,只是将入参强制转换为 MultipartFile 类型然后调用 FormEncoder 进行处理。
2.2、Decoder
Decoder 实现的接口类为 Decoder,该接口只有一个方法定义,相关代码如下:
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 实现类,汇总类图结构如下:
下面简单了解一下,这几个 Decoder各自的作用
2.2.1、StringDecoder
全限定名:feign.codec.StringDecoder
功能:Response 响应为字符串的处理
相关代码如下:
Decoder 功能:Response body 内容为空或者为字符串时进行处理,否则报错。
2.2.2、Default
全限定名:feign.codec.Decoder.Default 功能:字节数组 和 字符串 的处理
相关代码如下:
Decoder功能:提供了 byte 数组的处理,并且继承了 StringDecoder 所以具备字符串处理
2.2.3、SpringDecoder
全限定名:org.springframework.cloud.openfeign.support.SpringDecoder
功能:通过 Spring 的 HttpMessageConverters 来处理返回值
2.2.4、ResponseEntityDecoder
全限定名:org.springframework.cloud.openfeign.support.ResponseEntityDecoder
功能:
2.2.5、ResponseMappingDecoder
全限定名:feign.Feign.ResponseMappingDecoder
2.2.6、OptionalDecoder
全限定名:feign.optionals.OptionalDecoder
2.2.7、StreamDecoder
全限定名:feign.stream.StreamDecoder