[mqant入门教程]helloworld
mqant是一个分布式服务端游戏框架,同时也支持单机模式。在mqant中模块(module)是最基本的单元。理想情况下模块之间没有之间引用,他们之间通信都通过RPC。
如何划分模块
从逻辑上来说模块是按功能来划分的,例如我们可以按如下功能进行划分模块:
-
用户注册模块
负责用户注册逻辑
-
用户登录模块
负责用户登录验证,用户登录信息存储等逻辑
-
游戏中心模块
负责玩家匹配,游戏状态同步等逻辑
-
游戏逻辑模块
负责游戏具体逻辑,对应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 : 我是梁大帅”}