gslang——原生golang/RPC描述语言简介
gslang背景知識
gslang是采用go語言編寫的RPC描述語言,最初它被用來描述gscluster網絡服之間的接口調用契約;而gscluster項目本身是我在tap4fun時開發的一個游戲
服務端框架,所以能夠看到gscluster里面有很多與游戲相關的概念。但是框架本身是為mico-service
而生的,所以你可以將它應用到任何你覺得合適的地方,不必局限于游戲服務器。
gslang是一個完整的RPC描述語言,它與thrift定位相同。沒有直接采用thrift的原因是:
gslang前端解析器在github上的位置:這里
語言特性
gslang支持的語言特性有:true/false,byte/sbyte,int16/uint16,int32/uint32,int64/uint64,
float32/float64,table,struct,enum,contract,annotation
基本數據類型
byte/sbyte,int16/uint16,int32/uint32,int64/uint64,float32/float64
自定義數據類型
table/struct被用來定義用戶定義數據類型,table與struct的區別在于table可以被用來定義annotation
示例:
// The cluster message type struct Message {ID byte; //message TypeContent []byte; //content data }進一步示例請參考:這里
注意:gslang所有數據類型與網絡傳輸格式無關,它只關心接口語言的定義
枚舉類型
gslang支持枚舉類型,并且可以指定枚舉底層數據類型,可選擇的數據類型有:byte/sbyte,int16/uint16,int32/uint32
enum Status(uint16){Closed(0),Disconnected(1),Connecting(2),InConnected(3),OutConnected(4),Online(5),Offline(6),Unreachable(7) }服務契約、方法
服務通過contract關鍵字定義:
contract SampleActor {SayHello(string) -> (bool); }多參數:gslang方法支持多輸入參數、多返回參數
服務接口集成:服務接口支持繼承其它服務器接口,這個和java/C#等語言類似
類型注釋(annotation/attribute)
gslang通過類型注釋增強了DSL的表達能力,這點與C#/java類似。這個應該是gslang的殺手級特性,它可以被用來指導后端代碼生成器生成個性化代碼,而不用修改gslang前端編譯器部分。在tap4fun的一個內部版本里,通過自定義annotation來決定是否對某個服務器方法生成profile代碼。
后端代碼生成
如前所述,gslang并不關心底層的序列化方式,也就更不關心底層的網絡傳輸方式。這部分協議由gslang的后端代碼生成器決定,一個已知的代碼生成后端是gs2go—golang代碼生成后端,并且生成代碼遵循的協議由gscluster定義。
需要指出的是:gscluster的RPC調用底層數據包本身也是由gslang來描述的,具體情況可以參看這個文件。
構建一個環境
通過上面幾步,就構建了一個基本的gsdocker/rpc測試環境。你可以觀察生成的*.gs.go文件來了解代碼
生成的細節;
gscluster RPC協議細節
struct/table序列化
直接將字段數據按定義順序遞歸序列化寫入二進制流,沒有tag/元數據信息;它的序列化/反序列化完全依賴
于gslang腳本;
基本數據類型序列化
RPC數據包
客戶端/mico-service節點之間的rpc調用都被封裝成一個一個RPC協議包傳輸,它的格式定義由gslang
描述為下面形式:
再次強調:gscluster的rpc協議封包本身是由gslang來直接定義的
結構體Call/Return分別用來實現RPC調用請求/應答:
Service/Contract協議號與名字的映射關系由底層框架確定:
gscluster
gscluster是一個golang實現的mico-service框架:
轉載于:https://www.cnblogs.com/yayanyang/p/4513789.html
總結
以上是生活随笔為你收集整理的gslang——原生golang/RPC描述语言简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: block关键字的使用
- 下一篇: 写给过去的自己-No.2-数据结构篇-初