Spring Cloud Feign 如何自定义编码器、解码器和客户端?

Spring Cloud Feign 为何需要自定义编码器、解码器?

已有的编解码器无法满足需求。

说明

由Feign的实现原理可知,编码器(Encoder)是用来将RequestBean转换成 Http报文正文,解码器(Decoder)是用来将http server的返回报文转换成Response Bean。

spring cloud feign encoder decoder 图解
spring cloud feign encoder decoder 图解

Spring Cloud Feign 的编码器、解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认encoder实现是SpringEncoder,默认decocer实现是ResponseEntityDecoder,另外还有一些其它的编解码器。

Encoder/ Decoder 实现 说明
JacksonEncoder,JacksonDecoder 基于 Jackson 格式的持久化转换协议
GsonEncoder,GsonDecoder 基于Google GSON 格式的持久化转换协议
SaxEncoder,SaxDecoder 基于XML 格式的Sax 库持久化转换协议
JAXBEncoder,JAXBDecoder 基于XML 格式的JAXB 库持久化转换协议
ResponseEntityEncoder,ResponseEntityDecoder Spring MVC 基于 ResponseEntity< T > 返回格式的转换协议
SpringEncoder,SpringDecoder 基于Spring MVC HttpMessageConverters 一套机制实现的转换协议 ,应用于Spring Cloud 体系中

所以如果希望支持其他的或者自定义格式就需要编写自己的编码器和解码器。若要实现自己的编码器,需要实现 feign.codec.Encoder 接口,解码器需要实现 feign.codec.Decoder 接口,示例如下:

Spring Cloud Feign 为何需要自定义客户端实现?

默认实现性能差,需要优化。

说明

Feign 默认底层通过JDK 的 java.net.HttpURLConnection 实现了feign.Client接口类,在每次发送请求的时候,都会创建新的HttpURLConnection 链接,这也就是为什么默认情况下Feign的性能很差的原因。可以通过拓展该接口,使用Apache HttpClient 或者OkHttp3等基于连接池的高性能Http客户端。

具体实现请参考这篇文章《Spring Cloud Feign 使用OkHttp或HttpClient覆盖默认客户端》。

总结

实际开发中,每个公司都有一些自己的实现,这些东西搭框架时都已经写好了,自己若只是写写业务代码,是涉及不到这块的。

 

+1

发表评论

您的电子邮箱地址不会被公开。