LEC7-深入浅出 RPC 框架
本文部分图片资料源自《字节内部课》课程学习资料
基本概念
远程函数调用 RPC-Remote Procedure Calls
RPC需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
完整过程
IDL (Interface description language)文件 IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
这个很重要,之前hertz用过,但一直不是很清楚究竟起了什么作用
生成代码 通过编译器工具把IDL文件转换成语言对应的静态库
编解码 从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
利用GenCode,上一步的GenCode里常常有一些结构体和方法,比如GetxxxRequest等等
通信协议 规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
网络传输 通常基于成熟的网络库走TCP/UDP传输
分层设计
编解码层(可认为包含GenCode
采用二进制编码
TLV编码
type(string) tag(1) length(6,martin的长度) "Martin"
协议层
特殊结束符:比如http协议
网络通信层
Sockets API
Sockets API(套接字应用程序接口)是一组用于进行网络通信的编程接口,它允许开发者在应用程序中创建和管理网络套接字,实现数据的传输和通信。Sockets API 是实现网络编程的基础,它在各种编程语言和操作系统中都有相应的实现。
Sockets API 提供了一种抽象层,使开发者能够更轻松地进行网络通信,而不必深入处理底层网络协议的细节。以下是 Sockets API 的一些关键特点和功能:
- 创建套接字: 开发者可以使用 Sockets API 创建套接字,它可以是客户端套接字或服务器端套接字,用于进行连接或监听。
- 绑定和监听: 服务器端套接字可以绑定到特定的地址和端口,然后使用 Sockets API 进行监听,等待客户端连接。
- 连接和接受连接: 客户端套接字可以使用 Sockets API 连接到服务器,服务器可以使用 Sockets API 接受客户端的连接请求。
- 数据传输: 通过套接字,开发者可以使用 Sockets API 进行数据的读取和写入操作,实现实时数据的传输。
- 阻塞和非阻塞模式: Sockets API 支持阻塞和非阻塞两种模式。在阻塞模式下,套接字操作会阻塞线程,直到操作完成或超时。在非阻塞模式下,套接字操作不会阻塞线程,需要通过轮询或事件驱动来检测操作是否完成。
- 事件驱动: 一些 Sockets API 支持事件驱动模型,开发者可以注册回调函数以响应特定的网络事件,如连接建立、数据可读等。
- 错误处理: Sockets API 提供了错误处理机制,允许开发者检测和处理网络相关的错误和异常。
- 多路复用: 通过多路复用技术,Sockets API 允许在一个线程中同时管理多个套接字连接。
- 不同协议支持: Sockets API 支持不同的传输协议,如 TCP、UDP 等。
Sockets API 在 OSI与TCP/IP
在 OSI 模型中,Sockets API 主要与传输层(第四层)和应用层(第七层)相关。它提供了一种在传输层使用 TCP 或 UDP 协议进行数据传输的方式,同时也在应用层提供了对网络通信的抽象接口。
在 TCP/IP 模型中,Sockets API 主要与网络层(第三层)和传输层(第四层)相关。它使用网络层的 IP 地址和传输层的端口号来识别和定位通信对端,并提供了对传输层协议(如 TCP、UDP)的封装。