使用protostuff自定义编解码器优化springcloud-feign性能

Spring Cloud feign是伪RPC方式解决微服务间的调用。翻看FeignCloudFeign源码,可以看到Feign默认使用HttpUrlConnection; 代码在DefaultFeignLoadBalancedConfiguration 的Client.Default。

这里特意说明下,其他替代方式有OKhttp和HTTPClient,这两种方式有连接池,可以减少创建连接的性能损耗,但是多家实测效果表明,HttpUrlConnection的效率上是最高的,这也是feign默认的原因,如果在轻型应用不考虑速度考虑CPU的情况下,可以考虑替换成OKhttp和HttpClient。

在序列化方面,springboot中HttpMessageConverters 默认使用jackson2方式进行序列化和反序列化。 jackson的效率在于GSON和fastjson之上。

正常情况下使用jackson2支持前后端开发基本没有什么问题,但是如果是微服务间频频通信,使用jackson2序列化和反序列化会占用不少系统资源,并且效率较差。 这里有个git地址来对比各种序列化和反序列化框架的性能 https://github.com/eishay/jvm-serializers/wiki,部分内容如下:


Ser Time+Deser Time (ns)

使用protostuff自定义编解码器优化springcloud-feign性能




Size, Compressed size [light] in bytes

 

使用protostuff自定义编解码器优化springcloud-feign性能

 

 

可见jackson在各种测试中都不占优势,网上现在很多的教程使用protobuf来替换jackson提升feign的性能,但是由于nafos中使用的是更加方便的protostuff,而且由图中可以看出protostuff的性能比protobuf更胜一筹。所以我决定用protostuff来替换。

在feign中,protobuff有默认提供的编解码器,因此参考其他教程使用即可,但是protostuf却没有默认提供,所以我们必须自己动手撸了。

在手撸之前,我们肯定是需要先了解protostuff和feign提供的protobuf编解码器的,毕竟protostuff的编解码器,在网上貌似还没得教程。

Protostuff在这里就不做赘述,可以参考我博客的另一篇文章:https://www.cnblogs.com/tohxyblog/p/8974636.html

 

通过查看feign提供的protobuff编解码器的源码,可以看到他是继承AbstractHttpMessageConverter<Object>,主要实现了supports,readInternal,writeInternal这三个方法。分别是返回类的校验,解码器,和编码器。

代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypyzj.html