首页天道酬勤rpc系统,grpc protobuf

rpc系统,grpc protobuf

张世龙 05-13 12:04 55次浏览

创建时间2021 11 22

更新时间2021 11 24

author venki.chen

一、什么? 1 .定义,你要做什么? 什么是rpc?

在分布式计算中,远程过程调用(英文: Remote Procedure Call,简称RPC )是一种计算机通信协议。 使用此协议,在一台计算机上运行的程序可以调用另一个地址空间(通常是开放网络中的计算机)的子程序。 另一方面,程序员不需要像调用本地程序一样对这种交互进行编程(无需详细注意)。 RPC是服务器/客户端(Client/Server )模型,而经典实现是发送请求、接收响应和交换信息的系统。

rpc详细信息

RPC模式分为三层:用户和服务器(负责处理业务逻辑,调用本地Stub )。 Stub处理客户端和服务端约定的语法、语义封装和解封装RPCRuntime负责底层网络传输。

rpc要解决的三大问题

基于RPC模型,一个RPC框架基本上需要解决协议约定、网络传输、服务发现三个问题。

协议约定问题(Stub )是指如何规定远程调用的语法、如何传递参数等。 用上面的类比,你怎么教朋友玩什么游戏? 是照着游戏的名字说,王者荣耀、绝地求生,还是简称,王者、吃鸡,还是1是王者、2是鸡,只说1或2?

传输协议问题(RPCRuntime )是指网络发生错误、重发、丢包或性能问题时怎么办? 上面的类比是,你打电话的时候,刚说要玩什么游戏,还没有收到对方的回复,电话信号很难中断。 这个时候怎么处理?

服务发现问题(插件,例如:etcd )是指如何知道服务端可以调用哪个服务,可以通过哪个端口访问? 服务端可能会实现多个远程调用,并在不同的进程中随机监听端口。 客户端如何知道这些端口?

rpc调用过程

调用方(客户端客户端)以本地调用的形式启动调用。 客户端存根(Client stub )在接收到调用后,负责将调用的方法名称、参数等打包编码为特定形式的网络可传输消息主体。 客户端存根(stub )通过网络将消息发送到服务端,服务器存根(stub )在通过网络接收到消息后,以适当的格式进行拆包解码, 获取方法名称和参数的Server stub由基于方法名称和参数进行本地调用的调用方(Server )本地调用并执行后,将结果返回给Server stub的Server stub返回的值通过网络发送到客户端客户端客户端stub收到消息后,进行拆包解码,返回客户端; 客户端得到了这次RPC调用的最终结果。 什么是grpc?

gRPC是Google生产的高性能、开源的RPC框架,基于ProtoBuf串行化协议开发,支持多种语言(Golang、Python、Java等)。 本文仅介绍谷歌的gRPC的使用。 由于gRPC支持HTTP/2协议,因此在Android、IOS等客户端后端服务的开发领域很有前景。 gRPC提供了定义服务的简单方法,客户端可以充分利用http/2流的特性,从而有助于节约带宽、减少TCP连接次数、节约CPU使用量等。

rpc和grpc的关系是什么?

rpc是协议,grpc是基于rpc协议实现的框架。

grpc的解决rpc的三个问题

协议约定。 gRPC的协议是协议缓冲器,是压缩率非常高的串行化协议。 Google在2008年将Protocol Buffers开源,并支持多种编程语言,因此gRPC支持客户端和服务端以不同的语言实现。

传输协议。 gRPC的数据传输使用了Netty Channel,Netty是一种高效的基于异步IO的网络传输体系结构。 在Netty Channel中,每个gRPC请求都封装在HTTP 2.0流中。

服务发现。 gRPC本身不提供服务发现机制,需要通过其他组件。

2 .我的理解grpc是实现rpc协议的框架,分别通过protocol buffer、netty channel和服务发现组件解决rpc的协议约定、传输协议、服务发现三个问题。

二、为什么要解决什么问题,能带来什么好处? 好处:

grpc协议缓冲区压缩性高,速度快。 HTTP 2.0流媒体。 支持多语言。 缺点:

grpc可读性差。 浏览器支持有限。 外部组件支持较差。 三、如何使用1 .应用场景-实时聊天微服务系统。 2 .具体应用3 .注意事项4、思考点1 .那山之石rpc与传统http接口的区别

HTTP采用浏览器3354服务器操作模式(B/S ),而RPC采用客户端——服务器(C/S )操作模式,请求者为客户端),远程服务提供商为服务器) 执行RPC时

调用时,客户端程序首先会发送一个带有参数的请求到服务端,然后等待服务端响应;在服务端,服务进程保持监听状态,当客户端请求到达时,服务端通过解析请求参数计算出结果,并向客户端发送响应信息,然后继续等待下一个客户端请求。客户端接收到来自服务端的响应信息后,可以执行相应的业务逻辑,也可以继续进行其它 RPC 调用。
主要来阐述HTTP和RPC的异同,让大家更容易根据自己的实际情况选择更适合的方案。

传输协议

RPC:可以基于TCP协议,也可以基于HTTP协议。HTTP:基于HTTP协议。 传输效率 RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理。 性能消耗 RPC:可以基于thrift实现高效的二进制传输。HTTP:大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能。长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。 负载均衡 RPC:基本都自带了负载均衡策略。HTTP:需要配置Nginx,HAProxy来实现。 服务治理 RPC:能做到自动通知,不影响上游。HTTP:需要事先通知,修改Nginx/HAProxy配置。 总结 RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。

Go 语言中的 RPC 编程

一个 RPC 服务端可以注册多个不同类型的对象,但不允许注册同一类型的多个对象。此外,一个对象只有满足以下这些条件的方法,才能被 RPC 服务端设置为可提供远程访问:

必须是在对象外部可公开调用的方法(首字母大写);必须有两个参数,且参数的类型都必须是包外部可以访问的类型或者是 Go 内建支持的类型;第二个参数必须是一个指针;方法必须返回一个 error 类型的值。

以上 4 个条件,可以简单地用如下这行代码表示:

func (t *T) MethodName(argType T1, replyType *T2) error

其中,类型 T、T1 和 T2 分别对应服务对象所属类型、请求类型和响应类型,它们默认都会使用 Go 语言内置的 encoding/gob 包进行编码解码。

该方法(MethodName)的第一个参数表示由 RPC 客户端传入的请求参数,第二个参数表示要返回给 RPC 客户端的响应结果,最后返回的是一个 error 类型的值表示错误信息。

2. 可以攻玉 通过以上所述就可以将,rpc、grpc、protocol-buffer、protoc、protoc-gen-go串联在一起,理解通了。接下来就要思考下etcd、micro、go-micro、protoc-gen-micro之间的关联关系。 五、参考链接 Golang RPC 之 gRPC。RPC与Protobuf。RPC与restful,以及简单引入gRPC。浅谈 RPC 和 REST: SOAP, gRPC, REST。【维基百科-读书笔记】远程过程调用RPC。rpc和http的区别是什么 各自的优缺点有哪些。
, Houye的论文解读,Houye的论文