前言

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性能的更多相关文章

  1. springCloud feign使用/优化总结

    基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...

  2. JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能

    摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...

  3. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  4. web性能优化-网络传输性能优化

    浏览器工作原理:https://www.cnblogs.com/thonrt/p/10008220.html 浏览器渲染原理: https://www.cnblogs.com/thonrt/p/100 ...

  5. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

  6. SQL常见优化Sql查询性能的方法有哪些?

    常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...

  7. CSS性能分析,如何优化CSS提高性能

    不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...

  8. 通过 SMB 直通优化文件服务器的性能

    https://technet.microsoft.com/zh-cn/library/hh831487.aspx Windows Server 2012 内置新增功能,称为 SMB 直通,用来支持使 ...

  9. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

随机推荐

  1. ECS服务器搭建Discuz 邮箱设置,报错处理

    背景 自己想做个网站,没那么多精力,然后就看到了discuz.万网买了一个月的ecs Windows server 2008 r2 服务器,就开始着手安装环境.论坛! 建站 第一次使用discuz论坛 ...

  2. web前端(15)—— JavaScript的数据类型,语法规范2

    Object对象 说这个对象之前,如果您对编程语言开发稍微有点了解的话,应该知道面向对象是什么意思,而js也有面向对象一说,就因为如此,js才会这么强大. 什么是面向对象 其实所有支持面向对象的编程语 ...

  3. web前端(1)——了解什么是前端,以及与后端的关系

    简介 1.什么是web前端 说这个之前,我们先了解web前端工程师是干什么的,百度百科的解释: Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript/Flash等各种Web ...

  4. C#解析XML 例子二

    <checkResult> <item> <fmId>XX0001</fmId> <fmItemId>20000RT</fmItemI ...

  5. tesseract-ocr安装问题

    今天安装tesseract-ocr的时候,载了坑,记录一下. 1. 安装时语言库的选择,我把 aditional language data 这一项全选中了,装的时候那叫一个慢啊,差不多3个小时装好的 ...

  6. 表单取消历史保存之autocomplete的用法

    表单取消历史保存之autocomplete的用法 应用场景 浏览器开启了表单自动填充设置后,有些表单中的input元素在添加时会以下拉的形式显示以前填写过的表单,有时候可能会影响用户的使用.比如:da ...

  7. [Hive_add_6] Hive 实现 Word Count

    0. 说明 Hive 通过 explode()函数 和 split()函数 实现 WordConut 1. Hive 实现 Word Count 方式一 1.1 思路 将每一行文本变为 Array 数 ...

  8. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  9. Docker: dockerfile常用关键字

    Dockerfile指令 Dockfile执行和shell命令一行,一行一行执行- 写Dockerfile注意点: 1.           尽量少RUN 2.           多个命令拼接在一起 ...

  10. php实现TXT小说章节解析、小说章节在线阅读

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 要实现TXT文本章节的解析,大概思路是在每个章节加入了特定的字符,然后根据字符的起始位 ...