GRPC与 ProtoBuf 的理解与总结

转载请注明出处:

1.GRPC

  官网:http://www.grpc.io/

  gRPC 官方文档中文版:http://doc.oschina.net/grpc

  RPC 框架的目标就是让远程服务调用更加简单、透明,其负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

       gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

  在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

  GRPC 的优点:

  • 高兼容性、高性能、使用简单

   gRPC 的组成部分:

  • 使用 http2 作为网络传输层

  • 使用 protobuf 这个高性能的数据包序列化协议

  • 通过 protoc gprc 插件生成易用的 SDK

2.protobuf序列化协议 

2.1 什么是ProtoBuf

  ProtoBuf(Protocol Buffers)是一种跨平台、语言无关、可扩展的序列化结构数据的方法,可用于网络数据交换及存储。

  protoBuf 是一种Google开发的高效的二进制数据交换格式,常用于不同编程语言之间的数据通信。

  在序列化结构化数据的机制中,ProtoBuf是灵活、高效、自动化的,相对常见的XML、JSON,描述同样的信息,ProtoBuf序列化后数据量更小 (在网络中传输消耗的网络流量更少)、序列化/反序列化速度更快、更简单。

  一旦定义了要处理的数据的数据结构之后,就可以利用ProtoBuf的代码生成工具生成相关的代码。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言(proto3支持C++, Java, Python, Go, Ruby, Objective-C, C#)或从各种不同流中对你的结构化数据轻松读写。

 

2.2 ProtoBuf 协议的工作流程

                  

  在开发 gRPC 应用程序时,先要定义服务接口,其中应包含如下信息:消费者消费服务的方式、消费者能够远程调用的方法以及调用这些方法所使用的参数和消息格式等。在服务定义中所使用的语言叫作接口定义语言(interface definition language,IDL)。

  借助服务定义,可以生成服务器端代码,也就是服务器端骨架 (这里的“骨架”和“存根”都是代理。服务器端代理叫作“骨架”(skeleton),客户端代理叫作“存根”(stub)。),它通过提供低层级的通信抽象简化了服务器端的逻辑。同时,还可以生成客户端代码,也就是客户端存根,它使用抽象简化了客户端的通信,为不同的编程语言隐藏了低层级的通信。就像调用本地函数那样,客户端能够远程调用我们在服务接口定义中所指定的方法。底层的 gRPC 框架处理所有的复杂工作,通常包括确保严格的服务契约、数据序列化、网络通信、认证、访问控制、可观察性等。

 

3. grpc与protoBuf关系

  Protocol Buffers 是一种轻便高效的数据序列化框架,可以将结构化数据序列化为二进制格式,以便于网络传输和存储。通过定义数据结构的 .proto 文件,可以使用 Protocol Buffers 编译器生成各种编程语言的序列化和反序列化代码。Protocol Buffers 的优点是序列化后的数据大小远小于 XML 和 JSON,并且序列化和反序列化的速度也非常快。

  gRPC 是一种基于 HTTP/2 协议的高性能、开源的远程过程调用(RPC)框架。gRPC 使用 Protocol Buffers 作为其默认的数据序列化协议,可以快速地生成客户端和服务端的代码,并且支持多种编程语言。gRPC 的核心特性包括:高性能、双向流、流控制、多种编程语言支持、易于扩展等。

  gRPC 和 Protocol Buffers 是相互关联的,Protocol Buffers 提供了数据序列化和反序列化的功能,而 gRPC 则在此基础上实现了高性能、跨语言、易扩展的远程过程调用框架。

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 寻找最大的K个数

    给你n个数,让你找出其中最大的K个数。 解法1: 很多人上来就对其进行排序,选用不同的排序方法有不同的时间复杂度,这里我们假设使用了最快的快排,时间复杂度为O(n*logn)。通过排序我摘出前K大的数。 但也许快排不是最优的,我们只找最大的K个数,何必要对所有的数进行排序,我们只需要进行局部排序即可,时间复杂度大概是O(N*K)。 但快排和局部排序谁优谁劣是并不是一定的,当K大于某个数值时快排的优势就显现出来了,大概是logn吧。 解法2: 这个方法是基于快排的,但不是完整的快排。 回忆一下快排,在每一步中,都是将带排数据分成两部分,其中一部分中的任何一个都比另一部分中的任何都大,然后递归排序。 在这里,我们只要在递归过程中选包含最大的K个数的部分进行完整的快排,而对于其他的部分只进行快排的一部分。 关于使用快排求第K大数的方法参见其他博文。在这个基础上,只需要做小小的改进就可以完成寻找最大K个数的功能了,时间复杂度O(N)。 解法3: 以上的两个方法都需要对所有数据遍历多次,如果数据量太大,都没办法全部装进内存了,这时候我们何谈排序。 其实我们有更优的解决方法,我们可以先拿出K

  • 01 . Mysql简介及部署

    Mysql数据库简介什么是数据?数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材,数据是信息的表现形式和载体,可以是符号,文字,数字,语音,图像,视频等,数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵,数据本身没有任何意义,数据只有对实体行为产生影响才成为信息。在计算机系统中,数据以二进制信息单元0,1形式表示 什么是数据库?数据库(Database):是按照数据结构来组织、存储和管理数据的仓库,给我们提供了一种以关系的方式来存放数据的方法,能够解决文本性存储数据的劣势。 数据库技术构成数据库系统由硬件部分和软件部分共同构成,硬件主要用于存储数据库中的数据,包括计算机,存储设备等。软件部分则主要包括DBMS,(DB数据库管理系统)支持DBMS运行的操作系统,以及支持多种语言进行应用开发的访问技术。 数据库系统主要三个部分数据库:用于存储数据的地方 数据库管理系统:用于管理数据库的软件 数据库的应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充。 数据库(databasesystem)提供了一个存储空间以存储各

  • protobuffer的前世今生(三)——序列化和反序列化性能比较

    性能对比下面是一些网上的对比图片,以及两年前有人做过的代码测试结果。 性能测试网上有个人,做了详细的测试。 因为proto更擅长于整数的编码和处理,所以结论如下: 如果你的生产环境中的JSON没有那么多的double字段,都是字符串占大头,那么基本上来说替换成Protobuf也就是仅仅比Jsoniter提高一点点,肯定在2倍之内。如果不幸的话,没准Protobuf还要更慢一点。序列化&反序列化过程序列化过程如下:判断每个字段是否有设置值,有值才进行编码根据字段标识号&数据类型将字段值通过不同的编码方式进行编码由于:编码方式简单(只需要简单的数学运算=位移等等)采用ProtocolBuffer自身的框架代码和编译器共同完成 所以ProtocolBuffer的序列化速度非常快。反序列化过程如下:调用消息类的parseFrom(input)解析从输入流读入的二进制字节数据流从上面可知,ProtocolBuffer解析过程只需要通过简单的解码方式即可完成,无需复杂的词法语法分析,因此解析速度非常快。 将解析出来的数据按照指定的格式读取到Java、C++、Phyton对应的结构类

  • Spring Boot Kafka概览、配置及优雅地实现发布订阅

    本文属于翻译,转载注明出处,欢迎关注微信小程序小白AI博客微信公众号小白AI或者网站https://xiaobaiai.net1前言本篇文章内容很全,很长,很细!不要心急,慢慢看!我都写完了,相信你看完肯定可以的,有任何问题可以随时交流!本篇文章内容很全,很长,很细!不要心急,慢慢看!我都写完了,相信你看完肯定可以的,有任何问题可以随时交流!本篇文章内容很全,很长,很细!不要心急,慢慢看!我都写完了,相信你看完肯定可以的,有任何问题可以随时交流!本篇文章主要介绍SpringKafka的常用配置、主题自动创建、发布消息到集群、订阅消息(群组)、流处理配置以及嵌入式Kafka做测试配置相关内容,最后通过两种方式去实现消息的发布和订阅功能,其中一种是基于SpringIntegration方式。本文内容基于SpringKafka2.3.3文档及SpringBootKafka相关文档,Spring创建了一个名为Springkafka的项目,它封装了Apache的kafka客户端部分(生产者/消费者/流处理等),以便在Spring项目中快速集成kafka,Spring-Kafka项目提供了Apac

  • docker commit 参数

    本文由腾讯云+社区自动同步,原文地址https://stackoverflow.club/98/基本的commitdockercommitCONTAINER_ID复制复杂的commit更多的时候,我们希望给自己的提交加上一些内容,如:tag,message。以下是commit的命令行参数:Usage:dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]] #Createanewimagefromacontainer'schanges -a,--author=""Author(e.g.,"Yourname") -m,--message=""Commitmessage -p,--pause=truePausecontainerduringcommit复制注意这里OPTIONS的位置,必须在container之前,否则报错。默认情况下,在提交时,容器的执行将被暂停,以保证数据的完整性,当然你可以指定选项p,来禁止。以下是一个提交示例:#查询containerid $sudodock

  • 一张图教你快速玩转vue-cli3

    前言本文系统的梳理了vue-cli3搭建项目的常见用法,目的在于让你快速掌握独立搭建vue项目的能力。你将会了解如下知识点:如何安装项目插件添加浏览器支持如何配置scss/stylus共享全局变量如何整合elementUI等第三方框架并实现按需引入配置单/多页面如何配置自定义环境变量如何在vue.config.js定制自己的webpackvue项目部署说明本文末尾会给出一个以上提到的所有功能的一个配置文件,可供大家学习参考。思维导图接下来,我们根据思维导图,一步步来解释和实现我们的目标。1.安装项目插件vueadd@vue/cli-plugin-eslint #或 vueaddxjFile复制vueadd的设计意图是为了安装和调用VueCLI插件。对于普通的npm包而言,我们仍然可以(根据所选的npm包)使用包管理器。最后可以在vue.config.js做webpack自定义配置2.添加浏览器支持browserslist我们可以通过package.json文件里的browserslist字段或一个单独的.browserslistrc文件来指定项目的目标浏览器的范围。这个值会被@babe

  • MySQL 插入,更新和删除数据

    一.向表中插入数据Insert语法要求指定要插入的表名和被插入到新列中的值。INSERTINTOcustomers(cust_name,cust_address,cust_city,cust_zip,cust_country,cust_contact,cust_email)VALUES('DINGWEI','Pixian','SiChuan','Chengdu','china',NULL,'dingscu@163.com');定义表时如果某列为空值或者有默认值,向表中插入数据时省略的列可以不写。向表中插入多个行时可以只使用一个INSERT语句,各列用逗号隔开。INSERTINTOcustomers(cust_name,cust_address,cust_city,cust_number,cust_country)VALUES('DW','PIXIAN','SICHUAN',610000,'CHINA

  • angularjs通过ng-change和watch两种方式实现对表单输入改变的监控

    angularjs通过ng-change和watch两种方式实现对表单输入改变的监控直接上练习代码<!DOCTYPEhtml> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title></title> </head> <bodyng-app="myApp"ng-controller="myContro"> <div> <h1>ng-change指令</h1> ng-change指令,当表单输入发生改变时,会触发该事件<br/> <div> 姓名:<inputtype="text"id="name1"ng

  • 读 Java Arrays 源码 笔记

    Arrays.java是Java中用来操作数组的类。使用这个工具类可以减少平常很多的工作量。了解其实现,可以避免一些错误的用法。它提供的操作包括:排序sort查找binarySearch()比较equals填充fill转列表asList()哈希Hash()转字符串toString()这个类的代码量很多,Java1.7中有4000多行。因为每一种基本类型都做了兼容,所以整个类真正逻辑不多。下面简单介绍一下它各个功能的实现:排序查找Arrays.java中只提供了二分查找。二分查找的前提就是数组是经过升序排序的,所以使用之前务必确保数组是有序的。调用的接口比较简单:publicstaticintbinarySearch(primative[]a,primativekey); publicstaticintbinarySearch(primative[]a,intfromIndex,inttoIndex,primativekey); publicstaticintbinarySearch(Object[]a,Objectkey); publicstaticintbinarySearch(Ob

  • 从商品溯源到历史载录,区块链技术的革新

    说到近期区块链行业关注度最高的问题,除了比特币攻到8000美元上之外,当属闹得沸沸扬扬的某个医疗用品事件了。老实说,作为一个行业参与者,对这类商品质量危机类的事件还是比较敏感的,原因很简单:每次出现这种事情,就开始有不少朋友把目光转移到到区块链,期待这项新兴的数字技术能够救黎民于水火。主链侧链开发数字货币交易所白皮书区块链浏览器跨境支付场内场外宠物挖矿游戏基金会牌照181-4069-6008微信电话同号而具体的方向,总体来看有两点:1、将商品生产的过程,记录到区块链上,从而确保其每个环节都符合相关标准。2、把商品质量危机这件事,记录到区块链上,确保这件事的报道不会被人篡改删除。OK,可以看出,很多朋友对区块链真的是抱了很大希望,那么事情能够如他们所愿吗?区块链真能一劳永逸地解决商品质量问题吗?今天社长就跟大家好好掰扯掰扯。1“区块链溯源”的核心,并不在区块链。我们先来看“用区块链来进行商品质量溯源”这件事。事实上,在区块链刚出现的时候,当时人们预想中最容易落地的应用,除了金融,就是溯源。然而两年过去了,区块链溯源领域可以说是相当惨淡。就连币圈的溯源龙头老大哥项目,现在都已经开始准备转型

  • 算法证明:女生遇到心动的男人一定要追!

    本文来自知乎网友尼克余链接:http://www.zhihu.com/question/27355234我来讲恋爱中的博弈,不,我来讲恋爱中的算法,不,我来讲算法!!有个著名的问题,叫做stablematching。早年是一个可爱的俄罗斯老头在图论课上教我的,印象非常深刻,拿出来娱乐下大家。因为这个算法应用太广泛了,这个算法的两位发明人DavidGale和LloydShapley,在2012年因为这个算法获得诺贝尔经济学奖。先说结论:女生遇到心动的男人一定要追!我马上就要来证明。 前方高能预警!!!含大量数学图论及计算机编程算法知识,萌妹子请直接退散。假设,有一个平行世界,我们姑且叫这个世界,平行世界999号,这个世界有n个男人,还有n个女人,然后每一个男人,都有一个对喜欢的女人的排序,比如男A,有一个排序(女A,女B,一直到女N),每一个女人都有一个喜欢的男人的排序,比如女A,有一个排序(男A,男B,一直到男N)。每个男的都会试图去追求自己的排序里头排的最高的女性,每个女的都会接受自己排序里头最高的男性的追求。再假设这个平行世界999号,有以下追求方法(算法):1.这个世界上只有男人

  • 10.HanLP实现k均值--文本聚类

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 10.文本聚类 正所谓物以类聚,人以群分。人们在获取数据时需要整理,将相似的数据归档到一起,自动发现大量样本之间的相似性,这种根据相似性归档的任务称为聚类。 10.1概述 聚类 聚类(clusteranalysis)指的是将给定对象的集合划分为不同子集的过程,目标是使得每个子集内部的元素尽量相似,不同子集间的元素尽量不相似。这些子集又被称为簇(cluster),一般没有交集。 一般将聚类时簇的数量视作由使用者指定的超参数,虽然存在许多自动判断的算法,但它们往往需要人工指定其他超参数。 根据聚类结果的结构,聚类算法也可以分为划分式(partitional)和层次化(hierarchieal两种。划分聚类的结果是一系列不相交的子集,而层次聚类的结果是一棵树,叶子节点是元素,父节点是簇。本章主要介绍划分聚类。 文本聚类 文本聚类指的是对文档进行聚类分析,被广泛用于文本挖掘和信息检索领域。 文本聚类的基本流程分为特征提取和向量聚类两步,如果能将文档表示为向量,就可以对

  • 简介

      亲爱的博士生们,欢迎大家来阅读我写的这本小册子。   我假定正在读这篇文章的你想要在残酷的博士生涯中幸存下来。是的,我称之为“幸存”,你也可以管它叫“熬过”博士阶段或者是“毕业”。甚至是“神啊,带走我这无法忍受的痛苦吧!”。但我们可以确定的是,读博绝非是“闲庭信步”[1]。   我知道这一点,因为我曾想过在博士学位期间退学转读MBA。我想去一家公司。我想呆在家里,像婴儿一样哭泣。我曾处在这种环境之中,所以我知道你的痛苦。让我们看看我的一些经验之谈能否帮助你渡过难关。   请允许我简化一下上述的情况。两件事将保证你完成你的博士学位。首先,你不会放弃。其次,你是一位好的科学家。   为了不退出,你需要保持研究动力。你懂的,博士的研究动力可以变的难以想象的低。我将与你分享一小贴士,告诉你如何为你的博士阶段设定正确的研究期望以及如何在备受打击之后重获研究动力。   为了成为一名优秀的科学家,你需要获得一些基本技能。比如写作,表达,阅读等等,你知道,这些都是典型的科学家技能。还有一些通常在其他人的经验之谈中未曾被推荐过的技能,如时间管理,健康增强,软件使用和写博客等也将在我的小册子中出现。

  • 某某大学静态页面

    1<!DOCTYPEhtml> 2<html> 3<headlang="en"> 4   <metacharset="UTF-8"> 5   <title></title> 6   <styletype="text/css"> 7       *{ 8           margin:0px; 9           padding:0px; 10           list-style-type:none; 11&n

  • Catalan

    推导过程中假定m[2]=1是最巧妙的设计 #include<iostream> #include<algorithm> usingnamespacestd; //catalan intmain(void) { intn,m[100]; cin>>n; for(inti=2;i<=n;i++)m[i]=0; m[2]=1; for(inti=3;i<=n;i++) { for(intk=2;k<=i-1;k++) { m[i]+=m[k]*m[i-k+1]; } } cout<<m[n]; }复制  

  • cmd命令

    1.设置变量:set"Val=xxxx"         set/pVal=自己输入的方式   2.引用变量:echo%Val%   echo%cd%(%cd%表示当前路径名)   3.%~dp0:   比如你有个批处理a.bat在D:\qq文件夹下    a.bat内容为   cd/d%~dp0   在这里   cd/d%~dp0的意思就是cd/dd:\qq   %0代表批处理本身 d:\qq\a.bat   ~dp是变量扩充   d既是扩充到分区号 d:   p就是扩充到路径 \qq   dp就是扩充到分区号路径d:\qq   4.@echooff:关闭回显,运行bat脚本时不会显示内部命令 5.执行bat脚本后关闭cmd窗口可使用startyourcmd

  • systemd - 服务

    systemd systemd是Linux系统工具,用来启动守护进程,已成为大多数发行版的标准配置 1.由来 历史上,Linux的启动一直采用init进程,使用下面的命令用来启动服务 $/etc/init.d/httpdstart #或者 $servicehttpdstart 复制 这种方法有两个缺点: 启动时间长:init进程是串行启动的,只有前一个进程启动完成,才会启动下一个进程 启动脚本复杂:init进程只是执行启动脚本,不管其他的事,脚本需要自己处理各种情况,这往往让脚本内容变的很复杂 2.systemd概述 systemd就是为了解决这些问题而诞生的,它的设计目标是,为系统的启动和管理提供一套完整的解决方案 根据Linux惯例,字母d是守护进程(daemon)的缩写,systemd这个名字的含义,就是它要守护整个系统 使用了systemd,就不需要再用init了,systemd取代了initd,成为系统的第一个进程(PID等于1),其他进程都是它的子进程 #查看systemd的版本 $systemctl--version 复制 systemd的优点是功能强大,使用

  • Active Directory Users and Computers 安装与使用(win7&amp;win10)

    一.        ADUC安装 根据自己电脑所使用的Windows操作系统,找到对应的ADUC管理工具补丁包点击下载后安装。   Windows7补丁下载链接:https://www.microsoft.com/zh-cn/download/details.aspx?id=7887   Windows10补丁下载链接:https://www.microsoft.com/zh-cn/download/details.aspx?id=45520        安装完成之后再进行配置。 Windows7配置方法:        打开“开始”—“控制面板”—“程序”—“程序和功能”下的“打开或关闭Windows功能”,如图所示进行选择,添加功能完成后,重启电脑。         

  • Java 8 lambda初试

    λ表达式本质上是一个匿名方法。让我们来看下面这个例子: publicintadd(intx,inty){ returnx+y; } 复制 转成λ表达式后是这个样子: (intx,inty)->x+y; 复制 参数类型也可以省略,Java编译器会根据上下文推断出来: (x,y)->x+y;//返回两数之和 复制 或者 (x,y)->{returnx+y;}//显式指明返回值 复制 可见λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。 下面这个例子里的λ表达式没有参数,也没有返回值(相当于一个方法接受0个参数,返回void,其实就是Runnable里run方法的一个实现): ()->{System.out.println("HelloLambda!");}如果你想学习Java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。复制 如果只有一个参数且可以被Java推断出类型,那么参数列表的括号也可以省略: c->{returnc.size();} 复制 publicstaticvoidmain(St

  • 根据不同的ie的版本号,制定不同的方法

      <!DOCTYPEhtml> <html> <headlang="en"> <metacharset="UTF-8"> <title></title> <style> select{ height:30px; width:200px; padding:5px0; } </style> </head> <body> <divid="aa"> </div> </body> <scriptsrc="jquery-1.7.js"></script> <scripttype="text/javascript"> varaaa=document.body.scrollWidth-230; varversion=navigator.appVersion; varstart=version.indexOf("MSIE"); vartemp=version.slice(start+5,start+

  • 鸡尾酒之朗姆酒

    朗姆酒 1.自由古巴 自由古巴 自由古巴是由朗姆加上可乐调制而成的,它具有口感轻柔的特点,非常适合在海滩酒吧饮用。   2.蓝色夏威夷 蓝色夏威夷 蓝色夏威夷是一款星座鸡尾酒,它所代表的星座是双鱼座。蓝色夏威夷与奇奇ChiChi 、迈泰MaiTai、天蝎座Scorpion 三种鸡尾酒合称为夏威夷四大极品。   3.黛克瑞 黛克瑞 黛克瑞犹豫在调制过程中加入了柠檬汁和糖,所以它的口感酸甜清爽,非常讨女孩子喜欢。 回首间---我错过了那片星海

相关推荐

推荐阅读