本文讲解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