使用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)
Size, Compressed size [light] in bytes
可见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这三个方法。分别是返回类的校验,解码器,和编码器。
代码如下:
/**
* @Author 黄新宇
* @Date 2018/10/30 下午1:24
* @Description feign调用中protostuff编解码器
**/
public class ProtostuffHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
private static final Logger logger = LoggerFactory.getLogger(ProtostuffHttpMessageConverter.class); public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
public static final MediaType PROTOBUF; static {
PROTOBUF = new MediaType("application", "x-protobuf", DEFAULT_CHARSET);
} public ProtostuffHttpMessageConverter() {
super(new MediaType[]{PROTOBUF, MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML});
} @Override
protected boolean supports(Class<?> aClass) {
return Object.class.isAssignableFrom(aClass);
} @Override
protected Object readInternal(Class<?> aClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
MediaType contentType = inputMessage.getHeaders().getContentType();
if (contentType == null) {
contentType = PROTOBUF;
}
if (!PROTOBUF.isCompatibleWith(contentType)) {
logger.error("不支持的解码格式,请用x-protobuf作为contentType");
} try {
return ProtoUtil.deserializeFromByte(inputMessage.getBody(),aClass);
} catch (Exception var7) {
throw new HttpMessageNotReadableException("Could not read Protobuf message: " + var7.getMessage(), var7);
}
} @Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
MediaType contentType = outputMessage.getHeaders().getContentType();
if (contentType == null) {
contentType = PROTOBUF;
} Charset charset = contentType.getCharset();
if (charset == null) {
charset = DEFAULT_CHARSET;
} if (!PROTOBUF.isCompatibleWith(contentType)) {
logger.error("不支持的编码格式,请用x-protobuf作为contentType");
} FileCopyUtils.copy(ProtoUtil.serializeToByte(object), outputMessage.getBody()); }
}
用法:
添加如下配置,ProtostuffHttpMessageConverter在nafos.remote.feign.ProtostuffHttpMessageConverter下
然后在需要用protostuff的feignClient上注明configuration = ProtoFeignConfiguration.class)即可
@FeignClient(value = "service",path ="/nafosRemoteCall/test" , configuration = ProtoFeignConfiguration.class)
详细代码请参考nafos-network: https://gitee.com/huangxinyu/BC-NETTYGO

NAFOS
一个基于netty的轻量级高性能服务端框架。
简介
nafos是一个基于netty的高性能服务器框架,其目的在于易上手,易扩展,让开发人员更致力于业务开发。 在前后端分离的web架构上,或者APP,手游,nafos都是一个很不错的选择。
除此之外,sample中也给出了超简单的扩展方案,使得nafos在分布式扩展上能更胜一筹。
文档
特点
- 1、简单易用:通过简单的配置文件即可建立完善的启动方案,然后就可以开心的关注业务代码了;
- 2、串行设计 :单用户的所有请求都是串行进行,完美解决单用户并发问题,减少锁的使用;
- 3、高性能:网络层采用netty作为中间件,同等配置及优化条件下,相比tomcat性能可提升一倍;
- 4、易扩展:整合了springBoot,可完美支持spring大家族系列;
- 5、强兼容: 可单机同时支持HTTP,TCP,websocket等服务,小规模应用下不用多开占用资源;
- 6、工具类丰富:封装所有开发中常见工具类可直接调用;
- 7、房间策略:封装常见游戏的房间策略,开房,比赛,聊天可直接调用,无需多写;
- 8、模块化:多个模块之间相互解耦,喜欢哪个用哪个,不喜欢直接丢弃。
- 9、脚本支持:内有现成的shell脚本可以直接使用,开关机,数据库备份等;
- 10、自带分布式限流器,有IP策略和总流量策略等漏桶限流,抵御攻击。
- 11、自带protostuff的feign编解码器,操作简单的同时可以极大程度优化feign端对端的通信问题。
- 12、封装了kafa和rabbitMQ,工具类一般超简单使用,无需关注内部业务;
- 13、丰富教程:除了详细文档外,在sample模块中还有多模块使用案例,开发无忧~
使用protostuff自定义编解码器优化springcloud-feign性能的更多相关文章
- springCloud feign使用/优化总结
基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...
- JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- web性能优化-网络传输性能优化
浏览器工作原理:https://www.cnblogs.com/thonrt/p/10008220.html 浏览器渲染原理: https://www.cnblogs.com/thonrt/p/100 ...
- 如何快速优化手游性能问题?从UGUI优化说起
WeTest 导读 本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法. 在之前的文 ...
- SQL常见优化Sql查询性能的方法有哪些?
常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...
- CSS性能分析,如何优化CSS提高性能
不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...
- 通过 SMB 直通优化文件服务器的性能
https://technet.microsoft.com/zh-cn/library/hh831487.aspx Windows Server 2012 内置新增功能,称为 SMB 直通,用来支持使 ...
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
随机推荐
- 使用 float 存储小数?
很多程序员就会使用 float 类型来存储小数.sql 的 float 类型和其他大多数编程语言的 float 类型一样, 根据IEEE 754 标准使用二进制格式编码实数数据. 但是很多程序员并不清 ...
- C# 代码中调用 Javascript 代码段以提高应用程序的配置灵活性(使用 Javascript .NET 与 Jint)
一般来说,我们需要在开发应用软件的配置文件中,添加一些参数,用于后续用户根据实际情况,自行调整. 配置参数,可以放在配置文件中.环境变量中.或数据库表中(如果使用了数据库的话).通常,配置数据,以 k ...
- 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core
使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...
- javascript实现的浏览器下载文件
function download(src) { var $a = document.createElement('a'); $a.setAttribute("href", src ...
- MySQL高性能优化实战总结!
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
- windows平台下实现高可用性和可扩展性-ARR和HLB
本文档提供了关于如何将应用程序请求路由(ARR)与硬件负载均衡器一起使用以实现高可用性和可伸缩性的说明性指导.本文采用F5大IP负载均衡器来说明ARR与硬件负载平衡器之间的工作关系. IIS7.0及以 ...
- phpstorm设置背景图片
对于这个问题,其实很简单,连续按两下shift键或者是Ctrl+Shift+A键即可.出来的界面如下: 输入set Background Image命令,出现的界面如下: 然后选择图片, 点击ok,即 ...
- Docker 从入门到实践(一)Docker 简介
读前须知:本教程大部分都是[Docker 从入门到实践 ]一书的知识,有兴趣可以直接观看书籍.同时,借鉴书籍的知识,如有侵权,请告知我,我会删除处理.谢谢. 一.什么是 Docker? Docker ...
- puppet 横向扩展(三)
Table of Contents 1. 概述 2. 实验环境 3. 实验步骤 3.1. 机器B 的配置 3.2. 机器A 的配置 3.3. 测试配置结果 概述 横向扩展实验之三 – 将CA 认证服务 ...
- VS code常用的几个插件
VScode是一个我最近才开始用的编辑器,在此列几个自己在用的插件,以备换机时的需要. auto close tagbeautify css/sass/scss/lessone dark themes ...