go - 向一组主机发送带有确认的消息

标签 go rpc

函数如下:

func Message(worker_ID int, message string, args *Args , reply *int) chan bool {
}

这个函数驻留在主机上,当客户端想要向主机发送消息时调用它,主机位于不同的地方,所以发送消息需要IP和端口,对吧?哪种机制对 net.dial()gobrpc 有用?

最佳答案

如果您想要简单的东西,请查看 net/rpc它将 gob 和网络包装到远程过程调用框架中,该框架应该可以执行您想要的操作。

服务器

来自文档,通过 HTTP 运行的服务器

type Args struct {
        A, B int
}

type Arith int

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

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)

客户端

此时,客户端可以看到服务“Arith”,其方法为“Arith.Multiply”。要调用其中一个,请调用服务器然后调用电话。您还可以进行异步调用,结果会返回到 channel 中。

client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
if err != nil {
        log.Fatal("dialing:", err)
}

args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
        log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

该框架的一个轻微奇怪之处是每个远程调用只能有一个输入参数和一个输出参数,这意味着您需要将所有参数包装在一个struct中。

关于go - 向一组主机发送带有确认的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180097/

相关文章:

linux - 如何在另一个进程中调用函数

c - 为什么 malloc 会在这里引发内存损坏?

go - 将自定义 kubernetes 调度程序部署为 pod

golang 使用带超时模式的 channel 跳出循环

go - 如何在 BigQuery 中创建包含非必填字段的表?

java - Java 和 C++ 中最简单的 RPC

json - 如何检查 JSON 是否包含在 golang 中的数组 JSON 对象中

带有 Martini 的 GoLang JWT 抛出 <invalid Value>?

python - grpc Deadline Exceeded错误如何解决?

java - 保持远程对象更新