纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

gRPC初体验

11月15日 风雨峰投稿
  一、简单介绍RPC
  RPC(RemoteProcedureCall)远程过程调用,它允许在一台服务器程序中调用另一台服务器上的子程序。RPC采用了代理模式从而屏蔽了网络之间的调用细节,使得调用远程函数就像调用本地程序一样简单。
  RPC它包含了接口规范、传输协议、数据序列化反序列化规范。它可以基于HTTP或TCP协议之上来构建RPC协议,其各自都有优缺点。Google选择将GRPC定义在HTTP2通信协议之上。GRPC的优势由HTTP2和Protobuf继承而来。Dubbo国内最早的RPC框架、偏向服务治理、阿里巴巴开源支持java语言Motan微博内部使用的RPC框架、2016年开源仅支持java语言Tars腾讯内部使用的RPC框架、2017年开源仅支持C语言SpringCloud国外Pivotal公司于2014年开源、仅支持java语言gRPCGoogle于2015年开源的跨语言RPC框架、支持多种语言ThriftApache开源项目之一(原Facebook)、支持多种语言
  二、什么是gRPC
  gRPC是由Google开发的一个高性能、开源、跨语言使用的RPC框架。主要基于HTTP2通信协议标准设计,基于Protobuf(ProtocolBuffers)序列化协议开发,采用IDL文件定义服务而设计,同时支持大多数主流的编程语言。
  IDL接口描述语言(InternalDefineLanguage)使用的是protobuf,通过proto3工具生成指定语言的数据结构、服务端接口以及客户端接口的存根(Stub)
  Protobuf作为轻量级的结构化数据存储格式,可以用于结构化、数据序列化、即时通讯、数据存储等领域。它是与语言无关、平台无关、可扩展的序列化结构数据格式,其功能类似于json、xml。但是Protobuf比它们更小、更快、更简单,所以Protobuf更适合RPC作为数据交换格式。
  Protobuf的核心内容:定义接口:接口路径和参数,以service标识定义消息:消息的结构体,以message标识
  通过Protobuf提供的机制,服务端与客户端之间只需要关注接口方法名(service)和参数(message)即可通信,而不需关注繁琐的链路协议和字段解析,极大降低了服务端的设计开发成本。
  通信协议使用的是HTTP2,其特点如下:HTTP2采用的是二进制格式的传输协议,而不是HTTP1。x的文本格式,支持多路复用,即通过一个连接发送多个并发的请求。而HTTP1。x虽然可以通过pipeline实现并发请求,但是多个请求之间的响应仍会被阻塞。支持服务端推送,即客户端发送一个请求,服务器可以对客户端发送多个响应。而不像HTTP1。x只能通过客户端发起请求,服务端才响应。支持头部压缩,HTTP2对传输的消息头进行了压缩传输,节省了头部在网络传输过程所占用的网络流量。
  gRPC基于HTTP2对流传输提供了如下几种支持,在后面的案例也是基于这几种流式体验的。UnaryRP,一元RPCServersidestreamingRPC,服务端流式RPCClientsidestreamingRPC,客户端流式RPCBidirectionalstreamingRP,双向流式RPC
  gRPC的调用模型:
  大致介绍一下流转的流程:客户端(gRPCStub)调用A方法,发起RPC调用对请求信息使用Protobuf进行对象序列化压缩(IDL)服务端(gRPCServer)接收到请求后,解码请求体,进行业务逻辑处理并返回对响应结果使用Protobuf进行对象序列化压缩(IDL)客户端接受到服务端响应,解码请求体。回调被调用的A方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果
  三、准备Protobuf环境
  1)安装Protobuf的编译器protocbrewsearchprotobufbrewinstallprotobufprotocversio
  2)安装go语言的protobuf插件
  注意:从google。golang。org官网下载网上很多资源是旧版本的地址github上,目前已经被google收录管辖。其生成的。proto文件也跟之前的不同,甚至会报错。goinstallgoogle。golang。orggrpccmdprotocgengogrpcv1。2goinstallgoogle。golang。orgprotobufcmdprotocgengov1。28
  插件的安装路径在gobin目录下
  3)修改环境变量使得全局可用vi。zshrcexportGOPATHgoexportPATHPATH:GOPATHbinsource。zshrc
  四、gRPC初体验
  1)创建一个项目目录,其结构如下
  首先在proto目录下创建一个文件且扩展名为。proto,我这边取名叫protolist。proto文件其次分别在server和client文件夹下创建相应名称的。go文件,我这边分别叫server。go和client。go
  2)在protolist。proto文件中定义gRPC服务、方法请求、响应类型
  首先指定proto的版本,默认是proto2版本,我们需要手动指定版本为proto3类型(可以了解一下proto2和proto3的区别)且需要写在第一行。syntaxproto3;
  然后指定生成的go文件在哪个目录中,以及包的命名空间是什么,使用分号分割。(。)表示当前目录,其包名为(proto)可随意取,optiongopackage。;
  上面也说过Protobuf的核心内容有两个:service和message,即定义服务接口和消息。
  定义服务和服务的方法,gRPC支持四种服务:一元RPC、服务端流式RPC、客户端流式RPC、双向流式RPC。那就先体验双向流式PRC吧。serviceGreeter{双向流RPCrpcSayRoute(streamHelloRequest)returns(streamHelloReply){}}
  上面的代码定义了一个名字为Greeter的服务,里面包含了一个双向流式的RPC方法。其意味着,双方可以使用读写流发送一系列消息。注意,这两个流独立运行,在客户端和服务端可以按照任意的顺序读取和写入。
  定义消息类型,请求的消息类型以及请求响应的消息类型messageHelloRequest{stringname1;}messageHelloReply{stringmessage1;}
  这段代码看着就很眼熟呀,有点像结构体。不过人家叫消息体,消息体内的类型支持多种,这里就不列举了,可以自行查阅。其中name1也不是为了赋值,它表示此变量在消息体内的位置。
  最后在当前目录下执行如下命令:protocgoout。gooptpathssourcerelativegogrpcout。gogrpcoptpathssourcerelative。。protogoout。表示指定源文件地址gooptpathssourcerelative:paths表示生成的go代码的位置sourcerelative表示按proto源文件的目录层级去创建Go代码的目录层级,如果目录已存在则不用创建
  此时,会在当前目录下生成以下go文件。
  protolist。pb。go包含用于填充、序列化、检索请求、响应消息类型的所有协议及缓冲区代码protolistgrpc。pb。go客户端使用服务中定义的方法调用的接口类型(或存根)服务端要实现的接口类型,也使用服务中定义的方法
  3)服务端实现,注册服务
  在server目录下的server。go文件中注册一个结构体为GreeterServers的服务。并监听一个端口号,在服务端运行着funcmain(){server:grpc。NewServer()proto。RegisterGreeterServer(server,GreeterServers{})lis,:net。Listen(tcp,:8090)server。Serve(lis)}
  在protolistgrpc。pb。go文件中有一个GreeterServer的接口,里面包含了两个方法,我们在server。go文件中就需要按照协议接口来实现所有的方法。GreeterServeristheserverAPIforGreeterservice。AllimplementationsmustembedUnimplementedGreeterServerforforwardcompatibilitytypeGreeterServerinterface{SayRoute(GreeterSayRouteServer)errormustEmbedUnimplementedGreeterServer()}
  在server。go中声明一个GreeterServers结构体中里面继承了一个结构体。typeGreeterServersstruct{proto。UnimplementedGreeterServer}
  这里直接继承proto(proto就是生成的grpc。pb。go文件的引用)下面的结构体即可,mustEmbedUnimplementedGreeterServer这个方法在协议中已经被这个UnimplementedGreeterServer结构体实现了。
  下面实现SayRoute方法func(sGreeterServers)SayRoute(streamproto。GreeterSayRouteServer)error{for{stream。Send(proto。HelloReply{Message:hahahaha})resp,err:stream。Recv()iferrio。EOF{returnnil}iferr!nil{returnerr}log。Printf(resp:v,resp)}}
  其中Send和Recv都是GreeterSayRouteServer接口中的方法,用于发送消息和接收消息。
  此时运行gorunserver。go文件,让TCP端口号为8090服务跑起来。
  4)客户端实现
  客户端连接上服务端的端口:8090,然后调用服务端的SayRoute()方法,在通过Send()方法发送消息,使用Recv()方法接收消息。整个流程就像调用本地方法一样。funcmain(){conn,:grpc。Dial(:8090,grpc。WithInsecure())deferconn。Close()client:proto。NewGreeterClient(conn)SayRoute(client,proto。HelloRequest{Name:cici})}funcSayRoute(clientproto。GreeterClient,rproto。HelloRequest)error{stream,:client。SayRoute(context。Background())forn:0;n6;n{stream。Send(r)resp,err:stream。Recv()iferrio。EOF{break}iferr!nil{returnerr}log。Printf(resperr:v,resp)}stream。CloseSend()returnnil}
  下面运行一下,如下是输出内容:
  其实,双向流式RPC就是指两端可以同时使用读写流发送消息。这两个流可以独立运行,可以根据业务需求完善流的交互顺序。
  总结这次gRPC案例初体验,我们简单的了解到什么是RPC以及gRPC的设计理念,什么是Protobuf以及它的核心内容是什么。最后实践了双向流的简单demo。线下在学习的过程中对安装Protobuf插件的确走了一点弯路,好在最后走出来了。然后呢特别感谢《Go语言编程之旅》的作者让我这个小儿有幸在gRPC的世界里稍微扑腾了一下。
  五、参考来源
  《Go语言编程之旅》
  https:blog。csdn。netweixin42905141articledetails125272803
  https:developers。google。comprotocolbuffersdocsreferencegogenerated?hlzhcn
  https:blog。csdn。neti19970916articledetails125733894
投诉 评论 转载

湿气重的十条表现沾得越多,湿气越重,怎样调理才正确?我们日常生活中经常听说湿气重,湿气重,但很多人并不知道湿气重到底会有什么表现。中医上认为,湿气是一种外邪,入侵我们的身体之后,就容易多种疾病,因此我们出现湿气重的情况,就一定要……iPhone13Pro最新售价确定,全平台均跌至新低,果粉终卖出去十台安卓手机的利润可能都还没有一台苹果手机的利润高,这句话听起来可能有些夸张,但实际上这就是如今手机行业中的真实写照,而且这还是以安卓旗舰手机来衡量的,如果是以主要出货的……这样吃不健康吗?我们老俩都是古稀之年,身患多种疾病。在广西巴马候鸟养生五年多了。我们住在当地农村,依山伴水的屯里,与当地老百姓和睦相处,租种不到一分田,自己种菜田,新鲜蔬菜基本不用买。过得是田……Vogue活动女星各出奇招今天是Vogue130周年展,群星荟萃自然是免不了争妍斗艳。虽然没有公开红毯,路透已经引起网友一片热烈讨论。张小斐绝了高挂热搜,一袭黑色丝绒深V高开叉礼服,配上浓浓的眼妆……截至目前,盘点搭载骁龙8Gen2处理器的手机,共18款【1】三星GalaxyS23搭载第二代骁龙8移动平台升级版,采用台积电4nm的制程工艺,CPU超大核主频为3。36GHz,采用全新143架构,兼顾性能与功耗,性能调度更灵……孩子出生时的体重,能暗示智商高低?医生不是迷信,有科学依据关注一下,方便我们一起探讨更多内容每个新生命的降临都会给一个家庭带来很多欢乐。而在怀孕期间,每个母亲都希望自己的宝宝能发育的更好,成为世界上最聪明的宝宝,于是新手妈……gRPC初体验一、简单介绍RPCRPC(RemoteProcedureCall)远程过程调用,它允许在一台服务器程序中调用另一台服务器上的子程序。RPC采用了代理模式从而屏蔽了网络之间……持续调整的白酒,还能王者归来吗?白酒人,白酒魂,投资白酒人上人!白酒板块已经连续下跌两年了,虽然说白酒没有医疗和半导体跌的那么多,但这样持续的调整,相信换成谁也接受不了。要知道,当初的白酒可是国内股市价值投资……去山东必点的6道名菜,是鲁菜之魂,老板都以为你是山东人山东,风景优美,文化底蕴深厚,是非常值得一去的地方。山东特有的自然风光和享誉中外的名胜古迹,一直让人津津乐道。当然了,这里吸引人的不仅仅只有美景,还有不少脍炙人口的精美菜……陈赓去世后,傅涯为夫守节49年,临终前说我不要和你们爸爸合葬前言陈赓在1961年因为心肌梗塞不幸逝世,当时他的骨灰被葬在了八宝山,为何在过了近半个多世纪之后,他的儿女要求把他的骨灰迁出八宝山,而且还得到了中央的同意,让陈赓的骨灰迁……铁血柔情杨志刚娶了还在念书的张静,挣的钱全部交给太太说到杨志刚,一听这个名字,很多观众都非常熟悉,他凭借一部《铁梨花》获得了大众的肯定,之后又出演了多部耳熟能详的电视剧《勇敢的心》、《大秧歌等》,是一位大器晚成的演员,他扎实的演……白发长在哪,病就从哪出?长在前额两鬓和后脑勺,各代表什么生老病死是人之常情,也是人之常情,出现衰老时,通常会在面部首先表现出来面部皮肤松弛,下垂,发黄,并且头发也变得白花花的,都是岁月在我们脸上留下的岁月痕迹。对于大多数中老年……
作为全球5G技术专利第一大户的华为为啥只能卖4G手机万豪毛怡冰中国旅游市场稳步复苏持续加码中国什么是高精度RTK定位?室外定位有多少种?难以置信!中国烟草连续亏损三年,亏损总额高达40亿?若心向暖,便是美好从新鲜视界,一览心动江南!39)进豫洛阳朝圣白马寺奥尔特云彗星可能会自旋至死华为速度!鸿蒙3。0升级加速,22款华为荣耀手机喜提测试版夜读我很重要骁龙865和870还能打,价格差别很大,两者的旗舰机怎么选?正式告别!中国男篮名帅下课,离开国家队,执教成绩糟糕司马光的教学设计方案旅游局实习报告范文26日看点中国有望迎夺金高潮传播性病罪构成要件有哪些?吃了变酸的麻酱有事吗孩子玩游戏输不起,怎么办?小蝌蚪找妈妈教案做好情绪管理提高工作效能一侍神令回应陈坤是唯一男主!网友陈坤出场44分钟屈楚萧50分就好造句用就好造句大全必须曝光中国这些平价小众的国货!建议看看快有没有你正在用的?孩子不优秀是全他的错?其实是父母在这方面太节俭,千万要注意了

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形