Go語言net包RPC遠程調用三種方式http與json-rpc及tcp
發(fā)布日期:2022-02-01 08:23 | 文章來源:腳本之家
rpc有多種調用方式,http、json-rpc、tcp
一、服務端
在代碼中,啟動了三個服務
package main import ( "log" "net" "net/http" "net/rpc" "net/rpc/jsonrpc" "sync" ) //go對RPC的支持,支持三個級別:TCP、HTTP、JSONRPC //go的RPC只支持GO開發(fā)的服務器與客戶端之間的交互,因為采用了gob編碼 //注意字段必須是導出 type Params struct { Width, Height int } type Rect struct{} //函數必須是導出的 //必須有兩個導出類型參數 //第一個參數是接收參數 //第二個參數是返回給客戶端參數,必須是指針類型 //函數還要有一個返回值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) //注冊一個rect服務 rpc.Register(rect) var wg sync.WaitGroup wg.Add(3) go func() { //把服務處理綁定到http協議上 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() }
二、http客戶端
package main import ( "net/rpc" "log" "fmt" ) type Params struct { Width, Height int } func main() { //連接遠程rpc服務 rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } ret := 0; //調用遠程方法 //注意第三個參數是指針類型 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) }
三、TCP客戶端
package main import ( "net/rpc" "fmt" "log" ) type Params struct { Width, Height int } func main() { //連接遠程rpc服務 //這里使用Dial,http方式使用DialHTTP,其他代碼都一樣 rpc, err := rpc.Dial("tcp", "127.0.0.1:8081") if err != nil { log.Fatal(err) } ret := 0 //調用遠程方法 //注意第三個參數是指針類型 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) }
四、json客戶端
package main import ( "fmt" "log" "net/rpc/jsonrpc" ) type Params struct { Width, Height int } func main() { //連接遠程rpc服務 rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082") if err != nil { log.Fatal(err) } ret := 0 //調用遠程方法 //注意第三個參數是指針類型 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語言net包RPC遠程調用三種方式http與json-rpc及tcp的詳細內容,更多關于Go語言net包RPC遠程調用方式的資料請關注本站其它相關文章!
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯系alex-e#qq.com處理。
相關文章