Go RPC
来源:互联网 发布:淘宝发布宝贝图片大小 编辑:程序博客网 时间:2024/05/23 13:28
什么是RPC?
RPC是Remote Procedure Call的缩写,从字面意思理解就是远程过程调用,具体可以见维基百科的解释,如果你英文足够好可以看这里wikipedia,我的理解可以简单的用一句话来描述:RPC就是一个本地程序可以通过网络调用远程的一个子程序。
Go RPC
Go的RPC中如果客户端是Go语言编写的则将用Go特有的Gob序列化,同时可以选择rpc/jsonrpc包来用json格式序列化以便和其他的RPC System交互。
Go中的RPC有以下几个限制:
1.Remote Procedure必须是公共的,对于Go的话函数首字母必须大写。
2.Remote Procedure必须又且仅有两个参数,第一个参数是一个指向从客户端接受的数据指针,第二个参数是一个指向返回给客户端数据的指针。
3.返回值是一个error
例如,如下函数是正确的:
func F(&t1,&2) error
在rpc的Server端,我们需要通过Register方法为一个接口完成“注册”,“注册”完成之后客户端就可以通过这个接口的方法调用远程过程(Remote Procedure),例如:rpc.Register(obj)
一个例子:
ArithServer:
package mainimport ( "fmt" "net/rpc" "errors" "net/http")type Args struct { A,B int}type Quotient struct { Quo,Rem int}type Arith int// 需要远程调用的方法func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil}// 需要远程调用的方法func (t *Arith) Divide(args *Args,quo *Quotient) error { if args.B == 0 { return errors.New("divide by zero") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil}func main() { arith := new(Arith) // 注册 rpc.Register(arith) rpc.HandleHTTP() err := http.ListenAndServe(":1234",nil) if err != nil { fmt.Println(err.Error()) }}
ArithClient:
package mainimport ( "net/rpc" "fmt" "log" "os")type Args struct { A,B int}type Quotient struct { Quo,Rem int}func main() { if len(os.Args) != 2 { fmt.Println("Usage: ",os.Args[0],"server")os.Exit(1) } serverAddress := os.Args[1] client,err := rpc.DialHTTP("tcp", serverAddress+":1234") if err != nil { log.Fatal("dialing:",err) } // Synchronous call args := Args{17,8} var reply int //远程调用,args是传给远程函数的参数,reply用来接收函数的结果 err = client.Call("Arith.Multiply",args,&reply) if err != nil { log.Fatal("arith error:",err) } fmt.Printf("Arith: %d*%d=%d\n",args.A,args.B,reply) var quot Quotient //远程调用,args是传给远程函数的参数,reply用来接收函数的结果 err = client.Call("Arith.Divide",args,") if err != nil { log.Fatal("arith error:",err) } fmt.Printf("Arith: %d/%d=%d remainder %d\n",args.A,args.B,quot.Quo,quot.Rem)}
开启服务端后再运行客户端:
go run ArithClient localhost
结果:
Arith: 17*8=136
Arith: 17/8=2 remainder 1
阅读全文
0 0
- Go RPC
- Go RPC
- go语言RPC
- go RPC服务过程
- go rpc 简单用法
- rpc的go 和 call
- Go net/rpc 包总结
- Go实战--go中使用rpc(The way to go)
- Go语言的RPC介绍(含Protobuf-RPC)
- Go语言的RPC介绍(含Protobuf-RPC)
- Go语言的RPC介绍(含Protobuf-RPC)
- Go语言_RPC_Go语言的RPC
- Go语言学习之TCP RPC
- Go语言学习之JSON RPC
- ATC:go Thrift RPC 使用 (连接池)
- Go网络编程之RPC编程
- 使用go reflect实现一套简易的rpc框架
- RPC框架Thrift (C++和GO语言例子)
- 标签入门
- 方法(打印m行n列)
- 在IBM bluemix公有云上部署容器
- 微信小程序快速开发:视频指导版
- static 使用
- Go RPC
- Java生态研究
- leetcode59. Spiral Matrix II
- android crash 二 Android端线上NativeCrash收集的两种方法(下)
- LeetCode 330. Patching Array
- [R语言]查看内置数据集
- web安全学习规划
- 单例模式解析(二)
- MVP架构开发,一篇让你从看懂到会使用