天天看点

golang中的RPC开发-2

远程过程调用(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} &lt;class 'dict'&gt;</code>

微服务架构下数据交互一般是对内 RPC,对外 REST

将业务按功能模块拆分到各个微服务,具有提高项目协作效率、降低模块耦合度、提高系统可用性等优点,但是开发门槛比较高,比如 RPC 框架的使用、后期的服务监控等工作

一般情况下,我们会将功能代码在本地直接调用,微服务架构下,我们需要将这个函数作为单独的服务运行,客户端通过网络调用

两端要约定好数据包的格式

成熟的RPC框架会有自定义传输协议,这里网络传输格式定义如下,前面是固定长度消息头,后面是变长消息体

服务端接收到的数据需要包括什么?

调用的函数名、参数列表,还有一个返回值error类型

服务端需要解决的问题是什么?

Map维护客户端传来调用函数,服务端知道去调谁

服务端的核心功能有哪些?

维护函数map

客户端传来的东西进行解析

函数的返回值打包,传给客户端

客户端只有函数原型,使用reflect.MakeFunc() 可以完成原型到函数的调用

reflect.MakeFunc()是Client从函数原型到网络调用的关键

给服务端注册一个查询用户的方法,客户端使用RPC方式调用

参考链接