rpc
包提供通过网络或其他I/0
连接的对象的导出方法的访问。服务器注册一个对象,使其作为具有对象类型名称的可见服务。注册后,可以远程访问对象的导出方法。服务器可以注册不同类型的多个对象服务,但是注册相同类型的多个对象是错误的。而且对象上的方法只有满足下面的条件时,远程调用才能可用,否则方法会被忽略。
- 方法的类型是可导出的
- 方法是导出的
- 方法有两个参数,都是可导出的
- 第二个参数是指针类型
- 方法返回一个error类型
方法看起来像下面结构:
func (t *T) MethodName(argType T1, replyType *T2) error
T1
和T2
可以通过encoding/gob
进行编码。方法的第一个参数代表调用者提供的参数,第二个参数代表返回给调用者的结果参数。方法返回的值如果不为空,那么返回reply
参数将不会返回给客户端。
示例
服务端处理过程
- 首先使用
Register
或者RegisterName
去注册一个rpc
服务。 - 接着调用
Listen
方法直接监听本地网络上的地址,官方给的例子中在监听之前调用了rpc.HandleHTTP
方法。
// rpc.HandleHTTP()
func HandleHTTP() {
DefaultServer.HandleHTTP(DefaultRPCPath, DefaultDebugPath)
}
const (
DefaultRPCPath = "/_goRPC_"
DefaultDebug = "/debug/rpc"
)
func (server *Server) HandleHTTP(rpcPath, debugPath string) {
http.Handle(rpcPath, server)
http.Handle(debugPath, debugHTTP{server})
}
注册了两个handler
,可以查看服务调用的情况。例如用Listen
监听