[mqant入门教程]helloworld
发布于 5 个月前 作者 liangdas 1103 次浏览 来自 分享

mqant是一个分布式服务端游戏框架,同时也支持单机模式。在mqant中模块(module)是最基本的单元。理想情况下模块之间没有之间引用,他们之间通信都通过RPC。

如何划分模块

从逻辑上来说模块是按功能来划分的,例如我们可以按如下功能进行划分模块:

  1. 用户注册模块

    负责用户注册逻辑

  2. 用户登录模块

    负责用户登录验证,用户登录信息存储等逻辑

  3. 游戏中心模块

    负责玩家匹配,游戏状态同步等逻辑

  4. 游戏逻辑模块

    负责游戏具体逻辑,对应IO游戏来说,一个游戏逻辑模块管理着多个桌子,每一个桌子就是一个对战局

定义模块

1. 创建模块

详细代码见 server/helloworld

package helloworld

import (
	。。。
)

var Module = func() module.Module {
	this := new(HellWorld)
	return this
}

type HellWorld struct {
    //普通模块继承BaseModule
	basemodule.BaseModule
}

func (m *HellWorld) GetType() string {
	//很关键,需要与配置文件中的Module配置对应
	return "HelloWorld"
}
func (m *HellWorld) Version() string {
	//可以在监控时了解代码版本
	return "1.0.0"
}
//模块初始化时被调用
func (m *HellWorld) OnInit(app module.App, settings *conf.ModuleSettings) {
	m.BaseModule.OnInit(m, app, settings)
	//注册一个RPC服务
	m.GetServer().RegisterGO("HD_Say", m.say)  //我们约定所有对客户端的请求都以HD_开头
}
//模块初始化完成后调用
func (m *HellWorld) Run(closeSig chan bool) {
}
//进程结束时调用
func (m *HellWorld) OnDestroy() {
	//一定别忘了关闭RPC
	m.GetServer().OnDestroy()
}
//模块的HD_Say RPC函数实现
func (m *HellWorld) say(session gate.Session, msg map[string]interface{}) (result string, err string) {
	if msg["say"] == nil{
		result = "say cannot be nil"
		return
	}
	say := msg["say"].(string)
	return fmt.Sprintf("you say : %s", say), ""
}

2. 在mqant入口注册该模块

代码见 server/main.go
	func main() {
		app := mqant.CreateApp()
		app.Run(true, //只有是在调试模式下才会在控制台打印日志, 非调试模式下只在日志文件中输出日志
			mgate.Module(),  //这是默认网关模块,是必须的支持 TCP,websocket,MQTT协议
			helloworld.Module(),
			。。。
		)
	}

3. 在配置文件中加入该模块配置

 代码见 bin/conf/server.json
 
{
	  "Module":{
		  "Gate":[
				  {
					 ....
				  }
			  ],
		  "HelloWorld":[
			{
			  "Id":"HelloWorld001",
			  "ProcessID":"development"
			}
		  ],
	  },
  }

4. 服务端模块开发完成

启动服务端以后可以看到一条日志,表示模块HelloWorld001在该进程初始化成功了 2018-03-06T11:07:45+08:00 [development] [I] [rpcserver.go:52] RPCServer init success id(HelloWorld001) version(1.0.0)

客户端开发

golang语言的客户端我们依赖以下两个库 "github.com/eclipse/paho.mqtt.golang" golang的mqtt库 "github.com/liangdas/armyant/work" 对mqtt库进行了简单的封装

代码见example/helloworld.go
	import (
		"github.com/liangdas/armyant/work"
		MQTT "github.com/eclipse/paho.mqtt.golang"
		"fmt"
	)
	
	func main()  {
		this := new(work.MqttWork)
		opts := this.GetDefaultOptions("ws://127.0.0.1:3653")
		opts.SetConnectionLostHandler(func(client MQTT.Client, err error) {
			fmt.Println("连接断开", err.Error())
		})
		opts.SetOnConnectHandler(func(client MQTT.Client) {
			fmt.Println("连接成功")
		})
		err := this.Connect(opts)
		if err != nil {
			fmt.Println(err.Error())
		}
	
		//访问HelloWorld001模块的HD_Say函数
		msg, err := this.Request("HelloWorld[@HelloWorld001](/user/HelloWorld001)/HD_Say", []byte(`{"say":"我是梁大帅"}`))
		if err != nil {
			fmt.Println(err.Error())
		}
		fmt.Println(fmt.Sprintf("topic :%s  body :%s",msg.Topic(),string(msg.Payload())))
	}

访问结果

Connect… 连接成功 topic :HelloWorld@HelloWorld001/HD_Say/1 body :{“Error”:"",“Result”:“you say : 我是梁大帅”}

回到顶部