socket protobuf rpc之间的理解
三者的定义
1.socket
套接字,与底层TCP/IP网络协议栈打交道的对象,直接利用socket进行通信的,类似传统的TCP/UDP的通信,这种通信是以数据流的形式进行交换的,也就是我们称为的二进制数据。 那么当CS两端取得数据之后,也是由二进制数据,至于读出来的数据具体代表什么,需要用户自己去完成。
2.protobuf
google开源的一种序列化和反序列化工具,这个工具就是用户可以自己定义不同的数据类型,然后通过这个工具将不同数据类型转换为二进制,实际是一种编码的过程,然后通过网络传统,同样可以进行反序列化,得到用户自己定义的不同数据类型的数据。但是它只是一种数据序列化和反序列化的工具,对于序列化或者反序列化的数据有什么含义,具体做什么这些都不知道。
3.rpc
远程调用框架,从本质上来说是一种框架,或者叫一种方法,通过这种方法可以访问远端机器上的进程或者服务,它其实底层是由上述的这几层来完成的,但是需要注意的是,因为在rpc调用过程中我们还需要定义更上层的数据协议,例如数据包有哪些组成,调用过程中的参数,返回值,堆栈信息等等这些,以及在多线程的调用,会不会出现这些阻塞现象,这些都需要额外的协议去封装,所以一般的rpc会在序列化工具(例如:protobuf)基础上进行封装一层用户自定义的协议,百度就是baidu-std,google的是gprc。通过这个协议来完成rpc的功能。
分层理解
grpc工作原理
在 gRPC 里客户端应用可以像调用本地方法一样直接调用另一台机器上服务端应用的方法,这样我们就很容易创建分布式应用和服务。跟其他 RPC 系统类似,gRPC 也是基于以下理念:首先定义一个服务,定义能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个方法,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根,这个存根就是长得像服务端一样的方法(但是没有具体实现),客户端通过这个存根调用服务端的方法。
grpc工作原理,如下图:
Protobuf例子
- 创建
.proto
文件,定义数据结构 - 安装ProtoBuf编译器
- 将
.proto
文件,编译成制定语言类库 protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/your.proto
- 生成
_pb2.py
文件就可以直接用在python脚本中 - 然后在程序中
import addressbook_pb2