go语言中常用的功能之八(远程调用jsonrpc使用)

本文讲解go语言中远程调用jsonrpc的使用

1. rpc的定义

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

2. jsonrpc的使用

go语言中封装了一个好用的基于json的远程调用协议jsonrpc

jsonrpc服务的书写规范

step 1
jsonrpc 都是基于结构体内置方法的,所以我们首先定义一个结构体

type SomeService struct{}

step 2
jsonrpc 的内置方法规范是两个参数,一个错误类型的返回值
且两个参数分别是
第一个:你出入需要处理的参数(如果是多个,可自定义结构体封装解决)
第二个:指针类型的返回值

这里,我们使用做一个整数的除法

type Args struct {
    A,B int
}

func (DemoService)Div(args Args,result *float64) error {
	if args.B == 0 {
		return fmt.Errorf("div by zero")
	}
	*result = float64(args.A)/float64(args.B)
	return nil
}

step3
开启服务端监听

扫描二维码关注公众号,回复: 5282397 查看本文章
func main() {
    //1. 注册服务到rpc
	rpc.Register(server.DemoService{})
	//2. 开启监听1213端口
	listener,err := net.Listen("tcp",":1213")
	if err != nil {
		panic(err)
	}
	for  {
	    //3. 接收连接
		conn,err := listener.Accept()
		if err != nil {
			log.Printf("%v\n",err)
			continue
		}
		//4. 让jsonrpc服务处理连接 
		go jsonrpc.ServeConn(conn)
	}
}

step4
我们使用 telnet工具尝试一下:

telnet localhost 1213

然后输入

{"method":"DemoService.Div","Params":[{"A":8,"B":6}],"id":12}

打印结果:
{“id”:12,“result”:1.3333333333333333,“error”:null}

注意:这里的method即为服务的方法 Params 为参数,id唯一标志每个请求会跟随结果一起返回

step5
搭建客户端

func main() {
    //1. 远程连接1213
	conn,err := net.Dial("tcp",":1213")
	if err != nil {
		panic(err)
	}
	defer conn.Close()
	//2. 将连接交给jsonrpc处理
	client := jsonrpc.NewClient(conn)
	defer client.Close()
	var res float64
	//3. 开启远程调用
	err = client.Call("DemoService.Div",server.Args{3,4},&res)
	if err != nil {
		panic(err)
	}
	fmt.Println("res is ",res)
}

打印结果:
res is 0.75

3. 完整项目地址

github

猜你喜欢

转载自blog.csdn.net/wujiangwei567/article/details/87834847