概述
-
欢迎使用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调用。
app.rpc("chat-server-1").chat....
"chat-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命令行
-
mydog init
初始化项目 -
mydog start
启动服务器 -
mydog list
服务器监控 -
mydog stop
关闭服务器 -
mydog remove
关闭部分服务器 -
mydog removeT
关闭部分服务器类型 -
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
网友评论