舉個栗子之gorpc 訊息編碼和解碼

2022-09-19 22:09:19 字數 2110 閱讀 3889

2023年的第乙個rpc,比以往來的更早一些...

留杭過年...寫點東西

借助go module我們可以輕易建立乙個新的專案

go: creating new go.mod: module github.com/taadis/gorpcrpc 的客戶端和服務端之間通訊需要傳輸資料訊息,典型的訊息結構一般有2部分組成

這裡我們先定義更泛的訊息體,因為訊息體是動態的,所以我們可以直接用go中的 inte***ce{} 來定義,就不用特別宣告乙個結構體了。

然後我們來定義乙個header結構體

// codec.go

type header struct

sequence 序列號是客戶端帶過來的,每個請求總要有點不一樣的地方,方便服務端根據序列號來區分不同的呼叫,可以理解是唯一id。

servicemethod 是要遠端呼叫的服務下的方法名詞,這裡對照為go語言中結構體的方法名,比如使用者建立方法"user.create"。

error 是錯誤資訊,用來放置一端發生的錯誤,以便另一種接收到訊息時能根據錯誤進行處理,而不是直接丟失響應。

rpc 的客戶端和服務端之間通訊的訊息有其特有的格式,因此都需要涉及編碼和解碼這一關鍵步驟,也就是我們熟稱的序列化和反序列化。

以便抽象理解,我們定義乙個統一的codec介面

// codec.go

type codec inte***ce ) error

write(*header, inte***ce{}) error

}

readheader 讀取資訊頭,如果有錯誤返回錯誤。

readbody 讀取訊息體,資料是動態的,所以使用inte***ce{}作為引數,如果有錯誤返回錯誤。

write 訊息接收處理完成後,我們需要把結果告知給客戶端,需要乙個寫入的操作。

這裡我們借助標準庫內置的encoding/gob來提高工作效率。

當然你也可以用encoding/json,encoding/xml或者其他編譯碼包,這裡選擇encoding/gob,僅僅是因為這是go所特有的。just go。

接下來我們基於encoding/gob實現乙個gobcodec

rpc 請求是一種網路請求,本質還是i/o,所以我們可以用io.readwritecloser來定義網路鏈結conn.

通過gob.decoder解碼請求中的資料流至對應的結構體引數,

完成服務端呼叫之後,把返回結果再用gob.encoder編碼至資料流中,

最後通過bufio.writer寫入資料完成響應。

// codec.go

type gobcodec struct

封裝乙個newgobcodec函式,方便後續呼叫。

func newgobcodec(conn io.readwritecloser) codec 

}

實現 codec 介面中的 readheader 方法

func (c *gobcodec) readheader(header *header) error
實現 codec 介面中的 readbody 方法

func (c *gobcodec) readbody(body inte***ce{}) error
實現 codec 介面中的 write 方法

func (c *gobcodec) write(header *header, body inte***ce{}) error 

}()if err := c.encoder.encode(header); err != nil

if err := c.encoder.encode(body); err != nil

return nil

}

至此,rpc 中比較底層的資料編碼和解碼我們已經抽象出來了codec介面,並借助encoding/gob實現了gobcodec.

舉個栗子之gorpc 訊息的編碼和解碼

2022年的第乙個rpc,比以往來的更早一些.留杭過年.寫點東西 借助go module我們可以輕易建立乙個新的專案 go creating new go.mod module github.com taadis gorpcrpc 的客戶端和服務端之間通訊需要傳輸資料訊息,典型的訊息結構一般有2部分...

訊息和訊息處理之訊息迴圈

在win32程式設計中,訊息迴圈是相當重要的乙個概念,看似很難,但使用起來卻是非常簡單。在winmain函式的最後,有下列 while getmessage msg,null,0,0 windows應用程式可以接收以各種形式輸入的資訊,這包括鍵盤 滑鼠動作 計時器產生的訊息,也可以是其他應用程式發來...

Python編碼之encode和decode

宣告如下 code utf 8 因為python 只檢查 coding 和編碼字串,所以你可能回見到下面的宣告方式,這是有些人為了美觀等原因才這樣寫的 coding utf 8 常見編碼介紹 編碼轉換 python內部的字串一般都是 unicode編碼。中字串的預設編碼與 檔案本身的編碼是一致的。所...