Netty使用Google Protocol Buffer完成服务器高性能数据传输

一、什么是Google Protocol Buffer(protobuf官方网站

下面是官网给的解释:
Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data. – think XML, but smaller, faster, and simpler.
协议缓冲区是一种和语言无关、平台无关的可扩展机制,用于序列化结构化的数据。相比于xml,它更小,更快,更简单。数据缓冲区常用语通信协议和数据存储。

二、ProtoBuf的性能

序列化测试对比:
Ser Time + Deser Time(ns)

下面两个网站是效率测试实验:

三、使用Intellij IDEA插件自动生成Java类

参考我的另一篇文章:Google Protocol Buffer 的使用(一)

四、Netty和protobuf整合

准备我们的proto文件

syntax = "proto3";
package com.netty.protobuf;
option java_outer_classname = "UserInfoProto";

//用户信息
message UserInfo{
    //姓名
    string name = 1;
    //住址
    repeated Address address= 2;
    //年龄
    uint32 age = 3;
}

//用户常用住址
message Address{
    string addressname = 1;
    uint32 adressno = 2;
}

服务器中设置protobuf编码器和解码器

@Override
protected void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();
    //protobuf解码器
    pipeline.addLast(new ProtobufVarint32FrameDecoder());
    pipeline.addLast(new ProtobufDecoder(UserInfoProto.UserInfo.getDefaultInstance()));
    //protobuf编码器
    pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());
    pipeline.addLast(new ProtobufEncoder());
    pipeline.addLast(new NettyServerHandler());
}
  • ProtobufVarint32FrameDecoder是protobuf方式的解码器,用于解决TCP粘包和拆包问题
  • ProtobufDecoder 中设置我们的proto文件生成的实例,其实就是我们的目标Java类,设置方式为:UserInfoProto.UserInfo.getDefaultInstance()
  • ProtobufVarint32LengthFieldPrepender和ProtobufEncoder是protobuf方式的编码器

处理类中写protobuf数据

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        LOGGER.info("client {} connected.", ctx.channel().remoteAddress());
        UserInfoProto.UserInfo user = UserInfoProto.UserInfo.newBuilder()
                .setName("server")
                .setAge(18)
                .addAddress(
                        UserInfoProto.Address.newBuilder()
                                .setAddressname("beijing 001")
                                .setAdressno(911))
                .build();
        ctx.writeAndFlush(user);
    }
  • 这里通过UserInfoProto.UserInfo.newBuilder()使用的时间其类的建造者模式设置用户相关信息。
  • 再通过ChannelHandlerContext的writeAndFlush方法写用户数据。

处理器中读protobuf数据

    private int count = 0;
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        UserInfoProto.UserInfo message = (UserInfoProto.UserInfo) msg;
        LOGGER.info("server received message {}:{}", ++count, message);
    }
  • channelRead中的Object对象通过解码之后就是一个protobuf类对象,所以可以强转:UserInfoProto.UserInfo message = (UserInfoProto.UserInfo) msg;

五、注意事项(TCP读半包处理)

这里我们只是简单使用了netty自带的ProtobufVarint32FrameDecoder解码器来处理读半包问题,我们还可以自己继承ByteToMessageDecoder类实现一个定制化的解码器。比如我们使用Java客户端和C++服务器通过protobuf协议来通信时,就需要自己实现,同时还需要考虑大端、小端模式的转换问题。

原文地址:https://www.cnblogs.com/monkjavaer/p/11216084.html

时间: 2024-10-11 03:25:04

Netty使用Google Protocol Buffer完成服务器高性能数据传输的相关文章

Google Protocol Buffer 的使用和原理

Google Protocol Buffer 的使用和原理 1.https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 2.参考资料:http://blog.csdn.net/educast/article/details/24764205 3.github源码:https://github.com/google/protobuf 4谷歌:https://developers.google.com/protocol-buffers/

【Google Protocol Buffer】Google Protocol Buffer

http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列化结构数据格式.目前提供了 C++.Java.Python 三种语言的 API. 17 评论: 刘 明, 软件工程师, 上海交大电

Google protocol buffer使用笔记

一 下载 Google下载地址:https://developers.google.com/protocol-buffers/docs/downloads?hl=zh-CN Github下载地址:https://github.com/google/protobuf 我这里下载版本:protobuf-2.6.1.tar.gz 二 编译 1 解压 将上面的压缩包解压到文件夹 protobuf-2.6.1 中. 2 编译 2.1 在protobuf-2.6.1中,找到vsprojects/protob

Google Protocol Buffer项目无法加载解决方案

http://blog.csdn.net/suixiangzhe/article/details/52171313 今天下载Google Protocol Buffer源码研究时发现打开工程后所有项目都提示无法加载,在输出中找到错误提示是未找到导入的项目"C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props",在网上找了资料是说缺少.NET Core 1.0 f

Google Protocol Buffer 协议

1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可以使用该技术来持久化数据或者序列化成网络传输的数据.主要用于数据存储.通信协议等方面.现阶段支持C++.JAVA.Python.Objective-C.C#.Javascript等6种编程语言.Googel 公司 2015-12-31 更新了最新的版本Version 3.0.0-bet

Google Protocol Buffer安装编译及使用

最近玩了玩谷歌的Protocol Buffer,下面就简单介绍下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过12,183 个.proto 文件,他们用于RPC 系统和持续数据存储系统.Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储

eclipse4.4的google protocol buffer的proto文件编辑器Protocol Buffer Editor安装

eclipse4.4的proto文件编辑器Protocol Buffer Editor安装 google protocol buffer 文件编辑器. 插件项目名称为protobuf-dt,是托管在google code上,国内现在已经连接不上google code了,在eclipse市场可以发现该插件,但是不能安装.在github上发现 有人已经做了相关的同步,可以在下面地址下载. 点击打开链接 其他地址也可以. 本人的为eclipse-jee-luna-SR2-win32-x86_64,安装

Google protocol buffer 使用和原理浅析 - 附带进阶使用方式

Protocol Buffer ??Google Protocol Buffer又简称Protobuf,它是一种很高效的结构化数据存储格式,一般用于结构化数据的串行化,简单说就是我们常说的数据序列化.这种序列化的协议非常轻便高效,而且是跨平台的,目前已支持多种主流语言(3.0版本支持C++, JAVA, C#, OC, GO, PYTHON等). ??通过这种方式序列化得到的二进制流数据比传统的XML, JSON等方式的结果都占用更小的空间,并且其解析效率也更高,用于通讯协议或数据存储领域是非常

转Google Protocol Buffer 的使用和原理

Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列化结构数据格式.目前提供了 C++.Java.Python 三种语言的 API. 2010 年 11 月 18 日 内容 简介 一个简单的例子 和其他类似技术的比较 高级应用话题 Protobuf 的更多细节 结束语 参考资料 评论 在