RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。html
它的工做流程以下圖:golang
golang 使用 RPC的例子以下:服務器
服務器端代碼:網絡
這裏暴露了一個RPC接口,一個HTTP接口tcp
package main htm
import (
"fmt"
"io"
"net"
"net/http"
"net/rpc"
) blog
type Watcher int 接口
func (w *Watcher) GetInfo(arg int, result *int) error {
*result = 1
return nil
} rpc
func main() { get
http.HandleFunc("/ghj1976", Ghj1976Test)
watcher := new(Watcher)
rpc.Register(watcher)
rpc.HandleHTTP()
l, err := net.Listen("tcp", ":1234")
if err != nil {
fmt.Println("監聽失敗,端口可能已經被佔用")
}
fmt.Println("正在監聽1234端口")
http.Serve(l, nil)
}
func Ghj1976Test(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "<html><body>ghj1976-123</body></html>")
}
客戶端代碼:
package main
import (
"fmt"
"net/rpc"
)
func main() {
client, err := rpc.DialHTTP("tcp", "127.0.0.1:1234")
if err != nil {
fmt.Println("連接rpc服務器失敗:", err)
}
var reply int
err = client.Call("Watcher.GetInfo", 1, &reply)
if err != nil {
fmt.Println("調用遠程服務失敗", err)
}
fmt.Println("遠程服務返回結果:", reply)
}
服務器端代碼執行截圖
客戶端代碼執行截圖
HTTP網頁執行截圖: