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部分...
舉個栗子 我對貝葉斯分類的理解
先說結論,貝葉斯分類 最大化後驗概率。給定樣本 x 和所屬類別 c 貝葉斯最優分類器欲最大化後驗概率 p c x 想實現這個目的可以通過判別模型 如決策樹 支援向量機等,直接對後驗概率建模 或生成模型 對聯合概率 p x,c 建模 對於生成模型,考慮 p c x frac 根據貝葉斯公式 p c x...
ICE的訊息編碼規則
1 代表size的長度字段 值小於255用1個位元組標示,如果大於255則使用5個位元組,第乙個位元組為255,後續的4個位元組標示真實長度 2 基本資料型別按照小端序進行實際長度編碼 3 字串被編碼成size加utf 8的實際內容,注意不包含結束字元 4 sequence被編碼成size加實際元素...