go使用rpc
RPC是遠(yuǎn)程過程調(diào)用的縮寫(Remote Procedure Call),通俗地說就是調(diào)用遠(yuǎn)處的一個(gè)函數(shù),是分布式系統(tǒng)中不同節(jié)點(diǎn)間流行的通信方式。Go語言的標(biāo)準(zhǔn)庫提供了一個(gè)簡(jiǎn)單的RPC實(shí)現(xiàn)
server端
構(gòu)造一個(gè)Cqh類型,其中的Test方法用于測(cè)試打印功能
注意:Test方法必須滿足Go語言的RPC規(guī)則:
方法只能有兩個(gè)可序列化的參數(shù)
其中第二個(gè)參數(shù)是指針類型,并且返回一個(gè)error類型,同時(shí)必須是公開的方法。
func (p *Cqh) Test(request string, reply *string) error {
*reply = "test:" + request
return nil
}
服務(wù)端程序如下:
func main() {
rpc.RegisterName("Cqh", new(Cqh))
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error:", err)
}
rpc.ServeConn(conn)
}
}
其中rpc.Register函數(shù)調(diào)用會(huì)將對(duì)象類型中所有滿足RPC規(guī)則的對(duì)象方法注冊(cè)為RPC函數(shù),所有注冊(cè)的方法會(huì)放在“Cqh”服務(wù)空間之下。然后我們建立非阻塞的TCP鏈接,通過rpc.ServeConn函數(shù)在該TCP鏈接上為對(duì)方提供RPC服務(wù)。
client端
Go語言的RPC庫最簡(jiǎn)單的使用方式是通過Client.Call方法進(jìn)行同步阻塞調(diào)用,該方法的實(shí)現(xiàn)如下:
func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error {
call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done
return call.Error
}
首先通過Client.Go方法進(jìn)行一次異步調(diào)用,返回一個(gè)表示這次調(diào)用的Call結(jié)構(gòu)體。然后等待Call結(jié)構(gòu)體的Done管道返回調(diào)用結(jié)果。
客戶端程序如下:
package main
import (
"net/rpc"
"log"
"fmt"
)
func main() {
client, err := rpc.Dial("tcp", ":1234")
if err != nil {
log.Fatal("dialing", err)
}
var reply string
err = client.Call("Cqh.Test", "hello", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}
rpc.Dial撥號(hào)RPC服務(wù),然后通過client.Call調(diào)用具體的RPC方法。在調(diào)用client.Call時(shí),第一個(gè)參數(shù)是用點(diǎn)號(hào)鏈接的RPC服務(wù)名字和方法名字,第二和第三個(gè)參數(shù)分別我們定義RPC方法的兩個(gè)參數(shù)。
客戶端運(yùn)行后輸出如下:
test:hello
由此以看出RPC的使用其實(shí)非常簡(jiǎn)單
posted on 2021-09-14 11:16
思月行云 閱讀(765)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Golang