日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gslang——原生golang/RPC描述语言简介

發布時間:2025/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gslang——原生golang/RPC描述语言简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gslang背景知識

gslang是采用go語言編寫的RPC描述語言,最初它被用來描述gscluster網絡服之間的接口調用契約;而gscluster項目本身是我在tap4fun時開發的一個游戲
服務端框架,所以能夠看到gscluster里面有很多與游戲相關的概念。但是框架本身是為mico-service
而生的,所以你可以將它應用到任何你覺得合適的地方,不必局限于游戲服務器。

gslang是一個完整的RPC描述語言,它與thrift定位相同。沒有直接采用thrift的原因是:

  • 在開發gslang的時候,thrift對golang的支持并不完善;
  • 根據項目需要,需要hack代碼生成的過程例如:profile,debug 代碼;
  • 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); }
  • 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來描述的,具體情況可以參看這個文件。

    構建一個環境

  • 安裝gsmake,gsmake這個工具的介紹可以看這里
  • git clone https://github.com/gsdocker/gscluster
  • cd ${gscluster directory}
  • gsmake gotest -bench . ./test2
  • 通過上面幾步,就構建了一個基本的gsdocker/rpc測試環境。你可以觀察生成的*.gs.go文件來了解代碼
    生成的細節;

    gscluster RPC協議細節

    struct/table序列化

    直接將字段數據按定義順序遞歸序列化寫入二進制流,沒有tag/元數據信息;它的序列化/反序列化完全依賴
    于gslang腳本;

    基本數據類型序列化

  • interger類型 : 按照小端序寫入
  • string類型: [兩字節,后續內容長度] + [UTF-8字符內容]
  • 浮點類型:按IEEE-754內存表示序列化
  • RPC數據包

    客戶端/mico-service節點之間的rpc調用都被封裝成一個一個RPC協議包傳輸,它的格式定義由gslang
    描述為下面形式:

    // The gscluster rpc package code types enum Code {WhoAmI(0),Accept(1),Reject(2),DHExchange(3),Call(4),Return(5),CER(6),ErrReturn(7) }// The gscluster prc package type define struct Message {Code Code; //message TypeContent []byte; //content data }struct DHExchange {ID string;Content string; }struct CER {Add bool;Type string; // service type nameName string; // service nameID uint32; // srevice id }struct Param{Content []byte; }struct Return {ID uint16;Service uint32;Params []Param; }struct ErrReturn {ID uint16;Service uint32;UUID []byte;Code int32; }struct Call {ID uint16;Method uint16;Service uint32;Params []Param; }

    再次強調:gscluster的rpc協議封包本身是由gslang來直接定義的

    結構體Call/Return分別用來實現RPC調用請求/應答:

  • Call#ID : RPC包序列號,用來匹配應答包;
  • Call#Service : Contract協議號
  • Call#Method : Method協議號
  • Call#Params : 參數列表
  • Service/Contract協議號與名字的映射關系由底層框架確定:

  • 服務器之間的RPC調用,由調用兩端通過協商握手協議確定;
  • 網關與客戶端之間的RPC調用,由于gscluster只支持GS/GW/GC三類服務契約——分別對應服務器/網關/客戶端RPC接口——服務協議號被簡單的手動分配。
  • gscluster

    gscluster是一個golang實現的mico-service框架:

  • 服務端采用基于角色的并發模型,每個客戶端在服務器端都有一個actor角色對象與之一一對應。
  • 服務節點/客戶端之間,通過RPC協議進行通信;
  • 內建網關服務,支持基于SLB之類的技術進行接入層的負載均衡;
  • 總體上gscluster類似于云風設計的skynet,只不過gscluster在實現服務的時候更方便一些——內建goroutine,而不是開很多lua vm
  • 轉載于:https://www.cnblogs.com/yayanyang/p/4513789.html

    總結

    以上是生活随笔為你收集整理的gslang——原生golang/RPC描述语言简介的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。