1. RPC 简介
⚫ 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议
⚫ 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程
⚫ 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用
2. 流行 RPC 框架的对比
3. golang 中如何实现 RPC
⚫ golang 中实现 RPC 非常简单,官方提供了封装好的库,还有一些第三方的库
⚫ golang 官方的 net/rpc 库使用 encoding/gob 进行编解码,支持 tcp 和 http 数据传输方式,由于其他语言不支持 gob 编解码方式,所以 golang 的 RPC 只支持 golang 开发的服务器与客户端之间的交互
⚫ 官方还提供了net/rpc/jsonrpc 库实现RPC 方法,jsonrpc 采用JSON 进行数据编解码,因而支持跨语言调用,目前 jsonrpc 库是基于 tcp 协议实现的,暂不支持 http 传输方式
⚫ golang 的 RPC 必须符合 4 个条件才可以
◼ 结构体字段首字母要大写,要跨域访问,所以大写
◼ 函数名必须首字母大写(可以序列号导出的)
◼ 函数第一个参数是接收参数,第二个参数是返回给客户端参数,必须是指针类型
◼ 函数必须有一个返回值 error
⚫ 例题:golang 实现 RPC 程序,实现求矩形面积和周长
⚫ 练习:模仿前面例题,自己实现 RPC 程序,服务端接收 2 个参数,可以做乘法运算,也可以做商和余数的运算,客户端进行传参和访问,得到结果如下:
⚫ 另外,net/rpc/jsonrpc 库通过 json 格式编解码,支持跨语言调用
4. RPC 调用流程
⚫ 微服务架构下数据交互一般是对内 RPC,对外 REST
⚫ 将业务按功能模块拆分到各个微服务,具有提高项目协作效率、降低模块耦合度、提高系统可用性等优点,但是开发门槛比较高,比如 RPC 框架的使用、后期的服务监控等工作
⚫ 一般情况下,我们会将功能代码在本地直接调用,微服务架构下,我们需要将这个函数作为单独的服务运行,客户端通过网络调用
5. 网络传输数据格式
⚫ 成熟的 RPC 框架会有自定义传输协议,这里网络传输格式定义如下,前面是固定长度消息头,后面是变长消息体
6. 实现 RPC 服务端
⚫ 服务端接收到的数据需要包括什么?
◼ 调用的函数名、参数列表
◼ 一般会约定函数的第二个返回值是 error 类型
◼ 通过反射实现
⚫ 服务端需要解决的问题是什么?
◼ Client 调用时只传过来函数名,需要维护函数名到函数之间的 map 映射
⚫ 服务端的核心功能有哪些?
◼ 维护函数名到函数反射值的 map
◼ client 端传函数名、参数列表后,服务端要解析为反射值,调用执行
◼ 函数的返回值打包,并通过网络返回给客户端
7. 实现 RPC 客户端
⚫ 客户端只有函数原型,使用reflect.MakeFunc() 可以完成原型到函数的调用
⚫ reflect.MakeFunc()是 Client 从函数原型到网络调用的关键
8. 实现 RPC 通信测试
⚫ 给服务端注册一个查询用户的方法,客户端去 RPC 调用