初識RPC

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 版本。

示例代碼地址 go-micro-demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章