golang中的rpc包用法

2022-02-11 01:19:09 字數 2174 閱讀 6824

rpc,即 remote procedure call(遠端過程呼叫),說得通俗一點就是:呼叫遠端計算機上的服務,就像呼叫本地服務一樣。

我所在公司的專案是採用基於restful的微服務架構,隨著微服務之間的溝通越來越頻繁,就希望可以做成用rpc來做內部的通訊,對外依然用restful。於是就想到了golang標準庫的rpc包和google的grpc。

這篇文章重點了解一下golang的rpc包。

golang的rpc支援三個級別的rpc:tcp、http、jsonrpc。但go的rpc包是獨一無二的rpc,它和傳統的rpc系統不同,它只支援go開發的伺服器與客戶端之間的互動,因為在內部,它們採用了gob來編碼。

go rpc的函式只有符合下面的條件才能被遠端訪問,不然會被忽略,詳細的要求如下:

舉個例子,正確的rpc函式格式如下:

func (t *t) methodname(argtype t1, replytype *t2) error
t、t1和t2型別必須能被encoding/gob包編譯碼。

舉乙個http的例子。

下面是http伺服器端的**:

}簡單分析一下上面的例子,先例項化了乙個arith物件arith,然後給arith註冊了rpc服務,然後把rpc掛載到http服務上面,當http服務開啟的時候我們就可以通過rpc客戶端來呼叫arith中符合rpc標準的的方法了。

請看客戶端的**:

package main

import (

"net/rpc"

"log"

"fmt"

)type args struct

type quotient struct

func main()

// synchronous call

args := &args

var reply int

err = client.call("arith.multiply", args, &reply)

if err != nil

fmt.printf("arith: %d*%d=%d\n", args.a, args.b, reply)

// asynchronous call

quotient := new(quotient)

divcall := client.go("arith.divide", args, quotient, nil)

replycall := <-divcall.done // will be equal to divcall

if replycall.error != nil

fmt.printf("arith: %d/%d=%d...%d", args.a, args.b, quotient.quo, quotient.rem)

// check errors, print, etc.

}

簡單說明下,先用rpc的dialhttp方法連線伺服器端,呼叫伺服器端的函式就要使用call方法了,call方法的引數和返回值已經很清晰的表述出rpc整體的呼叫邏輯了。

我們把伺服器端跑起來,再把客戶端跑起來,這時候客戶端會輸出:

arith: 7*8=56

arith: 7/8=0...7

到此,整個rpc的呼叫邏輯就完成了。

golang官方rpc包的使用

rpc remote rrocedure call,遠端過程呼叫 是乙個計算機通訊協議。rpc協議假定某些傳輸協議的存在,如tcp和udp,為通訊程式之間攜帶資訊資料。在osi網路通訊模型中,rpc跨越了傳輸層和應用層。rpc採用c s模式,請求程式就是乙個客戶機,而服務提供程式就是乙個伺服器。首先...

golang中os exec包用法

exec包執行外部命令,它將os.startprocess進行包裝使得它更容易對映到stdin和stdout,並且利用pipe連線i o func lookpath file string string,error lookpath在環境變數中查詢科執行二進位制檔案,如果file中包含乙個斜槓,則直...

golang中strings包用法

1.strings.split split 以 sep 為分隔符,將 s 切分成多個子切片,結果中不包含 sep 本身 如果 sep 為空,則將 s 切分成 unicode 字元列表。如果 s 中沒有 sep 子串,則將整個 s 作為 string 的第乙個元素返回 func split s,sep...