关于protobuf:protobuf2-消息类型

根本数据类型syntax = "proto3";// 所有根本数据类型// protoc --go_out=. scalar.protooption go_package = "../service";message scalar{ double filed1 = 1; //float64 float field2 = 2; //float32 int32 field3 = 3; //int32 int64 field4 = 4; //int64 uint32 field5 = 5; //uint32 uint64 field6 = 6; //uint64 sint32 field7 = 7; //int32 sint64 field8 = 8; //int64 fixed32 field9 = 9; //uint32 fixed64 field10 = 10; //uint64 sfixed32 field11 = 11; //int32 sfixed64 field12 = 12; //int64 bool field13 = 13; //bool string field14 = 14; //string bytes field15 = 15; //[]byte}生成的go代码 ...

August 5, 2022 · 2 min · jiezi

关于protobuf:protobuf1安装

装置protoc依据本人的服务器版本进行下载安装,下载地址 https://github.com/protocolbu... $ uname -aLinux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux$ wget wget https://github.com/protocolbuffers/protobuf/releases/download/v21.4/protoc-21.4-linux-x86_64.zip$ unzip -d protoc-21.4-linux-x86_64 protoc-21.4-linux-x86_64.zip$ cd protoc-21.4-linux-x86_64/bin/$ mv protoc /usr/local/bin// 查看是否装置胜利$ protoc --versionlibprotoc 3.21.4装置protoc-gen-gogo语言中将.proto 转化为go代码 go get -u github.com/golang/protobuf/protoc-gen-go测试代码https://github.com/tim1116/go...

August 3, 2022 · 1 min · jiezi

关于protobuf:API-工程化分享

概要本文是学习B站毛剑老师的《API 工程化分享》的学习笔记,分享了 gRPC 中的 Proto 治理形式,Proto 分仓源码形式,Proto 独立同步形式,Proto git submodules 形式,Proto 我的项目布局,Proto Errors,服务端和客户端的 Proto Errors,Proto 文档等等 目录Proto IDL ManagementIDL Project LayoutIDL ErrorsIDL DocsProto IDL ManagementProto IDLProto 治理形式Proto 分仓源码形式Proto 独立同步形式Proto git submodules 形式Proto IDLgRPC 从协定缓冲区应用接口定义语言 (IDL)。协定缓冲区 IDL 是一种与平台无关的自定义语言,具备凋谢标准。 开发人员会创作 .proto 文件,用于形容服务及其输出和输入。 而后,这些 .proto 文件可用于为客户端和服务器生成特定于语言或平台的存根,使多个不同的平台可进行通信。 通过共享 .proto 文件,团队可生成代码来应用彼此的服务,而无需采纳代码依赖项。 Proto 治理形式煎鱼的一篇文章:真是头疼,Proto 代码到底放哪里? 文章中通过多轮探讨对 Proto 的存储形式和对应带来的优缺点,一共有如下几种计划: 代码仓库独立仓库集中仓库镜像仓库镜像仓库 在我本人的微服务仓库外面,有一个 Proto 目录,就是放我本人的 Proto,而后在我提交我的微服务代码到骨干或者某个分支的时候,它可能触发一个 mirror 叫做主动同步,会镜像到这个集中的仓库,它会帮你复制过来,相当于说我不须要把我的源码的 Proto 凋谢给你,同时还会主动复制一份到集中的仓库 在煎鱼的文章外面的集中仓库还是分了仓库的,B站大仓是一个对立的仓库。为什么呢?因为比如像谷歌云它整个对外的 API 会在一个仓库,不然你让用户怎么找?到底要去哪个 GitHub 上来找?有这么多 project 怎么找?基本找不到,应该建对立的一个仓库,一个我的项目就搞定了 咱们最早衍生这个想法是因为无心中看到了 Google APIs 这个仓库。大仓能够解决很多问题,包含高度代码共享,其实对于 API 文件也是一样的,集中在一个 Repo 外面,很不便去检索,去查阅,甚至看文档,都很不便 ...

May 15, 2022 · 4 min · jiezi

关于protobuf:Protobuf通信协议

前言在挪动互联网时代,手机流量、电量是最为无限的资源,而挪动端的即时通讯利用无疑必须得直面这两点。 解决流量过大的根本办法就是应用高度压缩的通信协议,而数据压缩后流量减小带来的天然后果也就是省电:因为大数据量的传输必然须要更久的网络操作、数据序列化及反序列化操作,这些都是电量耗费过快的本源。 以后即时通讯利用中最热门的通信协议无疑就是Google的Protobuf了,基于它的优良体现,微信和手机QQ这样的支流IM利用也早已在应用它。 Protobuf简介什么是 Google Protocol Buffer? 如果您在网上搜寻,应该会失去相似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google 公司外部的混合语言数据规范,目前曾经正在应用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 零碎和继续数据存储系统。 Protocol Buffers 是一种轻便高效的结构化数据存储格局,能够用于结构化数据串行化,或者说序列化。它很适宜做数据存储或 RPC 数据交换格局。可用于通信协定、数据存储等畛域的语言无关、平台无关、可扩大的序列化构造数据格式。目前提供了 C++、Java、Python 三种语言的 API(即时通讯网注:Protobuf官网工程主页上显示的已反对的开发语言多达10种,别离有:C++、Java、Python、Objective-C、C#、JavaNano、JavaScript、Ruby、Go、PHP,基本上支流的语言都已反对,详见工程主页:https://github.com/52im/protobuf)。 装置 Google Protocol Buffer在网站 https://github.com/52im/protobuf 上能够下载 Protobuf 的源代码。而后解压编译装置便能够应用它了。 装置步骤如下所示: tar -xzf protobuf-2.1.0.tar.gz cd protobuf-2.1.0 ./configure --prefix=$INSTALL_DIR makemake check make install和其余相似技术的比拟简略说来 Protobuf 的次要长处就是:简略,快。 Total Time 指一个对象操作的整个工夫,包含创建对象,将对象序列化为内存中的字节序列,而后再反序列化的整个过程。从测试后果能够看到 Protobuf 的问题很好,感兴趣的读者能够自行到网站 https://github.com/eishay/jvm...上理解更具体的测试后果。

April 19, 2022 · 1 min · jiezi

关于protobuf:Proto-代码到底放哪里

尽管公司曾经从大单体切换为微服务化有肯定的年头了,但一些细节方面的解决总会有不同的人有不同的认识,这其中一个探讨点,就是 Proto 这个 IDL 的代码到底放在哪里? 目前来看,一共有如下计划, 咱们一起来探讨一下 Proto 的存储形式和对应带来的优缺点。 计划一:寄存在代码仓库间接将我的项目所依赖到的所有 Proto 文件都寄存在 proto/ 目录下,不通过开发工具的主动拉取和公布: 毛病我的项目所有依赖的 Proto 都存储在代码仓库下,因而所有依赖 Proto 都须要人工的向其它业务组 “要” 来,再放到 proto/ 目录下,人工染指极度麻烦。Proto 降级和变更,常常要反复第一步,沟通老本高。长处我的项目所有依赖的 Proto 都存储在代码仓库下,因而不波及集体开仓库权限的问题。多 Proto 的切换开销缩小,因为都在代码仓库下,不须要看这看那。计划二:独立仓库独立仓库存储是咱们最早采取的形式,也就是每个服务对应配套一个 Proto 仓库: 这个计划的益处就是能够独立治理所有 Proto 仓库,并且权限划分清晰。但最大的长处也是最大的毛病,因为一个服务会依赖多个 Proto 仓库,并且存在跨业务组调用的状况: 如上图所示,svc-user 服务别离依赖了三块 Proto 仓库,别离是本人组的、业务组 A、业务组 B 总共的 6 个 Proto 仓库。 毛病假如你是一个新入职的开发人员,那么你就须要找不同的业务组申请不同的仓库权限,十分麻烦。如果没有批量赋权工具,也没有管理者权限,那么就须要一个个赋权,十分麻烦。在运行服务的时候,你须要将所有相关联的 Proto 仓库拉取下来,如果没有工具做半自动化的反对,麻烦水平无法忍受。长处使得安全性较高(但 IDL 自身没有太多的机密)。按需拉取,不须要关注其余的服务 Proto。计划三:集中仓库集中仓库也是一些公司思考的形式之一,是按公司或大事业部的维度进行 Proto 代码的存储,这样子只须要拉取一个仓库,就能够获取到所有所需的 IDL: 毛病安全性降落,因为其它业务组的 IDL 也全都 “泄露” 了。非按需拉取,在查看原始文件时,须要关注一些多余的。长处只须要拉取一次 Proto 仓库就能够轻松把一个服务所需的 IDL 集齐。仓库权限治理的复杂度降落。计划四:镜像仓库联合下面几种计划的特点,咱们也能够得出镜像仓库的形式,也就是本人服务的 Proto 文件寄存在代码仓库的 proto 文件中,在本次 feature 提交或公布后,主动同步到镜像仓库去。 ...

December 9, 2021 · 1 min · jiezi

关于protobuf:•-a-gopackage-option-in-the-proto-source-file

接着上一章讲,在编写将proto文件生成pb文件脚本提醒一下无关go_package谬误问题,问题详情如下所示。 Please specify either: • a "go_package" option in the .proto source file, or • a "M" argument on the command line.这是因为在 proto3 的语法中短少了 option go_package。 解决方案:在syntax="proto3";下一行增加option go_package配置项。 option go_package = "ofc_app;pb_ofc_app_v1";go_package是有两局部组成,这两局部是由";"隔开的。前边局部示意生成pb文件的门路,后边局部示意pb文件的包名。 最初在protobuf下生成了ofc_app文件夹,以及对应的pb文件。关上生成pb文件,包名即为go_package后半局部内容。

November 12, 2021 · 1 min · jiezi

关于protobuf:protocol-buffer的高效编码方式

简介protocol buffer这种优良的编码方式,到底底层是怎么工作的呢?为什么它能够实现高效疾速的数据传输呢?这所有都要从它的编码方式说起。 定义一个简略的message咱们晓得protocol buffer的主体就是message,接下来咱们从一个简略的message登程,具体解说protobuf中的编码方式。 比方上面的一个非常简单的音讯对象: message Student { optional int32 age = 1;}在下面的例子中,咱们定义了一个Student音讯对象,并给他定义了一个名叫age的字段,并给它设置一个值叫做22。而后应用protobuf将其进行序列化,这么大的一个对象,对其序列化之后的字节如下所示: 08 96 00很简略,应用三个字节就能够示意一个messag对象,数据量十分小。 那么这三个字节到底示意什么意思呢?一起来看看吧 。 Base 128 Varints在解释下面的三个字节的含意之前,咱们须要理解一个varints的概念。 什么叫Varints呢?就是序列化整数的时候,占用的空间大小是不一样的,小的整数占用的空间小,大的整数占用的空间大,这样不必固定一个具体的长度,能够缩小数据的长度,然而会带来解析的复杂度。 那么怎么晓得这个数据到底须要几个byte呢?在protobuf中,每个byte的最高位是一个判断位,如果这个位被置位1,则示意前面一个byte和该byte是一起的,示意同一个数,如果这个位被置位0,则示意前面一个byte和该byte没有关系,数据到这个byte就完结了。 举个例子,一个byte是8位,如果示意的是整数1,那么能够用上面的byte来示意: 0000 0001如果一个byte装不下的整数,那么就须要应用多个byte来进行连贯操作,比方上面的数据表示的是300: 1010 1100 0000 0010为什么是300呢?首先看第一个byte,它的首位是1,示意前面还有一个byte。再看第二个byte,它的首位是0,示意到此就完结了。咱们把判断位去掉,变成上面的数字: 010 1100 000 0010这时候还不能计算数据的值,因为在protobuf中,byte的位数是反过来的,所以咱们须要把下面的两个byte替换一下地位: 000 0010 010 1100 也就是: 10 010 1100 =256 + 32 + 8 + 4 = 300 音讯体的构造从message的定义能够晓得,protobuf中的音讯体的构造是key=value的模式,其中的key就是message中定义的字段的整数值1,2,3,4等。而value就是真正对其设置的值。 当一个音讯被编码之后,这些key和value会被连贯在一起,组成一个byte stream。当要对其进行解析的时候,须要定位到key和value的具体长度,所以在key中须要蕴含两局部,第一个局部就是字段在proto文件中的值,第二个局部就是value局部占用的长度大小。 只有通过这两个局部的值联合起来,解析器才可能正确的对字段进行解析。 key的这种格局,被称为 wire types,有哪些 wire types呢?咱们看一下: 类型含意应用场景0Varintint32, int64, uint32, uint64, sint32, sint64, bool, enum164-bitfixed64, sfixed64, double2Length-delimitedstring, bytes, embedded messages, packed repeated fields3Start groupgroups (deprecated)4End groupgroups (deprecated)532-bitfixed32, sfixed32, float能够看到除了3,4两种类型之外,其余的类型能够分为三类,一类是固定长度的类型,如1,5,他们别离是64位和32位的数字。 ...

August 24, 2021 · 1 min · jiezi

关于protobuf:抖音直播protobuf

protobuf 之前有说过,就不再反复了。可回顾《万方protobuf协定申请案例》。 原文链接:https://blog.csdn.net/weixin_... 查看 common-utils-message.979d96f7.js 中的办法 var d = (new Map). set("WebcastDiggMessage", "DiggMessage"). set("WebcastFansclubMessage", "FansclubMessage"). set("WebcastScreenChatMessage", "ScreenChatMessage"). set("WebcastControlMessage", "ControlMessage"). set("WebcastSocialMessage", "SocialMessage"). set("WebcastRoomMessage", "RoomMessage"). set("WebcastFansclubStatisticsMessage", "FansclubStatisticsMessage" set("WebcastRoomVerifyMessage", "RoomVerifyMessage"). set("WebcastNoticeMessage", "NoticeMessage"). set("WebcastNobleUpgradeMessage", "NobleUpgradeMessage"). set("WebcastImDeleteMessage", "ImDeleteMessage"). set("WebcastSunDailyRegionRankMessage","SunDailyRankMessage"). set("WebcastSunDailyRankMessage", "SunDailyRankMessage"). set("WebcastRoomUserSeqMessage", "RoomUserSeqMessage"). set("WebcastVerificationCodeMessage", "VerificationCodeMessage"). set("WebcastLinkMicMethod", "LinkMicMethod"). set("WebcastLinkMicBattleMethod", "LinkMicBattle") .set("WebcastLinkMicBattleFinishMethod", "LinkMicBattleFinish"). set("WebcastRoomNotifyMessage", "NotifyMessage"). set("WebcastLinkMicSignalingMethod", "LinkMicSignalingMethod"). set("WebcastLotteryEventMessage", "LotteryEventMessage"). set("WebcastUploadCoverMessage", "UploadCoverMessage"). set("WebcastCategoryChangeMessage", "CategoryChangeMessage"). set("WebcastRoomChallengeMessage", "RoomChallengeMessage"). set("WebcastLikeMessage", "LikeMessage"). set("WebcastLinkMicArmiesMethod", "LinkMicArmies"). set("WebcastGameInviteMessage", "GameInviteMessage"). set("WebcastQuizStartMessage", "QuizStartMessage"). set("WebcastQuizResultMessage", "QuizResultMessage"). set("WebcastQuizChangeMessage", "QuizChangeMessage"). set("WebcastQuizBeginMessage", "QuizBeginMessage"). set("WebcastOChannelAnchorMessage", "OChannelAnchorMessage"). set("WebcastOChannelModifyMessage", "OChannelModifyMessage"). set("WebcastLinkMicOChannelKickOutMsg", "LinkMicOChannelKickOutMsg"). set("WebcastLinkMicOChannelNotifyMsg", "LinkMicOChannelNotifyMsg"). set("WebcastRoomIntroMessage", "RoomIntroMessage"). set("WebcastGroupShowUserUpdateMessage", "GroupShowUserUpdateMessage");依据Js中的代码,定义proto文件 ...

August 13, 2021 · 1 min · jiezi

关于protobuf:Protocol-Buffers一款比xml快100倍的序列化框架

咱们通常习惯用Json、XML等模式的数据存储格局,但置信还有很多人没有据说过Protocol Buffer(简称protobuf)。protobuf是Google开源的一个语言无关、平台无关的通信协议,其玲珑、高效和敌对的兼容性设计,使其被宽泛应用。性能比Json、XML真的强太多了! 而且,随着微服务架构的风行,RPC框架也成为服务框架的重要组成部分。在很多RPC的设计中,都采纳了高性能的编解码技术,而protobuf就属于其中的佼佼者。 也就说,要想深刻理解微服务架构中的RPC环节底层实现,设计出高效的传输、序列化、编码解码等性能,学习protobuf的应用和原理十分有必要。 protobuf简介protobuf是一种序列化对象框架(或者说是编解码框架)。它有两局部性能组成:结构化数据(数据存储构造)和序列化&反序列化。 其中数据存储构造的作用与XML、JSON类似;序列化和反序列化的作用与Java自带的序列化、Facebook的Thrift和JBoss Marshalling等类似。 总之:protobuf是通过定义结构化数据,并提供对数据的序列化和反序列化性能,从而实现数据存储/RPC数据交换的性能。 它的特点是: 语言无关、平台无关简洁高性能(序列化速度快 & 序列化后的数据体积小)良好的兼容性能够通过数据直观的看一下不同框架在序列化响应工夫上的比照: 能够看出,protobuf的性能要远高于其余框架。 protobuf的应用流程下面介绍了protobuf的性能,但仅仅晓得这些性能咱们无奈晓得它是怎么应用的。看了网上很多的文章,要么间接开始写代码要么间接开始剖析报文格式,对于老手来说往往会一头雾水。 所以,咱们先来梳理一下应用protobuf的步骤。 在上图中将protobuf的应用分了四个步骤: 步骤一,搭建环境:应用protobuf要定义通信的数据结构,并编译生成不同的编程语言代码,这就须要有这么一个编译器的环境。步骤二,构建数据:应用protobuf是要传输数据的,那么数据蕴含什么,有哪些项目,整个构造档次是什么样子的。这里基于protobuf的语法来进行数据结构的定义。步骤三,我的项目集成:集成pom依赖(Java为例)、集成编译的Java类(对照proto文件);步骤四,具体应用:通过集成进来的Java类,来构建音讯、赋值,而后基于protobuf进行序列化,接管方进行反序列化操作;理解了上述步骤,上面就针对具体的步骤来进行实战演示。 这里演示基于Mac OS操作系统和Java编程语言来进行操作。如果你应用的是其余操作系统和编程语言,基本思路一样,在不同的步骤时可针对性的找一下具体操作。 装置Protocol Buffers装置protobuf是为了进行数据结构的定义和对应编程语言代码的生成。通常有两种形式:本地装置和IDE插件。咱们先来看本地装置。 protobuf的代码是托管在GitHub上的,对应地址为:https://github.com/protocolbu... 。 点击我的项目左边的release链接可看到对应版本:https://github.com/protocolbu... 。 这里蕴含了各种编程语言、环境的版本。本文选protobuf-java-3.17.3.zip版本。 在Mac操作系统下,须要先装置一下依赖组件,才可能对protobuf进行编译和装置。 装置依赖组件: // 装置 Protocol Buffer依赖// 注:Protocol Buffer依赖于autoconf、automake、libtool、curlbrew install autoconf automake libtool curl解压protobuf-java-3.17.3.zip,进入根目录,执行以下命令: // 运行autogen.sh脚本./autogen.sh// 运行configure.sh脚本./configure // 编译未编译的依赖包make // 查看依赖包是否残缺make check // 开始装置Protocol Buffermake install装置实现,测验版本: $protoc --versionlibprotoc 3.14.0输入版本信息,阐明装置胜利。 这里的protoc命令就是Protocol Buffer的编译器,能够将 .proto文件编译成对应平台的头文件和源代码文件。 另外一种形式就是装置IDE插件,这里以IDEA为例,搜寻插件: 对于protobuf的插件比拟多,抉择适宜本人就行。 而后gRPC官网举荐了一种更优雅的应用姿态,能够通过maven轻松搞定(需装置上图中的“Protobuf Support”插件)。也就是引入grpc的一些组件,而后在maven的build中进行配置,编译proto文件成为Java代码。此种形式临时不开展,后续可间接看我的项目集成局部的源代码。 构建数据在Java中,如果通过JSON来传输一个数据,咱们首先要定义一个对象,这里以Person为例: public class Person { private String name; private Integer id; // ... getter/setter}那么,如果用protobuf来定义Person这个对象的数据结构是什么样呢? ...

August 3, 2021 · 2 min · jiezi

关于protobuf:gozero框架工具安装

一、goctl装置运行如下命令 GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl配置文件 sudo vim /etc/paths在最初一行增加$GOPATH/bin二、protoc-gen-go装置在$GOPATH下的src目录下下载protobuf源码:git clone mailto:git@github.com:protocolbuffers/protobuf.git进入到protoc-gen-go目录下,执行如下go build和go install命令。执行命令后会在$GOPATH/bin目录下主动生成protoc-gen-go可执行文件。如果源码不在src目录下,生成protoc-gen-go可执行文件后须要将该文件移到$GOPATH/bin目录下,否则会报找不到可执行文件的谬误。三、protoc装置下载源码:https://github.com/protocolbu...解压后进入到源码下的bin目录,找到protoc二进制文件,把protoc文件挪动到$GOPATH/bin目录执行protoc --version查看时候装置胜利

July 20, 2021 · 1 min · jiezi

关于protobuf:Mac上使用protoc编译报错

执行protoc -I=. --go_out=paths=source_relative:gen/go trip.proto命令报错, 错误信息如下: protoc-gen-go: program not found or is not executablePlease specify a program using absolute path or make sure the program is available in your PATH system variable--go_out: protoc-gen-go: Plugin failed with status code 1.解决方案:1.找到protoc-gen-go 文件,执行以下命令,该文件通过go get装置时会装置在$GOPATH/go/bin目录下cp protoc-gen-go /usr/local/bin/2.而后vim ~/.zshrc, 新增上面这一行(貌似我发现这一步能够不要, 执行完第一步当前就能够编译了...)export GOPATH=$HOME/go PATH=$PATH:$GOPATH/bin之后source ~/. zshrc即可

July 20, 2021 · 1 min · jiezi

关于游戏:GolangProtobufPixieJS-开发-Web-多人在线射击游戏原创翻译

简介Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发。 规定很简略:捣毁挪动的物体,不要被其余玩家和小行星杀死。你领有两种资源 — 生命值(health points)和能量值(energy points)。每次撞击和与小行星的接触都会让你失去生命值。在射击和应用晋升驱动时会耗费能量值。你杀死的对象越多,你的生命值条就会越长。 技术栈游戏分为两个局部:一个地方服务器(central server)和一个在每个客户端的浏览器中运行的前端应用程序(a front end app)。 咱们之所以抉择这个我的项目,次要是因为后端局部。 咱们心愿它是一个能够同时产生许多事件的中央:游戏模仿(game simulation),客户端网络通信(client network communication),统计信息(statistics),监督(monitoring)等等。 所有这些都应该并行高效地运行。因而,Go 以并发为导向的办法和轻量级的形式仿佛是实现此工作的现实工具。 前端局部尽管很重要,但并不是咱们的次要关注点。然而,咱们也发现了一些潜在的乏味问题,如如何利用显卡渲染动画或如何做客户端预测,以使游戏运行安稳和良好。最初咱们决定尝试蕴含:JavaScript, webpack 和 PixieJS 的堆栈。 在本文的其余部分中,我将探讨后端局部,而客户端应用程序将留待当前探讨。 游戏状态主控模仿 - 在一个中央,而且只有一个中央Superstellar 是一款多人游戏,所以咱们须要一个逻辑来决定游戏世界的以后状态及其变动。它应该理解所有客户端的动作,并对产生的事件做出最终决定 — 例如,炮弹是否击中目标或两个物体碰撞的后果是什么。咱们不能让客户端这样做,因为可能会产生两个人对是否有人被枪杀的判断不同。更不用说那些想要破解协定并取得非法劣势的歹意玩家了。因而,存储游戏状态并决定其变动的最佳地位是服务器自身。 上面是服务器工作形式的总体概述。它同时运行三种不同类型的动作: 侦听来自客户端的管制输出运行仿真模仿(simulation)以将状态更新到下一个工夫点向客户端发送以后状态更新 下图显示了飞船的状态和用户输出构造的简化版本。 用户能够随时发送音讯,因而能够批改用户输出构造。仿真步骤每 20 毫秒唤醒一次,并执行两个操作。 首先,它须要用户输出并更新状态(例如,如果用户启用了推力,则减少加速度)。 而后,它获取状态(在 t 时刻)并将其转换为工夫的下一个时刻(t + 1)。 整个过程反复进行。 在 Go 中实现这种并行逻辑非常容易 — 多亏了它的并发个性。每个逻辑都在其本人的 goroutine 中运行,并侦听某些通道(channel),以便从客户端获取数据或同步到 tickers,以定义模仿步骤(simulations steps)的速度或将更新发送回客户端。咱们也不用放心并行性 - Go 会主动利用所有可用的 CPU 内核。goroutine 和通道(channels)的概念很简略,然而功能强大。 与客户端通信服务器通过 websockets 与客户端通信。因为有了 Gorilla web toolkit,在 Golang 应用 websockets 既简略又牢靠。还有一个原生的 websocket 库,然而它的官网文档说它目前短少一些个性,因而举荐应用 Gorilla。 ...

April 9, 2021 · 2 min · jiezi

关于protobuf:mac安装包安装-protoc

1.下载指定版本安装包 https://github.com/protocolbu...,以protobuf-cpp-3.15.6.tar.gz为例。 cd /usr/local/libwget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.6/protobuf-cpp-3.15.6.tar.gz2.下载下来后解压压缩包,并进入目录 tar -xzvf protobuf-cpp-3.15.6.tar.gzcd protobuf-cpp-3.15.63.设置编译目录 ./configure --prefix=/usr/local/protobuf4.装置检测 make check 5.装置及编译 make && make install6.配置环境变量 vim ~/.bash_profile在文件结尾增加环境变量 export PROTOBUF=/usr/local/protobuf export PATH=$PATH:$PROTOBUF/bin应用source命令,使配置文件失效 source ~/.bash_profile7.测试依照后果 protoc --version

March 29, 2021 · 1 min · jiezi

关于protobuf:Protobuf专题四proto开发神器Jprotobuf

0 前言在JAVA团队外部交互数据时,有几种罕用的办法,比方JAVA原生序列化办法、Json序列化办法、Protobuf序列化办法等,比照试验详见:几种序列化形式的性能比拟。 从比照试验可知protobuf性能最佳,因为其高效的序列化性能以及优良的跨平台能力,被广泛应用于跨平台之间的数据交互。但在不须要思考跨平台的数据交互时,protobuf的繁琐流程成了烦人的“污点”。 基于ptoro传输数据的个别流程是,先编写proto文件,再手动编译proto文件生成java类,而后实例化java类并填充数据,最初编译成二进制数据进行传输。其中编写及手动编译proto文件是个较繁琐的过程(比方简单我的项目中proto之间的互相援用),而且由proto生成的java类应用的是创建者模式(即Bulider模式),其实例化后的赋值过程与我的项目历史代码格调不统一,为带来较大的改变。 为解决这个问题,本文将介绍百度团队开发的Jprotobuf工具,并总结应用过程中的注意事项,以及通过试验验证其与谷歌团队开发的Protobuf性能的一致性。 1 Jprotobuf介绍1.1 定义jprotobuf是针对JAVA程序开发一套繁难类库,目标是简化JAVA语言对protobuf类库的应用。应用jprotobuf能够无需再去理解proto文件操作与语法,间接应用JAVA注解定义字段类型即可。 github地址:https://github.com/jhunters/j...1.2 原理jprotobuf工作原理如下: 扫描类上的注解的信息,进行剖析(与protobuf读取proto文件进行剖析过程类似)依据注解剖析的后果,动静生成java代码进行protobuf序列化与反序列化的性能实现应用JDK6及以上的 code compile API进行编译后加载到classloader1.3 性能jprotobuf 次要性能耗费在扫描类上注解,动静生成代码编译的过程。在执行序列化与反序列化的过程中,简直与protobuf生成的代码效率等同。如果应用预编译插件,则无需在运行中进行代码生成与编译,效率更高。 1.4 特点无需编写proto文件及繁琐的手工编译过程,反对基于POJO对象的注解形式,方便快捷。反对protobuf所有类型,包含对象嵌套,数组,枚举类型提供依据proto文件,动静生成代理对象,可省去POJO对象的编写工作。残缺反对proto文件所有性能,包含内联对象,匿名对象,枚举类型提供从POJO对象的注解形式主动生成proto文件的性能, 不便proto形容文件的治理与保护提供预编译Maven插件,进一步晋升运行性能新增预编译gradle插件2.x版本。 反对TimeStamp类型, 与原生protobuf保持一致。 反对Date类型,应用long类型传递 docs2 Jprotobuf装置maven代码如下: <!-- jprotobuf --><dependency> <groupId>com.baidu</groupId> <artifactId>jprotobuf</artifactId> <version>2.4.5</version></dependency><dependency> <groupId>com.baidu</groupId> <artifactId>jprotobuf-precompile-plugin</artifactId> <version>2.2.2</version></dependency>3 案例数据测试思路:通过各自的办法构建雷同的测试数据,进行序列化和反序列比拟两者之间的差别。注意事项:设计的案例数据尽量蕴含所有的数据类型。 3.1 Protobuf数据定义组织构造如图,其中data依赖student,student依赖person,teacher作为第三方扩大包,用于测试扩大性能。 data.proto代码如下: // Google Protocol Buffers Version 3.syntax = "proto3";// Package name.package prcticeProto.messages;// Options for code generation.option java_package = "learnProto.practiceTest.protoModel";option java_outer_classname = "SchoolModel";option java_multiple_files = true;// import packagesimport "google/protobuf/any.proto";import "practiceProto/categories/student.proto";message School { message Location{ string name=1; uint32 id=2; } Location schoolLocation = 1; bool isOpen =2; repeated categories.Student allStudents = 3; google.protobuf.Any extend =4;}student.proto代码如下: ...

February 9, 2021 · 7 min · jiezi

关于protobuf:深入理解-ProtoBuf-原理与工程实践概述

ProtoBuf 作为一种跨平台、语言无关、可扩大的序列化构造数据的办法,已广泛应用于网络数据交换及存储。随着互联网的倒退,零碎的异构性会愈发突出,跨语言的需要会更加显著,同时 gRPC 也大有取代Restful之势,而 ProtoBuf 作为g RPC 跨语言、高性能的法宝,咱们技术人有必要 深刻了解 ProtoBuf 原理,为当前的技术更新和选型打下基础。 我将过来的学习过程以及实践经验,总结成系列文章,与大家一起探讨学习,心愿大家能有所播种,当然其中有不正确的中央也欢送大家批评指正。 本系列文章次要蕴含: 深刻了解 ProtoBuf 原理与工程实际(概述)深刻了解 ProtoBuf 原理与工程实际(编码)深刻了解 ProtoBuf 原理与工程实际(序列化)深刻了解 ProtoBuf 原理与工程实际(工程实际)一、什么是ProtoBufProtoBuf(Protocol Buffers)是一种跨平台、语言无关、可扩大的序列化构造数据的办法,可用于网络数据交换及存储。 在序列化结构化数据的机制中,ProtoBuf是灵便、高效、自动化的,绝对常见的XML、JSON,形容同样的信息,ProtoBuf序列化后数据量更小、序列化/反序列化速度更快、更简略。 一旦定义了要解决的数据的数据结构之后,就能够利用ProtoBuf的代码生成工具生成相干的代码。只需应用 Protobuf 对数据结构进行一次形容,即可利用各种不同语言(proto3反对C++, Java, Python, Go, Ruby, Objective-C, C#)或从各种不同流中对你的结构化数据轻松读写。 二、为什么是 ProtoBuf大家可能会感觉 Google 创造 ProtoBuf 是为了解决序列化速度的,其实实在的起因并不是这样的。 ProtoBuf最先开始是 Google用来解决索引服务器 request/response 协定的。没有ProtoBuf之前,Google 曾经存在了一种 request/response 格局,用于手动解决 request/response 的编解码。它也能反对多版本协定,不过代码不够优雅: if (protocolVersion=1) { doSomething();} else if (protocolVersion=2) { doOtherThing();} ...如果是十分明确的格式化协定,会使新协定变得非常复杂。因为开发人员必须确保申请发起者与解决申请的理论服务器之间的所有服务器都能了解新协定,而后能力切换开关以开始应用新协定。 这也就是每个服务器开发人员都遇到过的低版本兼容、新旧协定兼容相干的问题。 为了解决这些问题,于是ProtoBuf就诞生了。 ProtoBuf 最后被寄托以下 2 个特点: 更容易引入新的字段,并且不须要检查数据的两头服务器能够简略地解析并传递数据,而无需理解所有字段。数据格式更加具备自我描述性,能够用各种语言来解决(C++, Java 等各种语言)。这个版本的 ProtoBuf 仍须要本人手写解析的代码。 ...

February 3, 2021 · 2 min · jiezi

关于protobuf:protobuf优缺点

protobuf长处protobuf的长处: 1、性能好/效率高 工夫开销: XML格式化(序列化)的开销还好;然而XML解析(反序列化)的开销就不敢恭维了。 然而protobuf在这个方面就进行了优化。能够使序列化和反序列化的工夫开销都减短。 空间开销:也缩小了很多 2、有代码生成机制 比方你你写个一下相似构造体的内容 message testA { required int32 m_testA = 1; } 像写一个这样的构造,protobuf能够主动生成它的.h 文件和点.cpp文件。protobuf将对构造体testA的操作封装成一个类。 3、反对向后兼容和向前兼容 当客户端和服务器共事应用一块协定的时候, 当客户端在协定中减少一个字节,并不会影响客户端的应用 4、反对多种编程语言 在Google官网公布的源代码中蕴含了c++、java、Python三种语言 protobuf毛病1、二进制格局导致可读性差 为了进步性能,protobuf采纳了二进制格局进行编码。这间接导致了可读性差。这个间接影响开发测试时候的效率。当然,个别状况下,protobuf十分牢靠,并不会呈现太大的问题。 2、不足自描述 一般来说,XML是自描述的,而protobuf格局则不是。 给你一段二进制格局的协定内容,不配合你写的构造体是看不出来什么作用的。 3、通用性差 protobuf尽管反对了大量语言的序列化和反序列化,但依然并不是一个跨平台和语言的传输规范。在多平台消息传递中,对其余我的项目的兼容性并不是很好,须要做相应的适配革新工作。相比json 和 XML,通用性还是没那么好。

January 31, 2021 · 1 min · jiezi

关于protobuf:golang使用protobuf中的oneof

作用相似c里的联合体,写配置文件相似 message BBB{ string b=1;}message CCC{ int b=1;}message AAA { oneof payload { BBB b; CCC c; }}应用的时候导入例如为xxx模块:创立构造体时候要手动创立oneof里的构造,写法相似: msg := &xxx.AAA{Payload: &xxx.AAA_BBB{B: &xxx.B{"123"}}}解析进去判断是BBB还是CCC的时候应用 switch msg.Payload.(type) { case *(xxx.AAA_BBB): case *(xxx.AAA_CCC):}

January 21, 2021 · 1 min · jiezi

关于protobuf:Protobuf专题二Protobuf的数据类型解析及使用总结

0 前言Protobuf(Protocol Buffer)是Google出品的一种轻量且高效的结构化数据存储格局,性能比Json、XML更强,被广泛应用于数据传输中。然Protobuf中的数据类型泛滥,什么场景利用什么数据类型最正当、最省空间,成为了每个使用者该思考的问题。为了能更充沛的了解和应用Protobuf,本文将聚焦Protobuf的根本数据类型,剖析其不同数据类型的应用场景和注意事项。 留神:在浏览本文之前最好对Protobuf的语法和序列化原理有肯定的理解。举荐文献:【1】序列化:这是一份很有诚意的 Protocol Buffer 语法详解 https://blog.csdn.net/carson_...【2】Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?https://blog.csdn.net/carson_...【3】通过一个残缺例子彻底学会protobuf序列化原理https://cloud.tencent.com/dev...1 根本数据类型的范畴整型范畴 Int8 - [-128 : 127]Int16 - [-32768 : 32767]Int32 - [-2147483648 : 2147483647]Int64 - [-9223372036854775808 : 9223372036854775807]无符号整型范畴 UInt8 - [0 : 255]UInt16 - [0 : 65535]UInt32 - [0 : 4294967295]UInt64 - [0 : 18446744073709551615]浮点数范畴 Float(32bit) = 1bit(符号位)+ 8bits(指数位)+ 23bits(尾数位)指数位的范畴为-2^128 ~ +2^128尾数位的范畴为2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但相对能保障的为6位,也即float的精度为6~7位有效数字;Double(64bit)= 1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)指数位的范畴为-2^1024 ~ +2^1024尾数位的范畴为2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。浮点数的存储形式详见:https://cloud.tencent.com/dev...2 Protobuf的数据类型Protobuf的根本数据类型与JAVA的数据类型映射关系表如下: 映射表来源于Protobuf官网,https://developers.google.com... ...

January 2, 2021 · 3 min · jiezi

关于protobuf:Protobuf专题一基于IDEA实现Proto一站式编辑及编译

0 前言Protobuf作为一种轻量、高效、可扩大的数据存储语言,被广泛应用于数据传输中。目前对于Proto编辑及编译,最传统的办法是先基于文本编辑软件撰写proto文件,再通过Google提供的protoc程序以命令行的模式编译成java类文件,最初再将生成的java类文件移至project的相应地位。传统的办法比拟麻烦,本文将基于IDEA讲述一种一站式编辑及编译的办法。 1 装置1、下载protoc解析器:protobuf-java-3.14.0.zip2、在IDEA中装置插件。包含GenProtobuf和Protocol Buffer Editor,前者用于一键转换proto文件,后者用于编辑proto文件(未装置前,IDEA不反对对proto语法,没有高亮显示和主动补全提醒)。 留神:如果没有在IDEA的插件市场中搜到以上两个插件,可能是IDEA的版本低了,因而须要降级IDEA到2020版。2 配置1、配置Mavenpom.xml文件中增加如下依赖包: <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.9.1</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>3.9.1</version> </dependency></dependencies>2、配置GenProtobufIDEA菜单栏 --> Tools --> Configure GenProtobuf --> 配置地址 protoc path是下载的protoc.exe的地址。本文的目标是将proto生成java类,因而生成对象选为java,并填写相应地址。3 应用1、编辑proto装置好Protocol Buffer Editor插件后,无需配置即可应用,由图可见,proto语法的关键字高亮显示了,便于编辑。 2、编译proto右键proto文件,能够看见两个跟proto无关的选项,一个是“quick gen protobuf here”,另一个是“quick gen protobuf rules”。前者示意在proto所在的文件门路下生成java文件,后者示意按配置的地址生成java文件。 前文曾经配置好了java生成的门路,咱们抉择后者生成即可,成果如图:其中,MyTest即为test.proto生成的java类。 4 测试生成了java类文件后,咱们就能够测试其序列化和反序列化性能,如果能够失常运行并解析正确,阐明咱们的操作无误。 测试代码: package learnProto.selfTest;import com.google.protobuf.InvalidProtocolBufferException;import learnProto.selfTest.MyTest.*;import java.util.Arrays;public class Test { public static void main(String[] args) { convertProto(1); } public static void convertProto(int value) { //1.通过build创立音讯结构器 Data.Builder dataBuilder = Data.newBuilder(); //2.设置字段值 dataBuilder.setInt32(value); //3.通过音讯结构器结构音讯对象 Data data = dataBuilder.build(); //4.序列化 byte[] bytes = data.toByteArray(); System.out.println(value+"序列化后的数据:" + Arrays.toString(bytes)+",字节个数:"+bytes.length); //5.反序列化 try { Data parseFrom = Data.parseFrom(bytes); System.out.println("还原后的数据="+parseFrom.getInt32()); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } }}运行后果: ...

January 2, 2021 · 1 min · jiezi

关于protobuf:区分Protobuf-3中缺失值和默认值

来自公众号:新世界杂货铺这两天翻了翻以前的我的项目,发现不同我的项目中对于Protobuf 3缺失值和默认值的辨别竟然有好几种实现。明天笔者冷饭新炒,联合我的项目中的实现以及切身经验共总结出如下六种计划。 减少标识字段家喻户晓,在Go中数字类型的默认值为0(这里仅以数字类型举例),这在某些场景下往往会引起肯定的歧义。 以is_show字段为例,如果没有该字段示意不更新DB中的数据,如果有该字段且值为0则示意更新DB中的数据为不可见,如果有该字段且值为1则示意更新DB中的数据为可见。上述场景中,理论要解决的问题是如何辨别默认值和缺失字段。减少标识字段是通过额定减少一个字段来达到辨别的目标。 例如:减少一个has_show_field字段标识is_show是否为有效值。如果has_show_field为true则is_show为有效值,否则认为is_show未设置值。 此计划尽管直白,但每次设置is_show的值时还需设置has_show_field的值,甚是麻烦故笔者非常不举荐。 字段含意和默认值辨别字段含意和默认值辨别即不应用对应类型的默认值作为该字段的有效值。接着后面的例子持续形容,is_show为1时示意展现,is_show为2时示意不展现,其余状况则认为is_show未设置值。 此计划笔者还是比拟认可的,惟一问题就是和开发者的默认习惯稍微不符。 应用oneofoneof 的用意是达到 C 语言 union 数据类型的成果,然而诸多大佬还是发现它能够标识缺失字段。 message Status { oneof show { int32 is_show = 1; }}message Test { int32 bar = 1; Status st = 2;}上述proto文件生成对应go文件后,Test.St为Status的指针类型,故通过此计划能够辨别默认值和缺失字段。然而笔者认为此计划做json序列化时非常不敌对,上面是笔者的例子: // oneof to jsonot1 := oneof.Test{ Bar: 1, St: &oneof.Status{ Show: &oneof.Status_IsShow{ IsShow: 1, }, },}bts, err := json.Marshal(ot1)fmt.Println(string(bts), err)// json to oneof failedjsonStr := `{"bar":1,"st":{"Show":{"is_show":1}}}`var ot2 oneof.Testfmt.Println(json.Unmarshal([]byte(jsonStr), &ot2))上述输入后果如下: {"bar":1,"st":{"Show":{"is_show":1}}} <nil>json: cannot unmarshal object into Go struct field Status.st.Show of type oneof.isStatus_Show通过上述输入知,oneof的json.Marshal输入后果会额定多一层,而json.Unmarshal还会失败,因而应用oneof时需谨慎。 ...

December 11, 2020 · 2 min · jiezi

关于protobuf:关于头条人群包protobuf格式的phppython解决方案

继上文: PHP应用protobuf 尽管php能序列化和反序列化,然而奈何头条不认啊,最初应用了python脚本的模式,去序列化,但很快就暴露出了问题,速度太慢!几万个设施号要序列化2小时+,当然次要的起因在于过后赶时间,是一个个设施号序列化的,大量的工夫花在python上下文切换上,上文里的脚本能用,然而不适宜略微量大一点的场景,故而用三脚猫的功夫写了一个新的python脚本,承受文件,吐出序列化后的新文件,速度大大晋升,实测大略1000/s个设施号。 from __future__ import print_functionimport DmpDataProtoV2_pb2import os,sysimport timeimport base64ag_len = sys.argv.__len__()if ag_len <= 1: print ('ag is null') exit()file = sys.argv[1]if not file.strip(): print ('files is null') exit()if not os.path.exists(file): print ('files is not exists') exit()f = open(file)line = f.readline()line=line.strip('\n')base_name = os.path.splitext(file)[0]target_file = base_name + '-ProtoBuf.txt'print(target_file)# if os.path.exists(target_file)::# os.remove(target_file)t = open(target_file, 'w')t.truncate()while line: line=line.strip('\n') if not line.strip(): continue arr = line.split('|') if arr.__len__() != 2: continue dmp_data = DmpDataProtoV2_pb2.DmpData() id_item1 = dmp_data.idList.add() dtype = arr[0] dev_id = arr[1] id_item1.dataType = getattr(DmpDataProtoV2_pb2.IdItem,dtype) #id_item1.dataType = DmpDataProtoV2_pb2.IdItem.IDFA id_item1.id = str.lower(dev_id) id_item1.tags.append(dtype) # id_item1.timestamp = int(time.time()) binary_string = dmp_data.SerializeToString() s = base64.b64encode(binary_string) t.write(s+"\n"); line = f.readline() line=line.strip('\n')f.close()PHP调用局部 ...

November 27, 2020 · 1 min · jiezi

关于protobuf:proto语法说明

官网文档:https://developers.google.cn/... 一、根本语法示例/* 头部相干申明*/syntax = "proto3"; // 语法版本为protobuf3.0package = "com.xxx.foo"; // 定义包名import "common.proto"; // 导入common.protooption java_package = "com.xxx.foo"; // 指定java包// 搜寻申请message SearchRequest{ int32 page = 1; // 当前页 int32 page_size = 2; // 一页多少条,应用下划线分隔,设置的时候应用驼峰命令法,如:setPageSize(10); enum Type { IN = 0; // 0须要是第一个,第一个也是默认值 OUT = 1; } Type type = 3; // 类型}// 搜寻响应message SearchResponse{ int32 code = 1; // 状态码 string message = 2; // 音讯 SearchList data = 3; // 数据,类型为SearchList}// SearchList构造message SearchList{ repeated Item data = 1; // 数据记录项,repeated类型用来寄存N个雷同类型的内容 int64 count = 2; // 总条数 int32 page_size = 3; // 一页条数}// Item构造message Item{ int64 id = 1; // id string title = 2; // 题目 int64 create_time = 3; // 创立工夫 int64 update_time = 4; // 更新工夫}// 服务service SearchService{ rpc GetSearchList(SearchRequest) returns (SearchResponse); // rpc 办法}命令标准倡议应用下面示例字段类型有: ...

September 25, 2020 · 1 min · jiezi