基本概念
函数的本地调用:实参压栈-》函数指针找到函数,从栈中取出赋给形参->计算并存储结果->结果压栈,从函数入口返回->从栈中取出结果,赋值给结果参数
Remote Procedure Calls:例如支付函数的调用,要解决函数映射,不同进程地址空间的调用;数据转换成字节流发送给服务端;网络传输
概念模型:RPC过程有五个模型 User、User-Stub、RPC-Runtime、Server-Stub、Server
一次RPC的完整过程
- IDL(Interface description language)文件
IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信 - 生成代码
通过编译器工具把 IDL 文件转换成语言对应的静态库 - 编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化 - 通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据 - 网络传输
通常基于成熟的网络库走 TCP/UDP 传输
优势
1.单一职责,有利于分工协作和运维开发
2.可扩展性强,底层服务的复用
3.故障隔离服务整体可靠性更高
问题
服务宕机处理、网络异常保证消息的可达性、请求量突增保证服务可达性;
分层设计
业务逻辑代码->IDL转lib代码(客户端与服务端依赖同一个IDDL文件)->编解码层->协议层->通信层
编解码数据格式:
语言特定的编码为字节序列函数;
文本格式:JSON(传输格式和性能欠缺);XML;CSV
二进制编码:TLV(Tag,Length;value)
选型:兼容性;通用性;性能
协议层
协议构造:
LENGTH:数据包大小,不包含自身
HEADER MAGIC:标识版本信息,协议解析时候快速校验
SEQUENCE NUMBER:表示数据包的 seqlD可用于多路复用,单连接内递增
HEADER SIZE:头部长度,从第14个字节开始计算一直到 PAYLOAD前
PROTOCOL ID:编解码方式,有 Binary 和Compact 两种
TRANSFORM ID:压缩方式,如 zlib 和 snappy
INFO ID:传递一些定制的 meta 信息
PAYLOAD:消息体
协议解析:协议类型->编解码方式->解码
通信层
Socket API
Socket API 是操作系统提供的一套编程接口,用于实现进程间通信(Inter-Process Communication, IPC),特别是跨网络的通信。Socket 是一种抽象的概念,它代表了两个端点之间的双向通信连接。每个端点通常由一个IP地址和一个端口号组成。Socket API 提供了一系列函数来创建、配置和管理这些连接。
主要功能包括:
- 创建 Socket:通过
socket()
函数创建一个新的Socket对象。 - 绑定地址:使用
bind()
函数将Socket绑定到特定的地址和端口。 - 监听连接请求:服务器端使用
listen()
函数开始监听来自客户端的连接请求。 - 接受连接:服务器使用
accept()
函数接受客户端的连接请求,建立连接。 - 发送和接收数据:使用
send()
和recv()
函数在已建立的连接上发送和接收数据。 - 关闭连接:使用
close()
函数关闭Socket连接。