Go的標準庫中提供了一個json-rpc包,該包實現(xiàn)了json(JavaScript對象表示法)遠程過程調用(RPC)規(guī)范。
json-rpc包可以在HTTP通信協(xié)議上使用,這意味著可以使用json-rpc將客戶端應用程序和服務器進行通信。
下面是一個使用json rpc http實現(xiàn)簡單加法的示例:
package main import ( "fmt" "log" "net/http" "net/rpc" "net/rpc/jsonrpc" ) type Args struct { A, B int } type Arith int func (t *Arith) Add(args *Args, reply *int) error { *reply = args.A + args.B return nil } func main() { arith := new(Arith) rpc.Register(arith) rpc.HandleHTTP() err := http.ListenAndServe(":1234", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
在上面的代碼中,我們首先定義了Args結構體,它擁有兩個屬性A和B,用于存儲加法的操作數(shù)。然后,我們定義了一個Arith類型作為RPC服務的接收者。這里我們實現(xiàn)Add函數(shù),用于計算兩個整數(shù)的和。
在主函數(shù)中,我們將Arith類型注冊為RPC服務,并啟動HTTP服務器。一旦服務器啟動,我們就可以使用HTTP方法調用這個RPC服務。
下面是客戶端的代碼:
package main import ( "fmt" "log" "net/rpc/jsonrpc" ) type Args struct { A, B int } func main() { client, err := jsonrpc.Dial("tcp", "localhost:1234") if err != nil { log.Fatal("dialing:", err) } args := &Args{7, 8} var reply int err = client.Call("Arith.Add", args, &reply) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d+%d=%d", args.A, args.B, reply) }
我們使用jsonrpc包中的Dial函數(shù)連接到服務器端口并調用Arith.Add函數(shù)。最后,我們從服務器返回整數(shù)值,并打印出計算結果。