远程过程调用(Remote Procedure Call,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程序,实现求矩形面积和周长
服务端
客户端
golang写RPC程序,必须符合4个基本条件,不然RPC用不了
结构体字段首字母要大写,可以别人调用
函数名必须首字母大写
函数第一参数是接收参数,第二个参数是返回给客户端的参数,必须是指针类型
函数还必须有一个返回值error
练习:模仿前面例题,自己实现RPC程序,服务端接收2个参数,可以做乘法运算,也可以做商和余数的运算,客户端进行传参和访问,得到结果如下:
服务端代码
点击查看代码
客户端代码
另外,net/rpc/jsonrpc库通过json格式编解码,支持跨语言调用
go服务端代码
go客户端代码
python客户端代码
python打印结果:<code>{'id': 100, 'result': 'hello 懂事儿', 'error': None} <class 'dict'></code>
微服务架构下数据交互一般是对内 RPC,对外 REST
将业务按功能模块拆分到各个微服务,具有提高项目协作效率、降低模块耦合度、提高系统可用性等优点,但是开发门槛比较高,比如 RPC 框架的使用、后期的服务监控等工作
一般情况下,我们会将功能代码在本地直接调用,微服务架构下,我们需要将这个函数作为单独的服务运行,客户端通过网络调用
两端要约定好数据包的格式
成熟的RPC框架会有自定义传输协议,这里网络传输格式定义如下,前面是固定长度消息头,后面是变长消息体
服务端接收到的数据需要包括什么?
调用的函数名、参数列表,还有一个返回值error类型
服务端需要解决的问题是什么?
Map维护客户端传来调用函数,服务端知道去调谁
服务端的核心功能有哪些?
维护函数map
客户端传来的东西进行解析
函数的返回值打包,传给客户端
客户端只有函数原型,使用reflect.MakeFunc() 可以完成原型到函数的调用
reflect.MakeFunc()是Client从函数原型到网络调用的关键
给服务端注册一个查询用户的方法,客户端使用RPC方式调用
参考链接