Golang RPC http.Serve vs rpc.ServeConn(HTTP与原始连接)

时间:2013-10-28 16:23:03

标签: http networking tcp go rpc

Go net / rpc库documentation可以通过原始网络连接或HTTP通过网络公开对象。

HTTP示例

arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
    log.Fatal("listen error:", e)
}
go http.Serve(l, nil)

原始TCP网络连接

arith := new(Arith)
rpc.Register(arith)
l, e := net.Listen("tcp", ":1234")
if e != nil {
    log.Fatal("listen error:", e)
}
go func() {
    for {
        conn, err := l.Accept()
        go rpc.ServeConn(conn)
    } 
}

要调用第一种类型的服务器,可以使用rpc.DialHTTP(“tcp”,“127.0.0.1:1234”),第二种类型使用rpc.Dial(“tcp”,“127.0.0.1:1234”) )将被使用。

我的问题是这两者有何不同?运行HTTP服务器与“原始网络连接”服务器有什么优缺点?可以通过curl或浏览器以某种方式使用HTTP执行RPC吗? HTTP版本对跨语言RPC调用有用吗?

1 个答案:

答案 0 :(得分:9)

这个问题的答案很好地描述了HTTP和原始TCP之间的差异(不直接与Go有关)。

TCP Vs. Http Benchmark

它基本上说由于HTTP是用于标准化的TCP之上的一层,如果你计划让你的代码有一个网页试图发出请求并处理响应,那么你应该使用它,但是如果你关心的话关于速度,关闭HTTP并使用原始TCP。