百度查的东西都是 类似 "RPC 就是要像调用本地的函数一样去调远程函数" "RPC vs Restful" "RPC vs Socket" "RPC vs http" 之类的, 上面这些我都算理解.
不过我没明白的是, 那么 RPC 作为一个协议都约束了什么? 约束了 API 吗?
譬如下段代码中的RegisterName
net.Listen
listener.Accept()
rpc.ServeConn(conn)
如果不是, 那到底约束了啥? 还是说 RPC 就是一个抽象概念而已. 没啥实际协议?
// HelloService 123
type HelloService struct{}
//Hello 方法必须满足 Go 语言的 RPC 规则:
//方法只能有两个可序列化的参数, 其中第二个参数是指针类型, 并且返回一个 error 类型,
//同时必须是公开的方法。
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
//将 HelloService 类型的对象注册为一个 RPC 服务
func main() {
// 1. 注册
rpc.RegisterName("HelloService", new(HelloService))
// 2. 创建 listener
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
// 3. 获取一个连接
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
// 4. 把连接和 rpc 绑定.被注册的 HelloService 和 conn 绑定.
rpc.ServeConn(conn)
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.