protobuf

ProtoBuf试用与JSON的比较

只愿长相守 提交于 2019-11-26 17:37:11
  介绍      ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具。什么是结构化数据呢,正如字面上表达的,就是带有一定结构的数据。比如电话簿上有很多记录数据,每条记录包含姓名、ID、邮件、电话等,这种结构重复出现。      同类      XML、JSON 也可以用来存储此类结构化数据,但是使用ProtoBuf表示的数据能更加高效,并且将数据压缩得更小。      原理      ProtoBuf 是通过ProtoBuf编译器将与编程语言无关的特有的 .proto 后缀的数据结构文件编译成各个编程语言(Java,C/C++,Python)专用的类文件,然后通过Google提供的各个编程语言的支持库lib即可调用API。(关于proto结构体怎么编写,可自行查阅文档)      ProtoBuf编译器安装      Mac : brew install protobuf      举个例子      1. 先创建一个proto文件      message.proto      syntax = "proto3";      message Person {      int32 id = 1;      string name = 2;      repeated Phone phone = 4;      enum PhoneType {     

Netty相关

☆樱花仙子☆ 提交于 2019-11-26 17:09:42
1.BIO、NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理, BIO是面向流的,NIO是面向缓冲区的;BIO的各种流是阻塞的。而NIO是非阻塞的;BIO的Stream是单向的,而NIO的channel是双向的。 NIO的特点:事件驱动模型、单线程处理多任务、非阻塞I/O,I/O读写不再阻塞,而是返回0、基于block的传输比基于流的传输更高效、更高级的IO函数zero-copy、IO多路复用大大提高了Java网络应用的可伸缩性和实用性。基于Reactor线程模型。 在Reactor模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。如在Reactor中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事件、事件到来,激活分发器,分发器调用事件对应的处理器、事件处理器完成实际的读操作,处理读到的数据,注册新的事件

ios开发cocoaAsyncSocket与protobuf的使用swift5版本,含粘包拆包

社会主义新天地 提交于 2019-11-26 16:35:14
最近搞了一下即时通讯,为了配合服务器的使用(netty4+protobuf3),在ios客户端捣鼓了一下。 在ios客户端使用protobuf的资料比较少,配合cocoaAsyncSocket使用的更少,swift版本的更加少。 在swift版本中有处理protobuf粘包/拆包的资料基本没有。所以分享一下,希望对一些朋友有帮助 1、首先导入必要的包。 这里使用了Carthage作为管理,分别导入cocoaAsyncSocket和protobuf //在swift中使用protobuf需要导入swift-protobuf github "apple/swift-protobuf" ~> 1.0 github "robbiehanson/CocoaAsyncSocket" "master" 如何生成proto文件,这里不介绍,可以自行参考: https://github.com/apple/swift-protobuf 2、直接上关键代码,注释已经写的非常清楚了。 // // SocketClient.swift // BestTravel // // Created by gj on 16/11/1. // // import UIKit import SwiftProtobuf class SocketClient: NSObject{ fileprivate var

Dubbo 在跨语言和协议穿透性方向的探索:支持 HTTP/2 gRPC

半腔热情 提交于 2019-11-26 11:01:04
本文整理自刘军在 Dubbo meetup 成都站分享的《Dubbo 在多语言和协议穿透性方向上的探索》。 本文总体上可分为基础产品简介、Dubbo 对 gRPC (HTTP/2) 和 Protobuf 的支持及示例演示三部分,在简介部分介绍了 Dubbo、HTTP/2、gRPC、Protobuf 的基本概念和特点;第二部分介绍了 Dubbo 为何要支持 gRPC (HTTP/2) 和 Protobuf,以及这种支持为 gRPC 和 Dubbo 开发带来的好处与不同;第三部分通过两个实例分别演示了 Dubbo gRPC 和 Dubbo Protobuf 的使用方式。 基本介绍 Dubbo 协议 从协议层面展开,以下是当前 2.7 版本支持的 Dubbo 协议: 众所周知,Dubbo 协议是直接定义在 TCP 传输层协议之上,由于 TCP 高可靠全双工的特点,为 Dubbo 协议的定义提供了最大的灵活性,但同时也正是因为这样的灵活性,RPC 协议普遍都是定制化的私有协议,Dubbo 同样也面临这个问题。在这里我们着重讲一下 Dubbo 在协议通用性方面值得改进的地方,关于协议详细解析请参见官网博客。 Dubbo 协议体 Body 中有一个可扩展的 attachments 部分,这给 RPC 方法之外额外传递附加属性提供了可能,是一个很好的设计。但是类似的 Header 部分

golang 报错 undefined: proto.InternalMessageInfo

五迷三道 提交于 2019-11-26 03:43:12
问题原因: 新的版本加入了InternalMessageInfo导致编译不过 解决方法: 1、使用旧版本的插件,即手动下载并安装protoc-gen-go版本v1.1.0 (https://github.com/golang/protobuf/releases/tag/v1.0.0)来生成旧风格的原型代码。 方法:tar zxvf protobuf-1.0.0.tar.gz cd protobuf-1.0.0/protoc-gen-go go build 将生成的protoc-gen-go放入$GOROOT/bin目录下,重新编译protobuf文件 protoc xxx.proto --go_out=. 重新编译项目,问题解决 2、使用正确的依赖版本:您的项目依赖项中应该有github.com/golang/protobuf 目录, 将其替换为最新版本(v1.2.0),下载地址: https://github.com/golang/protobuf/releases, 即将下载的目录替换项目中的github.com/golang/protobuf目录,问题解决。 经测试2种方法都可行。 来源: CSDN 作者: ferghs 链接: https://blog.csdn.net/busai2/article/details/82805788

gRPC快速入门(二)——Protobuf序列化原理解析

对着背影说爱祢 提交于 2019-11-26 00:53:44
gRPC快速入门(二)——Protobuf序列化原理解析 一、Protobuf序列化原理简介 1、序列化 序列化是将数据结构或对象转换成二进制字节流的过程。 Protobuf对于不同的字段类型采用不同的编码方式和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩。 Protobuf序列化过程如下: (1)判断每个字段是否有设置值,有值才进行编码。 (2)根据字段标识号与数据类型将字段值通过不同的编码方式进行编码。 (3)将编码后的数据块按照字段类型采用不同的数据存储方式封装成二进制数据流。 2、反序列化 反序列化是将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程。 Protobuf反序列化过程如下: (1)调用消息类的parseFrom(input)解析从输入流读入的二进制字节数据流。 (2)将解析出来的数据按照指定的格式读取到Java、C++、Phyton对应的结构类型中。 二、Protobuf编码方式 1、Varint编码 Varint编码是一种变长的编码方式,编码原理是用字节表示数字,值越小的数字,使用越少的字节数表示。因此,可以通过减少表示数字的字节数进行数据压缩。 对int32类型的数字,一般需要4个字节表示。如果采用Varint编码,对于很小的int32类型数字,则可以用1个字节来表示;虽然大的数字会需要5个字节来表示,但大多数情况下

gRPC HelloWorld测试

风流意气都作罢 提交于 2019-11-26 00:23:57
一、概述 What's gRPC? gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.(gRPC是可以在任何环境中运行的现代的开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。) 我们可以用一句话来概括:A high-performance, open-source universal RPC framework RPC

golang Protobuf学习

我的未来我决定 提交于 2019-11-25 23:21:32
   protobuf是一种高效的数据传输格式(Google's data interchange format),且与语言无关,protobuf和json是基于http服务中最常见的两种数据格式。今天来学习基于golang的protobuf相关内容。 google protocol buffer: https://developers.google.com/protocol-buffers/ golang 官方提供的protobuf支持插件: https://github.com/golang/protobuf 要想使用protobuf,需要4步: 下载安装google protocol buffer 编译器: https://github.com/google/protobuf/releases/tag/v3.5.1 下载安装golang protobuf plugin: https://github.com/golang/protobuf 使用go tools安装:go get -u github.com/golang/protobuf/protoc-gen-go 按照protobuf 语法规则编写.proto文件 将proto文件编译成golang代码模型 protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook

Protobuf协议精品应用

与世无争的帅哥 提交于 2019-11-25 23:10:42
  Protobuf应用广泛,尤其作为网络通讯协议最为普遍。本文将详细描述几个让人眼前一亮的protobuf协议设计,对准备应用或已经应用protobuf的开发者会有所启发,甚至可以直接拿过去用。 这里描述的协议设计被用于生产环境的即时通讯、埋点数据采集、消息推送、redis和mysql数据代理。   Bwar从2013年开始应用protobuf,2014年设计了用于mysql数据代理的protobuf协议,2015年设计了用于即时通讯的protobuf协议。高性能C++ IoC网络框架Nebula https://github.com/Bwar/Nebula 把这几个protobuf协议设计应用到了极致。 1. TCP通讯协议设计   本协议设计于2015年,用于一个生产环境的IM和埋点数据采集及实时分析,2016年又延伸发展了基于protobuf3的版本并用于开源网络框架 Nebula 。基于protobuf2和protobuf3的有较少差别,这里分开讲解两个版本的协议设计。 1.1. protobuf2.5版Msg   2015年尚无protobuf3的release版本,protobuf2版本的fixed32类型是固定占用4个字节的,非常适合用于网络通讯协议设计。Bwar设计用于IM系统的协议包括两个protobuf message:MsgHead和MsgBody

layabox - protobuf 完整

我的梦境 提交于 2019-11-25 20:25:58
安装nodejs 然后在命令行输入 npm install protobufjs@6.8.4 -g npm install @egret/protobuf -g 接着前往你安装nodejs的路径里面找到@egret\protobuf(这个是node需要安装的,这里不介绍) 例如:我自己的路径 E:\Program Files\nodejs\node_global\node_modules\@egret\protobuf\dist 1 将dist拷贝到你自己的项目protobuf文件夹存放,然后创建一个文件夹protofile用来存放proto文件 最后打开终端 cd到G:\program\ProtobufTest\bin目录下 pb-egret generate 就可以直接生成了 前提条件: 创建protofile文件夹并且在里面放入一个.prorto文件 也可以创建.bat文件 @echo off echo pb-egret generate 开始 pb-egret generate echo pb-egret generate 结束 pause 最后在这儿添加导入的两个文件 顺序不能换 使用详细可以参考 https://blog.csdn.net/JunChow520/article/details/103031131 每次生成新.proto文件后 用protobuf下面的文件