rpc是一种通信协议,也就是计算机之间的沟通方式,类比http,mysql等,计算机之间通信是网络连接,tcp/ip协议里一个网络连接包含五元组信息-协议-端口-ip,rpc通过在一个网络连接上设置stub,监控这个连接的rpc请求,一般情况rpc的server端绑定的stub的载体有:1.http协议上,监听所有的http连接(指定server端ip,协议,端口),所有通过http协议过来的连接,如果有rpc请求,都会被rpc的server端捕捉(当前前提是这个请求已经注册在了rpc-seveer中);2.tcp连接
rpc关注2方面内容:1.传输方式-服务端的载体-传递数据的协议-因为rpc是会话层的沟通方式,所以要考虑在传输的下层的哪一层绑定:是绑定了一个协议-基于http协议,还是绑定在了一个tcp连接上,2.服务端和客户端共同使用的-数据传输的格式:json/xml/protobuf 只要统一了数据传输格式,以及载体,就可以用客户端调用服务端的rpc服务,客户端不限语言。
JSON和protobuf是支持多语言的-即这些协议能够翻译成其他语言如java;golang官方的net/rpc
库使用encoding/gob
进行编解码,支持http和tcp协议的传输方式;
什么是RPC
远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。维基百科:远程过程调用
用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。打个比方,我用go语言写了个获取用户信息的方法getUserInfo,并把go程序部署在阿里云服务器上面,现在我有一个部署在腾讯云上面的php项目,需要调用golang的getUserInfo方法获取用户信息,php跨机器调用go方法的过程就是RPC调用。
golang中如何实现RPC
在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。Go RPC可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式。golang官方的net/rpc
库使用encoding/gob
进行编解码,支持tcp
或http
数据传输方式,由于其他语言不支持gob
编解码方式,所以使用net/rpc
库实现的RPC方法没办法进行跨语言调用。
golang官方还提供了net/rpc/jsonrpc
库实现RPC方法,JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。但目前的jsonrpc库是基于tcp协议实现的,暂时不支持使用http进行数据传输。
除了golang官方提供的rpc库,还有许多第三方库为在golang中实现RPC提供支持,大部分第三方rpc库的实现都是使用protobuf
进行数据编解码,根据protobuf
声明文件自动生成rpc方法定义与服务注册代码,在golang中可以很方便的进行rpc服务调用。
rpc | rpc 包提供了一个方法来通过网络或者其他的I/O连接进入对象的外部方法. | |
jsonrpc | jsonrpc 包使用了rpc的包实现了一个JSON-RPC的客户端解码器和服务端的解码器. |
下面的例子演示一下如何使用golang官方的net/r