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編碼。中字串的預設編碼與 檔案本身的編碼是一致的。所...