为什么选择Kryo?

首先,Kryo的序列化方式,在性能方面是比较好的,和Protobuf差不多,比Java原生的序列化方式快多了。由于本篇文章主要想说明Kryo和Netty的整合,所以关于Kryo序列化的原理请查阅其他文章。

其次,Protobuf是个跨语言的解决方案,需要预先定义schema,然后通过预编译生成代码。如果是Java单语言调用,Kryo是更好的选择,不需要预编译,不需要schema。

使用连接池

Kryo对象非线程安全,但是频繁new会造成巨大的性能损耗,所以应该使用连接池。推荐使用apache的commons-pool2。

使用Kryo序列化对象要注意的地方正常情况下,需要被序列化的对象有默认的无参构造器。

不需要实现Serializable接口。

如果想使用不带无参构造器的对象也能正确反序列化,可以考虑kryo-serializers包,使用其提供的KryoReflectionFactorySupport,会采用jdk的ReflectionFactory反射的生成对象。该方式不需要提供默认的构造器也可以成功反序列化,但是由于不调用构造器,如果在构造器中维护了别的类的状态, 会导致别的类状态失效。所以最佳实践是,构造器最好只用于初始化本类的属性。注意:如果使用KryoReflectionFactorySupport而导致错误,有可能不抛异常,而是状态直接错误,很难调试,建议谨慎使用。

如果调用了List的sublist方法生成的SubList对象,或者使用Arrays.asList方法生成的对象,都不能正确的序列化。仍然可以使用kryo-serializers包所提供的SubListSerializers,ArraysAsListSerializer等完成正确序列化。

对于自定义的特殊类,可以自定义实现FieldSerialier的create方法,并注册到Kryo的实例化对象中去。

使用Kryo作为Netty序列化对象的协议通过实现MessageToByteEncoder接口,实现encode对象

通过实现LengthFieldBasedFrameDecoder接口,实现decode对象

做了一下测试,发送1万次请求,java内置序列化耗时6.776秒,Kryo耗时3.160秒;发送10万次请求,java内置序列化耗时48.555秒,Kryo耗时15.423秒。当然这个数据因环境而异,但是提升效果非常显著。

具体代码可参见:

Kryo序列化部分:https://github.com/terrymanu/miracle-framework/tree/master/miracle-framework-common/miracle-framework-common-serialize

Kryo和Netty整合部分:https://github.com/terrymanu/miracle-framework/tree/master/miracle-framework-remote/miracle-framework-remote-netty

欢迎来到技术之家,

如需转载,烦请保留本文链接和出处:http://www.jszja.com/contents/14/1537.html

您的支持将是我们前进的动力!如对本篇文章有疑问或建议,请通过本站下方邮箱联系我们,让技术之家每天进步一点点!(●'◡'●)

java kryo_通过Kryo的序列化方式提升Netty性能相关推荐

  1. 使用Kryo的序列化方式提升Netty性能

    2019独角兽企业重金招聘Python工程师标准>>> 为什么选择Kryo? 首先,Kryo的序列化方式,在性能方面是比较好的,和Protobuf差不多,比Java原生的序列化方式快 ...

  2. 提升计算机性能的方式,提升电脑性能的几个方法,如果电脑越用越卡,不妨试试看...

    提升电脑性能的几个方法,如果电脑越用越卡,不妨试试看 首先在相同的硬件下,如果要想获得更好的性能肯定会有较高的功耗,所以很多设置对笔记本用户来说就要考虑下了,因为对续航和电池寿命都可能会有影响.除非天 ...

  3. java解析xml文件四种方式介绍、性能比较和基本使用方法

    2019独角兽企业重金招聘Python工程师标准>>> 一.基本介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...

  4. 广播变量kyro_利用Kryo序列化库是你提升Spark性能要做的第一件事

    本文基于Spark2.1.0版本 套用官文Tuning Spark中的一句话作为文章的标题: *Often, choose a serialization type will be the first ...

  5. 【TCP长连接】使用TCP长连接提升服务性能

    1.概述 在<性能优化篇-理论基础>中,我们知道了提升服务性能的两个思路,分别是提升服务并发能力和降低请求的响应时间(RT).一个请求的响应时间包括两部分,等待时间和执行时间.在<性 ...

  6. java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化

    java中的序列化方式: 1. 自带序列化  ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...

  7. Java序列化 - 分析不同序列化方式的优劣

    1.序列化简介 1.1 定义 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据 1.2 序列化的目的 通过序列 ...

  8. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  9. java序列化方式性能比较

    来源:http://john521.iteye.com/blog/1099574 有一个很不错的工具http://github.com/eishay/jvm-serializers/ ,可以用它来评测 ...

  10. 几种Java序列化方式的实现

    0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...

最新文章

  1. perl 中单引号双引号的区别-----perl学习笔记
  2. python 类装饰器 __set___python装饰器代替set get方法实例
  3. python代码案例详解-我用Python抓取了7000 多本电子书案例详解
  4. 变压器轻载是什么意思?
  5. CRM呼叫中心里interaction record的设计逻辑
  6. Oracle优化器:星型转换(Star Query Transformation )
  7. 想要挑战成功的hongjin2
  8. 有mysql文件怎么运行不了_MySQL安装常见问题(找不到文件,系统服务无法启动...)...
  9. order by + 数字的用意
  10. python学生信息管理系统
  11. SAP HANA创建类型(SAP HANA CREATE TYPE):
  12. springcloud之config配置中心
  13. A Belief Propagation Algorithm for Multipath-Based SLAM IEEE TWC2019阅读
  14. P2756 飞行员配对方案问题【二分匹配】【网络流Dinic、EK详解】【萌新初写】
  15. ORAN架构和功能划分
  16. VUE常用问题hack修改
  17. 阿里云 mysql参数_阿里云MYSQL数据库怎么修改参数值?
  18. iOS——调用高德地图SDK
  19. mysql截取字符串后缀_Mysql字符串截取函数SUBSTRING的用法说明
  20. 第三方app受陷,Atlassian 数据被盗

热门文章

  1. 【雅思】【绿宝书错词本】List13~24
  2. JMM,synchronized
  3. 在线翻译PDF文件用什么方法
  4. SAP License:公司上一套sap系统得多少钱?
  5. xxx科技有限公司_公司管理制度
  6. mac ruby 环境变量_Ruby环境设置| 在Mac和Windows操作系统上安装Ruby
  7. iOS开发之高仿斗鱼tv初探
  8. 深入理解Plasma(四)Plasma Cash
  9. java jlist 添加滚动条_JList滚动条问题
  10. eigen求特征值和特征向量