您好,登錄后才能下訂單哦!
這篇文章主要介紹Go語(yǔ)言中net包RPC遠(yuǎn)程調(diào)用方式有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在代碼中,啟動(dòng)了三個(gè)服務(wù)
package main import ( "log" "net" "net/http" "net/rpc" "net/rpc/jsonrpc" "sync" ) //go對(duì)RPC的支持,支持三個(gè)級(jí)別:TCP、HTTP、JSONRPC //go的RPC只支持GO開發(fā)的服務(wù)器與客戶端之間的交互,因?yàn)椴捎昧薵ob編碼 //注意字段必須是導(dǎo)出 type Params struct { Width, Height int } type Rect struct{} //函數(shù)必須是導(dǎo)出的 //必須有兩個(gè)導(dǎo)出類型參數(shù) //第一個(gè)參數(shù)是接收參數(shù) //第二個(gè)參數(shù)是返回給客戶端參數(shù),必須是指針類型 //函數(shù)還要有一個(gè)返回值error func (r *Rect) Area(p Params, ret *int) error { *ret = p.Width * p.Height return nil } func (r *Rect) Perimeter(p Params, ret *int) error { *ret = (p.Width + p.Height) * 2 return nil } func main() { rect := new(Rect) //注冊(cè)一個(gè)rect服務(wù) rpc.Register(rect) var wg sync.WaitGroup wg.Add(3) go func() { //把服務(wù)處理綁定到http協(xié)議上 rpc.HandleHTTP() err := http.ListenAndServe(":8080", nil) wg.Wait() if err != nil { log.Fatal(err) defer wg.Done() } }() log.Println("http rpc service start success addr:8080") go func() { tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081") tcplisten, err := net.ListenTCP("tcp", tcpaddr) if err != nil { log.Fatal(err) defer wg.Done() } for { conn, err3 := tcplisten.Accept() if err3 != nil { continue } go rpc.ServeConn(conn) } }() log.Println("tcp rpc service start success addr:8081") go func() { tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8082") tcplisten, err := net.ListenTCP("tcp", tcpaddr) if err != nil { log.Fatal(err) defer wg.Done() } for { conn, err3 := tcplisten.Accept() if err3 != nil { continue } go jsonrpc.ServeConn(conn) } }() log.Println("tcp json-rpc service start success addr:8082") wg.Wait() }
package main import ( "net/rpc" "log" "fmt" ) type Params struct { Width, Height int } func main() { //連接遠(yuǎn)程rpc服務(wù) rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } ret := 0; //調(diào)用遠(yuǎn)程方法 //注意第三個(gè)參數(shù)是指針類型 err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret) if err2 != nil { log.Fatal(err2) } fmt.Println(ret) err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret) if err3 != nil { log.Fatal(err3) } fmt.Println(ret) }
package main import ( "net/rpc" "fmt" "log" ) type Params struct { Width, Height int } func main() { //連接遠(yuǎn)程rpc服務(wù) //這里使用Dial,http方式使用DialHTTP,其他代碼都一樣 rpc, err := rpc.Dial("tcp", "127.0.0.1:8081") if err != nil { log.Fatal(err) } ret := 0 //調(diào)用遠(yuǎn)程方法 //注意第三個(gè)參數(shù)是指針類型 err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret) if err2 != nil { log.Fatal(err2) } fmt.Println(ret) err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret) if err3 != nil { log.Fatal(err3) } fmt.Println(ret) }
package main import ( "fmt" "log" "net/rpc/jsonrpc" ) type Params struct { Width, Height int } func main() { //連接遠(yuǎn)程rpc服務(wù) rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082") if err != nil { log.Fatal(err) } ret := 0 //調(diào)用遠(yuǎn)程方法 //注意第三個(gè)參數(shù)是指針類型 err2 := rpc.Call("Rect.Area", Params{150, 100}, &ret) if err2 != nil { log.Fatal(err2) } fmt.Println(ret) err3 := rpc.Call("Rect.Perimeter", Params{150, 100}, &ret) if err3 != nil { log.Fatal(err3) } fmt.Println(ret) }
以上是“Go語(yǔ)言中net包RPC遠(yuǎn)程調(diào)用方式有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。