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