golang 用 rpc 实现远程过程调用

本文介绍了使用Golang实现的简单RPC服务,涉及服务端如何处理请求、验证数据以及客户端如何发起同步和异步调用。展示了服务器端的函数`Multiply`和客户端调用的场景。
摘要由CSDN通过智能技术生成

刚上完线,业务又要刷数据,给的数据还是错得,刚说了没啥事,就找上来了,业务真烦,自己都不看数据的,每次都要开发给他检查一遍,叫他明天再刷
继续学golang

我是服务端(server)

type Args struct {
	N, M int
}

func (t *Args) Multiply(args *Args, reply *int) net.Error {
	*reply = args.N * args.M
	return nil
}

func main() {
	// 服务器端产生一个 Args 类型的对象 calc,并用 rpc.Register(object) 注册
	calc := new(Args)
	rpc.Register(calc)
	// 调用 HandleHTTP(),然后用 net.Listen 在指定的地址上启动监听。也可以按名称来注册对象,例如:rpc.RegisterName("Calculator", calc)。
	rpc.HandleHTTP()
	listener, e := net.Listen("tcp", "localhost:1234")
	if e != nil {
		log.Fatal("Starting RPC-server -listen error:", e)
	}
	// 以协程启动 http.Serve(listener, nil) 后,会为每一个进入 listener 的 HTTP 连接创建新的服务线程。我们必须用诸如 time.Sleep(1000e9) 来使服务器在一段时间内保持运行状态。
	go http.Serve(listener, nil)
	time.Sleep(1000e9)
}

我是客户端(client)

const serverAddress = "localhost"

// 客户端必须知晓对象类型及其方法的定义。
func main() {
	// 执行 rpc.DialHTTP() 连接到服务器
	client, err := rpc.DialHTTP("tcp", serverAddress+":1234")
	if err != nil {
		log.Fatal("Error dialing:", err)
	}
	// Synchronous call
	args := &Args{7, 8}
	var reply int
	// 用 client.Call("Type.Method", args, &reply) 调用远程对象的方法。
	// Type 是远程对象的类型名,Method 是要调用的方法,实际生产按照约定的来改
	// args 是用 Args 类型初始化的对象,
	// reply 是一个必须事先声明的变量,方法调用产生的结果将存入其中。实际生产中这个字段按照约定的来改
	err = client.Call("Args.Multiply", args, &reply)
	// 异步调用如下,方法中的 Done是一个chan,可以从chan中获取结果
	// call1 := client.Go("Args.Multiply", args, &reply, nil)
	// replyCall := <- call1.Done
	// fmt.Println(replyCall)
	if err != nil {
		log.Fatal("Args error:", err)
	}
	fmt.Printf("Args: %d * %d = %d", args.N, args.M, reply)
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值