golang rpc demo
生活随笔
收集整理的這篇文章主要介紹了
golang rpc demo
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RPC工作流程圖
?
- 1.調用客戶端句柄;執(zhí)行傳送參數
- 2.調用本地系統(tǒng)內核發(fā)送網絡消息
- 3.消息傳送到遠程主機
- 4.服務器句柄得到消息并取得參數
- 5.執(zhí)行遠程過程
- 6.執(zhí)行的過程將結果返回服務器句柄
- 7.服務器句柄返回結果,調用遠程系統(tǒng)內核
- 8.消息傳回本地主機
- 9.客戶句柄由內核接收消息
- 10.客戶接收句柄返回的數據
?
Go語言提供對RPC的支持:HTTP、TCP、JSPNRPC,但是在Go中RPC是獨一無二的,它采用了GoLang Gob編碼,只能支持Go語言!
- GoLang Gob:是Golang包自帶的一個數據結構序列化的編碼/解碼工具。編碼使用Encoder,解碼使用Decoder。一種典型的應用場景就是RPC(remote procedure calls)。
HTTP RPC Demo
- 服務端的代碼 package mainimport ("errors""fmt""net/http""net/rpc"
)type Arith int func rpcDemo() {arith := new(Arith)fmt.Println("arith===", arith)rpc.Register(arith)//HandleHTTP將RPC消息的HTTP處理程序注冊到Debug服務器//DEFAUTUPCPATH和Debug調試路徑上的調試處理程序。//仍然需要調用http.Services(),通常是在GO語句中。
rpc.HandleHTTP()err := http.ListenAndServe(":1234", nil)if err != nil {fmt.Println("err=====", err.Error())}
}type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}//函數必須是導出的(首字母大寫)
//必須有兩個導出類型的參數,
//第一個參數是接收的參數,第二個參數是返回給客戶端的參數,第二個參數必須是指針類型的
//函數還要有一個返回值error
func (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Bfmt.Println("這個方法執(zhí)行了啊---嘿嘿--- Multiply ", reply)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.Bquo.Rem = args.A % args.Bfmt.Println("這個方法執(zhí)行了啊---嘿嘿--- Divide quo==", quo)return nil
}func main() {rpcDemo()
}
服務端運行:go run server.go
- 客戶端的代碼 package mainimport ("flag""fmt""log""net/rpc""strconv"
)type ArgsTwo struct {A, B int
}type QuotientTwo struct {Quo, Rem int
}type Conf struct {serverAddress stringi1 stringi2 string
}var conf = Conf{}func SetConfiguration() {flag.StringVar(&conf.serverAddress, "address", "127.0.0.1:1234", "The address of the rpc")flag.StringVar(&conf.i1, "i1", "100", "100")flag.StringVar(&conf.i2, "i2", "2", "2")
}func main() {SetConfiguration()flag.Parse()fmt.Println("severAddress = ", conf.serverAddress)// DelayHTTP在指定的網絡地址連接到HTTP RPC服務器// 在默認HTTP RPC路徑上監(jiān)聽。client, err := rpc.DialHTTP("tcp", conf.serverAddress)if err != nil {log.Fatal("發(fā)生錯誤了 在這里地方 DialHTTP", err)}i1_, _ := strconv.Atoi(conf.i1)i2_, _ := strconv.Atoi(conf.i2)args := ArgsTwo{A: i1_, B: i2_}var reply int//調用調用命名函數,等待它完成,并返回其錯誤狀態(tài)。err = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("Call Multiply 發(fā)生錯誤了哦 arith error:", err)}fmt.Printf("Arith 乘法: %d*%d=%d\n", args.A, args.B, reply)var quot QuotientTwo//調用調用命名函數,等待它完成,并返回其錯誤狀態(tài)。err = client.Call("Arith.Divide", args, ")if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith 除法取整數: %d/%d=%d 余數 %d\n", args.A, args.B, quot.Quo, quot.Rem)
}
客戶端編譯:go build client.go
客戶端運行: - [root@wangjq rpc]# ./client
severAddress = 127.0.0.1:1234
Arith 乘法: 100*2=200
Arith 除法取整數: 100/2=50 余數 0
[root@wangjq rpc]#
[root@wangjq rpc]# ./client --address 127.0.0.1:1234 -i1 200 -i2 5
severAddress = 127.0.0.1:1234
Arith 乘法: 200*5=1000
Arith 除法取整數: 200/5=40 余數 0
?
?
轉載于:https://www.cnblogs.com/wangjq19920210/p/11571591.html
總結
以上是生活随笔為你收集整理的golang rpc demo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 nginx yum 配置
- 下一篇: golang grpc demo