RPC協議實踐入門

平凡鍵客發表於2020-11-17

RPC 是什麼

RPC(Remote Procedure Call) 是一個計算機通訊協議。該協議允許執行與一臺計算機的程式呼叫另一個地址空間的程式,是一個通過傳送請求-接受回應進行資訊互動的系統。

RPC 的規則

RPC 方法需要為公有,同時有兩個可序列化引數,第二個為引用型別(response 呼叫方接受服務方修改的值)函式返回型別為error。
eg: func Method(request string,response *string)error{
}

Echo demo

server

package main

import (
	"fmt"
	"net"
	"net/rpc"
)

type EchoService struct {
}

func (p *EchoService) Echo(message string, reply *string) error {
	fmt.Println("client say:", message)
	*reply = "echo server say :" + message
	return nil
}

func main() {
	fmt.Println("waitting or client..")
	rpc.RegisterName("EchoService", new(EchoService))
	listener, err := net.Listen("tcp", ":8888")
	if err != nil {
		panic(err)
	}
	conn, err := listener.Accept()
	if err != nil {
		panic(err)
	}
	rpc.ServeConn(conn)
}

client

package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	client, err := rpc.Dial("tcp", "localhost:8888")
	if err != nil {
		panic(err)
	}

	var reply string
	err = client.Call("EchoService.Echo", "Hello world", &reply)
	if err != nil {
		panic(err)
	}
	client.Close()
	fmt.Println(reply)
}

結果:

~/.../rpc/server >>> go run ./echo.go                                          
waitting or client..
client say: Hello world

~/.../rpc/client >>> go run ./client.go                                        
echo server say :Hello world

相關文章