这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
RPC即远程过程调用(Remote Procedure Call),是一种通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的程序,而程序员无需额外地为这个交互编程。RPC的优点是可以像本地函数一样使用远程服务,简单而高效!
Go语言的RPC包的路径为net/rpc,也就是放在了net包目录下面。大致可以分为http rpc,rpc实现watch,需要登录的rpc认证等等。
Go语言内在的RPC框架已经支持在Http协议上提供RPC服务。但是框架的http服务同样采用了内置的gob协议,并且没有提供采用其它协议的接口,因此从其它语言依然无法访问的。新的RPC服务其实是一个类似REST规范的接口,接收请求并采用相应处理流程。标准库的RPC默认采⽤Go语⾔特有的gob编码,因此从其它语⾔调⽤Go语⾔实现的RPC服务将⽐较困难。
相比较与通用的JSON编码,每个语言都认识它,他就是一个跨语言的编码,但是gob不是跨语言的编码,所以我们要选择一个合适的编码。
常见的编解码:
MessagePack:高效的二进制序列化格式
JSON:文本编码
XML:文本编码
ProtoBuf:二进制编码(即肉眼看不懂,需要按照他的规范去解码,才可以看懂) 在互联⽹的微服务时代,每个RPC以及服务的使⽤者都可能采⽤不同的编程语⾔,因此跨语⾔是 互联⽹时代RPC的⼀个⾸要条件。得益于RPC的框架设计,Go语⾔的RPC其实也是很容易实现跨语⾔⽀持的。
Go语⾔的RPC框架有两个⽐较有特⾊的设计:⼀个是RPC数据打包时可以通过插件实现⾃定义的编码 和解码;另⼀个是RPC建⽴在抽象的io.ReadWriteCloser接⼝之上的,可以将RPC架设在不同的通讯协议之上。