基于NettyRPC通信系统编解码技术研究.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于NettyRPC通信系统编解码技术研究

基于NettyRPC通信系统编解码技术研究   摘要:近年来,面向服务的体系架构(SOA)逐渐成为构建大中型分布式系统的主流方式,远程过程调用(RPC)在其中起着举足轻重的作用。Netty作为一个基于事件驱动的、异步的网络应用框架,能够快捷高效的实现分布式系统间的远程服务调用。该文对Netty编解码器进行分析和研究,并结合消息序列化,提出了一种性能和可靠性更高的编解码方法。   关键词:netty;编解码;序列化;远程过程调用;消息协议   中图分类号:TP311.5 文献标识码:A 文章编号:1009-3044(2017)26-0104-02   Abstract: In recent years, service oriented architecture (SOA) has gradually become the mainstream way to build large and medium-sized distributed systems. Remote procedure call (RPC) plays an important role in it. Netty, as an event driven and asynchronous network application framework, can quickly and efficiently realize remote service invocation among distributed systems. In this paper, the Netty codec is analyzed and studied, and a method of encoding and decoding with higher performance and reliability is proposed combining with message serialization.   Key words: netty;serialization; codec; remote procedure call; message protocol   SUN公司在2002年推出了JDK1.4,基于Java的Socket通信开始支持非阻塞I/O,系统性能和可靠性均得到了很大的提高。但早期的API和类库依然存在一些不完善的地方,特别是对文件系统的处理能力非常薄弱。直到2007年JDK1.7发布,升级后的NIO2.0提供了异步文件通道和异步套接字通道的实现,文件处理能力有了进一步的提升[1-2]。尽管NIO的吞吐量和可靠性相对于传统的BIO(同步阻塞式IO)有了质的飞跃,但其类库和API十分繁杂,使用起来非常困难[3]。再加上粘包拆包、断线重连等可靠性处理的工作量和复杂度都非常大,因此不建议使用NIO原生API进行通信系统的开发。为了简化NIO网络编程,一些开源组织发布了诸如Netty、Mina、Grizzly和xSocket等通信框架。其中,Netty的功能、性能、健壮性、可定制和可扩展行在同类框架中都是首屈一指的,并且已经得到了大量商业项目的成功验证,如阿里巴巴的分布式服务框架Dubbo,Hadoop的RPC框架Avro等[4]。本文基于Netty框架,定义了一种通用的消息结构Message,继承Netty的半包解码器LengthFieldBaseFrameDecoder解码消息以解?QTCP粘包拆包问题,使用protobuf对消息体进行序列化,使通信系统的性能和可靠性均得到了极大的提高。   1 编解码方法   1.1 粘包拆包问题   由于应用层发送消息时写入的字节大小不固定以及IP分片等原因,TCP底层会根据缓冲区的实际情况将单个业务消息拆分成多个包,或者将多个小包封装成一个大包进行发送。接收方有可能一次接收不完整个业务消息或者一次收到几个消息,此时消息解码就会出现异常,不能进行接下来的业务处理和消息回应。TCP粘包拆包无法在底层进行规避,只能通过合理的上层应用协议设计进行处理[5]。常用的解决方案有三种:一是消息定长;二是使用特殊字符对消息进行分割;三是将消息分为消息头和消息体,在消息头中存储消息长度。第一种方案在消息封装上不够灵活,固定创建的缓冲区长度必须大于最长的消息长度,因此在写入较短的消息时会造成资源浪费。第二种方案中使用特殊字符分割消息,如果消息本身就包含了该字符,则不能正确进行解码,存在一定的局限性。本文采用第三种方案,使用消息头描述消息长度。接收方先读取固定长度的消息头,获取其中包含的消息长度,根据消息长度再次(或多次)读取相应长度的字节即读完整个消息,将包中余下的字节缓存起来作为下一个消息的前一部分。   1.2 消息结

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档