createdtime 20211122
updatedtime 20211124
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)以本地调用的方式发起调用;
- Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体;
- Client stub将消息体通过网络发送给服务端;
- Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;
- Server stub根据方法名和参数进行本地调用;
- 被调用者(Server)本地调用执行后将结果返回给server stub;
- Server stub将返回值打包编码成消息,并通过网络发送给客户端;
- Client stub收到消息后,进行拆包解码,返回给Client;
- Client得到本次RPC调用的最终结果。
grpc是什么?
①gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Golang 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。
rpc和grpc之间的关系是什么?
①rpc是一种协议,grpc是基于rpc协议实现的一种框架。
grpc的解决rpc三大问题
①协议约定。gRPC 的协议是 Protocol Buffers,是一种压缩率极高的序列化协议,Google 在 2008 年开源了 Protocol Buffers,支持多种编程语言,所以 gRPC 支持客户端与服务端可以用不同语言实现。
②传输协议。gRPC 的数据传输用的是 Netty Channel, Netty 是一个高效的基于异步 IO 的网络传输架构。Netty Channel 中,每个 gRPC 请求封装成 HTTP 2.0 的 Stream。
③服务发现。gRPC 本身没有提供服务发现的机制,需要通过其他组件。
2. 我的理解
grpc是一种实现了rpc协议的框架,并且分别通过protocol buffer、netty channel 以及服务发现组件解决rpc的协议约定、传输协议、服务发现三大问题。
二、为什么
解决什么问题,可以带来什么好处?
优点:
- grpc
- Protocol Buffers 压缩性高,速度快。
- HTTP 2.0 流传输。
- 支持多语言。
缺点:
- grpc
三、怎么用
1. 应用场景 - 实时聊天; - 微服务系统。
2. 具体应用
3. 注意事项
四、思考点
1. 它山之石
rpc和传统的http接口的区别
-
与 HTTP 采用浏览器 —— 服务器工作模式(B/S)不同,RPC 采用客户端 —— 服务器(C/S)工作模式,请求程序是一个客户端(Client),而远程服务提供程序是一个服务器(Server)。当执行一个 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的区别是什么 各自的优缺点有哪些。
|