官方提供的 net/rpc 包中提供了远程服务调用(RPC)功能。通过这个包,我们可以发布出服务,供远程调用;同时,客户端通过这个包访问服务端的方法。
和其他服务端应用程序一样,我们需要开启一个监听程序,来接收客户端发起的网络请求。
//启动服务器 func Start(protocal string, port string){ rpc.HandleHTTP() l, e:= net.Listen(protocal, port) if e != nil{ log.Panic("listen error: ", e) } http.Serve(l, nil) }
服务端可以注册对象,暴露出该对象提供的方法,供客户端使用
//注册服务 func Register(v interface{}){ rpc.Register(v) }
我们可以定义自己的服务端对象,通过上述方式发布服务。
//注册服务 server.Register(new(MyService)) //启动服务器 go server.Start("tcp", ":8086")
这样,通过新建一个goroutine,发布好了自己定义的服务MyService。客户端则可以指定服务端的地址进行访问。
//根据地址调用服务,传入参数,获得结果 func CallTarget(address string, service string, args interface{}, reply interface{}) error{ client , err := rpc.DialHTTP("tcp", address) if err != nil{ log.Fatal("dialing ", err) } err = client.Call(service, args, reply) return err }
通过进一步的代码封装,可以隐藏调用细节。
const( Address = "127.0.0.1:8086" ) func (myService *MyService) SayHello(name string) string{ var result string err := client.Call(Address, &name, &result) if err != nil{ panic(err) } return result }
这样客户端就可以简便的使用rpc服务调用了
func main(){ var myService MyService log.Println(myService.SayHello("liusongwei")) }