什么是RPC

远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。维基百科:远程过程调用

用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。打个比方,我用go语言写了个获取用户信息的方法getUserInfo,并把go程序部署在阿里云服务器上面,现在我有一个部署在腾讯云上面的php项目,需要调用golang的getUserInfo方法获取用户信息,php跨机器调用go方法的过程就是RPC调用。

golang中如何实现RPC

net/rpcencoding/gobtcphttpgobnet/rpc
net/rpc/jsonrpc
protobufprotobuf

net/rpc库

net/rpchttpnet/http

$GOPATH/src/test/rpc/rpc_server.go

上述服务端程序运行后,将会监听本地的8095端口,我们可以实现一个客户端程序,连接服务端并实现RPC方法调用。

$GOPATH/src/test/rpc/rpc_client.go

net/rpc/jsonrpc库

net/rpcnet/rpc/jsonrpc

$GOPATH/src/test/rpc/jsonrpc_server.go

上述服务端程序启动后,将会监听本地的8096端口,并处理客户端的tcp连接请求。我们可以用golang实现一个客户端程序连接上述服务端并进行RPC调用。

$GOPATH/src/test/rpc/jsonrpc_client.go

protorpc库

jsonrpcprotobufprotobufprotorpc
protobufprotoc

然后,我们编写一个proto文件,定义要实现的RPC方法及其相关参数。

$GOPATH/src/test/rpc/pb/arith.proto

arith.proto
protocarith.protoarith.pb.go
arith.pb.go

$GOPATH/src/test/rpc/protorpc_server.go

运行上述程序,将会监听本地的8097端口并接收客户端的tcp连接。

ariti.pb.go

$GOPATH/src/test/protorpc_client.go

如何跨语言调用golang的RPC方法

net/rpcnet/rpc/jsonrpcprotorpcjsonrpcprotorpc

$PHPROOT/jsonrpc.php

项目地址

项目代码托管在coding上,国内访问应该快一点

使用方法

Linux下使用方法如下:

其他RPC库

除了上面提到的三种在golang实现RPC的方式外,还有一些其他的rpc库提供了类似的功能,比较出名的有google开源的grpc,但是grpc的初次安装比较麻烦,这里就不做进一步介绍了,有兴趣的可以自己了解。