mydog框架概述

mydog传送门

概述

  • 欢迎使用mydog。
  • mydog采用全拓扑结构,水平扩展只需添加配置即可。
  • mydog跨服务器代码调用和本地调用一样,非常方便开发逻辑。
  • mydog简约而强大。

master服务器

master服务器(即master.ts)读取配置文件,启动所配置的服务器集群,并对所有服务器进行管理。逻辑服务器启动后向master注册,通过master认识其他逻辑服。

逻辑服务器

逻辑服务器(即servers.ts)是开发者编写代码的服务器集群。其中 frontend(需同时提供clientPort) 参数表示该服务器是客户端可连接的,即前端服务器,俗称网关。而没有该参数的服务器即后端服务器,是处理游戏逻辑(如场景服务)的,不允许客户端连接。

项目目录结构

项目目录

  • 基本配置文件在config/sys目录下。master.ts为master服务器端口配置,servers.ts为开发者自定义的服务器配置,route.ts为通信消息列表。

  • servers 目录为通信消息入口。如 chat 表示聊天服务器,handler目录下接收客户端消息,remote目录下接收服务器之间的rpc调用消息。客户端发送chat.main.chat消息,服务器将会在chat/handler目录下main.ts文件中的chat方法处收到消息。开发者调用 app.rpc("chat-server-1").chat.main.offline(),将会在chat/remote目录下的main.ts文件里的offline方法中收到消息。 注意:rpc调用如果传入了回调,则接收处必须调用回调,否则会触发超时。

  • app.ts为程序入口文件

  • 主动发送消息:1、前端服使用app.sendMsgByUid()app.sendAll()。2、后端服使用app.sendMsgByUidSid()app.sendMsgByGroup()

可选配置

  • 客户端直连socket
app.setConfig("connector", { "connector": connector.connectorTcp, "heartbeat": 6, "maxConnectionNum": 2000, "maxLen": 10 * 1024 * 1024, "clientOnCb": clientOnCb, "clientOffCb": clientOffCb })

此配置针对clientPort。connector为客户端直连的socket类(框架内部提供ws和tcp两种,默认tcp。开发者可替换为自己的socket。)。heartbeat为心跳间隔。maxConnectionNum为最大连接数。maxLen为单个消息包最大长度。clientOnCb为客户端连接通知,clientOffCb为客户端离开通知。

  • 服务器rpc调用
 app.setConfig("rpc", {"timeout": 5, "maxLen": 10 * 1024 * 1024, "interval": 20})

此配置针对port。timeout为rpc超时时间。maxLen为单个消息包最大长度。interval为消息发送频率(毫秒),高于10则启用,默认不开启即立即发送。

  • 编码解码
app.setConfig("encodeDecode", { "protoDecode": protoDecode, "protoEncode": protoEncode, "msgDecode": msgDecode, "msgEncode": msgEncode })。

此配置是服务器与客户端的通信协议及编解码协议。客户端单个消息包到达后,会调用protoDecode函数,此函数返回cmdId(整数类型)和msg(Buffer类型)两个参数,其中cmdId为消息序号(即在route.ts中的数组下标),如果此消息是前端服的,则调用msgDecode,并执行对应消息接口。如果此消息是后端服的,则拷贝session一起编码后转发至对应后端服,到达后再调用msgDecode,并执行对应消息接口。当服务器发送消息给客户端时,会调用protoEncode函数进行编码。

路由

  • 当前端服转发客户端消息到后端服时,需提供路由函数以决定路由到哪个服务器。如下:
app.route("chat", function (session: Session) {
    return session.get("chatServerId");
});
  • 开发者rpc调用。
// 回调形式
this.app.rpc("connector-server-1").connector.main.test(msg, (err:rpcErr, res) => {

});

// await 形式
let res = await this.app.rpcAwait("connector-server-1").connector.main.test(msg);

“connector-server-1"即接收消息的服务器id。当为”*"时,为发送给所有chat类服务器 , 注意:此时回调接收的数据结构有所改变。 rpc调用有完整的代码提示,非常方便,如下图:
rpc代码提示

Session类

session中存着两个重要字段,uid和sid,sid是前端服务器的名字,uid是socket连接绑定的唯一标识,服务器推送消息时,依据这两个字段。前端服务器中调用bind方法,绑定唯一uid,session中可通过set()get()方法存储自定义信息。后端服务器中的session是前端服务器在每次转发消息时对前端session的复制,后端自定义存储后必须调用apply()方法,才能转存到前端服务器,或者rpc到前端服调用app.applySession()方法。 注意:session在调用set时会触发内部将session转为Buffer的操作,如果get某值并修改后没有重新set,则此修改不能反映在后端服。

数据流向图

数据流向图

  • 图中有master管理服,若干后端服,若干前端服(即网关),若干客户端。(注:服务器组每两个之间有一个socket连接,图中未画出)
  • 客户端向服务器发消息:经过 ,到达前端服后,会调用protoDecode函数,如果该消息是本服消息,则调用msgDecode,并执行对应消息接口。如果此消息是后端服的,则拷贝sessionBuff一起编码,经过 ,到达对应后端服后再调用msgDecode,并执行对应消息接口。
  • 前端服向客户端发消息:调用protoEncode函数编码后,经过 ,到达客户端。
  • 后端服向客户端发消息:调用protoEncode函数编码后,加上uid数组信息,经过 ,到达sid所对应前端服后解析出uid数组信息,向对应客户端发送消息,即经过 ,到达对应客户端。
  • 服务器间,开发者rpc调用:即 。rpc调用的消息编码为 json,暂未开放自定义编码解码。

mydog命令行

  1. mydog init 初始化项目
  2. mydog start 启动服务器
  3. mydog list 服务器监控
  4. mydog stop 关闭服务器
  5. mydog remove 关闭部分服务器
  6. mydog removeT 关闭部分服务器类型
  7. mydog cmd 根据route.ts生成对应消息号文件
  • mydog start
mydog start -d -e env [id1 id2 ...]

-d表示后台运行,-e env为设置环境,即选用server.ts里对应配置。id1 id2表示启动的服务器id,不传则全部启动。

  • mydog list
mydog list -h host -p port -t cliToken -i 5

mydog 监控控制台。 -h为master服务器host,-p为master服务器端口号,-t为密钥, -i为监控数据间隔。开发者可自定义数据,如下

app.setConfig("mydogList", () => {
    return [{ "title": "cpu(%)", "value": getCpuUsage() }];
});

监控图

  • mydog stop
mydog stop

关闭所有服务器。

  • mydog remove
mydog remove id1 [id2 ...]

关闭 id1和id2服务器

  • mydog removeT
mydog removeT serverType1 [serverType2 ...]

关闭 serverType1 和serverType2 类型的服务器

  • mydog cmd
    在项目src目录执行该命令,会根据config/sys/route.ts文件生成对应消息号config/cmd.ts。服务器给客户端主动发消息时,使用此文件中的消息名。

其他

1、qq群:875459630

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值