這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)golang中rpc包如何使用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為南湖企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),南湖網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
golang的rpc支持三個(gè)級(jí)別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨(dú)一無二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開發(fā)的服務(wù)器與客戶端之間的交互,因?yàn)樵趦?nèi)部,它們采用了Gob來編碼。
Go RPC的函數(shù)只有符合下面的條件才能被遠(yuǎn)程訪問,不然會(huì)被忽略,詳細(xì)的要求如下:
函數(shù)必須是導(dǎo)出的(首字母大寫)
必須有兩個(gè)導(dǎo)出類型的參數(shù),
第一個(gè)參數(shù)是接收的參數(shù),第二個(gè)參數(shù)是返回給客- 戶端的參數(shù),第二個(gè)參數(shù)必須是指針類型的
函數(shù)還要有一個(gè)返回值error
舉個(gè)例子,正確的RPC函數(shù)格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
T、T1和T2類型必須能被encoding/gob
包編解碼。
舉一個(gè)http的例子。
下面是http服務(wù)器端的代碼:
package mainimport ("errors""net""net/rpc""log""net/http")type Args struct { A, B int}type Quotient struct { Quo, Rem int}type Arith intfunc (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() l, e := net.Listen("tcp", ":1234")if e != nil { log.Fatal("listen error:", e)} http.Serve(l, nil)}
簡(jiǎn)單分析一下上面的例子,先實(shí)例化了一個(gè)Arith對(duì)象arith,然后給arith注冊(cè)了rpc服務(wù),然后把rpc掛載到http服務(wù)上面,當(dāng)http服務(wù)打開的時(shí)候我們就可以通過rpc客戶端來調(diào)用arith中符合rpc標(biāo)準(zhǔn)的的方法了。
請(qǐng)看客戶端的代碼:
package mainimport ("net/rpc""log""fmt")type Args struct { A, B int}type Quotient struct { Quo, Rem int}func main() { client, err := rpc.DialHTTP("tcp", "127.0.0.1:1234")if err != nil { log.Fatal("dialing:", err)}// Synchronous call args := &Args{ 7,8}var reply int 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)// Asynchronous call quotient := new(Quotient) divCall := client.Go("Arith.Divide", args, quotient, nil) replyCall := <-divCall.Done // will be equal to divCallif replyCall.Error != nil { log.Fatal("arith error:", replyCall.Error)} fmt.Printf("Arith: %d/%d=%d...%d", args.A, args.B, quotient.Quo, quotient.Rem)// check errors, print, etc.}
簡(jiǎn)單說明下,先用rpc的DialHTTP方法連接服務(wù)器端,調(diào)用服務(wù)器端的函數(shù)就要使用Call方法了,Call方法的參數(shù)和返回值已經(jīng)很清晰的表述出rpc整體的調(diào)用邏輯了。
我們把服務(wù)器端跑起來,再把客戶端跑起來,這時(shí)候客戶端會(huì)輸出:
Arith: 7*8=56 Arith: 7/8=0...7
下面是我在阿里云CentOS8服務(wù)器下的測(cè)試結(jié)果截圖,如下圖所示:
本文參與“OSC源創(chuàng)計(jì)劃”,歡迎正在閱讀的你也加入,一起分享。
上述就是小編為大家分享的golang中rpc包如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。