RPC框架学习 | 青训营笔记

77 阅读2分钟
这是我参与「第五届青训营」伴学笔记创作活动的第 9 天

什么是RPC

和本地函数比较

RPC 是 Remote Procedure Calls 的缩写,远程过程调用,意味着方法和服务不在本地机器上,与之对应的是本地函数,通常执行在内存的栈上。

RPC 调用过程

IDL文件规范方法和参数,编译工具把IDL编译为静态库,编解码,通过网络协议传输。

优点和问题

优点:单一职责,利于开发和运维;可拓展性强,节省资源;故障隔离,提高整体可靠性。

服务器宕机如何处理,调用时网络异常如何处理(RPC框架解决),请求量突发。

分层设计

编解码层

服务端和客户端依赖于一份IDL文件,可以生成不同语言的代码。

数据格式可以使用特定语言编码的字节序列,JSON、XML等文本文件,或者二进制编码。

协议层

协议是双方确定的交流语义,比如HTTP的特殊序列表示结束,变长协议是自定义协议,由定长和不定长两部分组成。

网络通信层

使用 Socket 套接字编程,客户端得知IP地址和端口号发起连接,调用read,write函数通信。

关键指标

稳定性

熔断保障的是被调服务出现问题,而不至于影响整体。

限流保护被调用方,防止流量过大导致服务崩溃。

超时是避免资源浪费在不可用的节点。

易用性

要能开箱即用,有丰富文档。

有周边工具,如生成代码工具和脚手架工具。

扩展性

使用中间件扩展。

观测性

使用Log,Metric,Tracing

内置观测服务。

高性能

高性能要实现比特场景下的高吞吐和低延迟服务。

可以使用连接池,多路复用,高性能编解码协议和高性能网络库。

使用实践

Kitex 框架

Kitex 框架包含 Kitex Core 核心组件,Kitex Byted 和公司内部基础设施集成,Kitex Tool 代码生成工具。

网络库 Netpoll 和优化

通过引入 epoll 主动监听机制,解决无法感知连接状态的问题。

建立goroutine池,复用goroutine。

引入Nocopy Buffer,实现编解码层面的零拷贝。