RPC原理与实现 | 青训营笔记

78 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第10天。

一、本堂课重点内容:

主要了解RPC的基础概念,常用的RPC架构和分层设计原理,学习RPC的关键指标以及实现过程,学习企业中用到的RPC框架。

二、详细知识点介绍:

(1)基础概念

远程函数调用(RPC-Remote Procedure Calls):RPC需要解决的问题:函数映射;数据转换成字节流;网络传输。
IDL文件(interface description language):IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。 通过编译器工具把IDL文件转换成语言对应的静态库。
生成代码:通过编译器工具把IDL文件转换成语言对应的静态库。
编解码:从内存中表示到字节序列的转换称为编码,反之称解码,也常叫做序列化和反序列化。
通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
网络传输:通常基于成熟的网络库走TCP/UDP传输。
RPC的好处:单一职责,有利于分工协作和运维开发;可扩展性强,资源使用率更优;故障隔离,服务的整体可靠性更高。

(2)分层设计

编解码层:通过代码生成工具把IDL文件转换成不同语言对应的lib代码,里面封装了编解码逻辑。
协议层:协议是双方确定的交流语义,包含特殊结束符(一个特殊字符作为每个协议单元结束的标示)和变长协议(以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度)。
网络协议层:套接字编程中的客户端必须知道两个消息:服务的IP地址,以及端口号。

(3)关键指标

稳定性:保障策略。熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路。限流:保护被调用方,防止大流量把服务压垮。超时控制:避免浪费资源在不可用节点上。
易用性:开箱即用,合理的默认参数选项、丰富的文档;周边工具,生成代码工具、脚手架工具。
扩展性:Middleware,Option,编解码层,协议层,网络传输层,代码生成工具插件扩展。
观测性:Log,Metric,Tracing。内置观测性服务。
高性能:实现高吞吐、低延迟的目标。例如连接池,多路复用,高性能编解码协议,高性能网络库。

(4)企业实践

整体架构:Kitex Core(核心组件),Kitex Byted(与公司内部基础设施集成),Kitex Tool(代码生成工具)。
自制网络库:解决无法感知连接状态的问题,引入epoll主动监听机制,感知连接状态;解决goroutine暴涨的风险,建立goroutine池,复用goroutine;提升性能:引入Nocopy Buffer,向上层提供了Nocopy的调用接口,编解码层面零拷贝。
扩展性设计:支持多协议,也支持灵活的自定义协议扩展。
网络库优化:调度优化,LinkBuffer,Pool。
编解码优化: Codegen,JIT。
合并部署:将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用。

三、课后个人总结:

服务化、微服务和分布式系统架构的基础场景的实现主要方式就是RPC框架。

四、引用参考:

blog.csdn.net/kingcat666/…