rpc Call 方法是不是与服务器在同一个 go 例程中运行?

Posted

技术标签:

【中文标题】rpc Call 方法是不是与服务器在同一个 go 例程中运行?【英文标题】:Does rpc Call method run in the same go routine as the server?rpc Call 方法是否与服务器在同一个 go 例程中运行? 【发布时间】:2016-05-04 13:20:32 【问题描述】:

我的服务器:

func (t *Arith) Multiply(args *Args, reply *int) error 
    *reply = args.A * args.B
    return nil

func main() 
    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)

客户:

client.Call("Arith.Multiply", args, &reply)

我想然后Multiply 在另一个 go 例程中运行? client.Call() 实际上调用了go server.SomeFun()?

【问题讨论】:

【参考方案1】:

每个 http 请求都有自己的 goroutine,这是 http.Server 本身的属性,net/rpc 建立在它之上。

来自http.Serve的文档:

Serve 在侦听器 l 上接受传入的 HTTP 连接,创建 每个都有一个新的服务goroutine。服务 goroutine 读取 请求,然后调用处理程序来回复它们。处理程序通常是 nil,在这种情况下使用 DefaultServeMux。

来自rpc.HandleHTTP

HandleHTTP 在 DefaultRPCPath 上为 DefaultServer 注册 RPC 消息的 HTTP 处理程序,并在 DefaultRPCPath 上注册一个调试处理程序 DefaultDebugPath.还是需要调用http.Serve(), 通常在 go 语句中。

【讨论】:

RPC也是一种http请求? @haoyuan 是的,它是通过 http 提供的。

以上是关于rpc Call 方法是不是与服务器在同一个 go 例程中运行?的主要内容,如果未能解决你的问题,请参考以下文章

go微服务RPC的原理与Go RPC

go微服务RPC的原理与Go RPC

go微服务RPC的原理与Go RPC

codis3.2安装报错dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed的处理(代

微服务学习RPC原理与Go RPC

RPC 调用找不到方法