嵌入式技术
RPC是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。互联网时代,RPC已经和IPC一样成为一个不可或缺的基础构件。 Go语言的标准库也提供了一个简单的RPC实现,包名为net/rpc。下面是使用该包的基本框架:
在Server端需要完成两件事
明确服务名称和接口方法:方法只能有两个可序列化的参数,第二个参数是指针类型,并返回error类型,同时必须是公开的方法
注册RPC服务并绑定到某一端口进行监听
//构造一个类型,添加Hello方法
type HelloService struct{}
//注意Go语言的RPC规则
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
func main() {
rpc.RegisterName("HelloService", new(HelloService)) //注册结构体类型为RPC服务
//这里建立TCP连接用于RPC服务,也支持HTTP协议的RPC
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("Listen TCP error:", err)
}
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
rpc.ServeConn(conn)
}
在client需要完成一件事:访问端口连接并调用接口方法
func main() {
//尝试与server端建立TCP连接
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dial RPC error:", err)
}
var reply string
//调用远程方法并传入参数
err = client.Call("HelloService.Hello", "barret", &reply)
if err != nil {
log.Fatal("call RPC function error:", err)
}
fmt.Println(reply)
}
需要注意的是:标准库的RPC默认采用Go语言特有的gob编码,因此从其它语言调用Go语言实现的RPC服务将比较困难。虽然可以通过额外的工作支持跨语言,但是其实没必要,我们可以使用ProtoBuf和gRPC等框架支持跨语言。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !