go-mqant框架

go-mqant框架


helloworld demo

参考: mqant的HelloWorld

编译后启动进程 (win)

单进程部署

1
2
> cd ${GOPATH}/bin
> start server.exe -pid=development -conf=../bin/conf/server.json -log=../bin/logs

参考: mqant启动

分部署部署

参考: mqant分布式部署启动和配置思路


自定义协议返回值

框架默认返回值为 (result string, err string)

可以修改为自定义值, 例如 (result []byte, err Int32) , 错误码自己定义

参考: mqant自定义封装规则


修改消息体为 protobuf

参考: 客户端与服务端通信可能使用protobuf协议,那么msg就是[]byte

返回值与性能, 如何省掉无效的编解码流程呢?


服务器主动给客户端发送消息

参考: 服务器主动给客户端发送消息


后端rpc自定义数据结构

参考: mqant中的RPC

后端模块间的rpc调用时, 记得要传 session 进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 注册消息
func (m *Chat) OnInit(app module.App, settings *conf.ModuleSettings) {
...
m.GetServer().RegisterGO("TestRpc", m.testRpc) //后端rpc消息命名不受 HD_ 前缀约束, 可以随意命名
}
func (m *Chat) testRpc(session gate.Session, msg map[string]interface{}) (result map[string]string, err string) {
ret := make(map[string]string)
ret["aaa"] = "111"
ret["bbb"] = "222"
return ret, ""
}

//其他模块调用消息
func (m *HellWorld) say(session gate.Session, msg map[string]interface{}) (result string, err string) {
testMsg := make(map[string]interface{})
testMsg["hello"] = "world"
ret01, err01 := m.RpcInvoke("Chat@Chat001", "TestRpc", session, testMsg) // session也要记得传

可优化定制

后端rpc

可以直接用 protobuf 把数据都转成打包成 []byte 进行rpc传输数据, 接收到数据时也用 protobuf解包数据即可, 接受时也用, 减少转换工具的 switch case 匹配转换类型

  • 发送数据 关键代码 rpc_client.go

    1
    2
    3
    4
    5
    6
    7
    func (c *RPCClient) Call(_func string, params ...interface{}) (interface{}, string) {
    var ArgsType []string = make([]string, len(params))
    var args [][]byte = make([][]byte, len(params))
    var span log.TraceSpan = nil
    for k, param := range params {
    var err error = nil
    ArgsType[k], args[k], err = argsutil.ArgsTypeAnd2Bytes(c.app, param)
  • 接受数据 关键代码 rpc_server.go

    1
    2
    3
    4
    if len(ArgsType) > 0 {
    in = make([]reflect.Value, len(params))
    for k, v := range ArgsType {
    v, err := argsutil.Bytes2Args(s.app, v, params[k])

客户端收发

参考: http://www.mqant.com/topic/5996c5df601e41552107763e