RPC 是什麼
RPC 是遠程過程調用(Remote Procedure Call)的簡稱,是分佈式系統中不同節點間的一種通信方式,在互聯網時代,尤其是微服務架構愈來愈火的背景下,學習和了解 RPC 是每一個程序員的必修課。
按照調用方式區分,RPC 分爲同步調用和異步調用兩種
同步調用:客戶端調用服務方方法,等待直到服務方返回結果或者超時,再繼續自己的操作。
異步調用:客戶端把消息發送給中間件,不再等待服務端返回,直接繼續自己的操作。
golang RPC
go 語言中內置了一個基礎 rpc 庫,位置在在 net/rpc,可以猜到是基於 net 庫的。
寫個簡單的例子(回聲服務):
go version go1.12.5 linux/amd64
type EchoService struct{}
func (p *EchoService) Echo(request string, reply *string) error {
*reply = "reply:" + request
return nil
}
然後給監聽上端口:
func main() {
rpc.RegisterName("EchoService", new(EchoService))
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("net.Listen failed. [%v]", err)
}
conn, err := listener.Accept()
if err != nil {
log.Fatalf("listener.Accept failed. [%v]", err)
}
rpc.ServeConn(conn)
}
rpc.Register 將 EchoService 註冊到 rpc 服務。
rpc.ServeConn 將 rpc 服務與 tcp 連接綁定,爲連接提供 rpc 服務能力。
客戶端代碼:
func main() {
client, err := rpc.Dial("tcp", "localhost:8080")
if err != nil {
log.Fatalf("rcp.Dial failed. [%v]", err)
}
var reply string
err = client.Call("EchoService.Echo", "golang rpc", &reply)
if err != nil {
log.Fatalf("client.Call failed. [%v]", err)
}
fmt.Println(reply)
}
通過 rpc.Dial 連接 rpc 服務,返回一個 client 實例。然後 client 使用 Call方法調用rpc 服務。
第一個參數:指定調用 EchoService 下面的 Echo 方法,中間用 . 相連。
第二三個參數:Echo方法的兩個參數。
是不是特別簡單!!
PS:
- 之前是 C++ Coder,所以有 Makefile。
- 需要支持 go mod 的golang 版本。