Firefly 游戏开发

简介

使用

流程

1. 通过配置文件定义服务器信息,节点配置,节点实现文件,节点间的通信(通过端口)
2. 定义节点实现文件
3. 启动主节点

if __name__=="__main__":
    from firefly.master.master import Master
    master = Master()
    master.config('config.json','appmain.py')
    master.start()

config.json定义你的分布式服务,appmain.py是你的子节点公共入口,master节点已在master.start()中启动。

配置文件

下面是一份 config.json 实例,该配置文件配置了一个无盘节点,即没有使用数据库:

{
"master":{"rootport":9999,"webport":9998},
"servers":{
    "gate":{"name":"gate", "rootport":10000, "app":"app.gateserver"},
    "net":{"name":"net", "netport":10001, "name":"net", "remoteport":[{"rootport":10000, "rootname":"gate"}], "app":"app.netserver"},
    "game1":{"name":"game1", "remoteport":[{"rootport":10000, "rootname":"gate"}], "app":"app.game1server"}
}
}

通过配置文件已经能够很清楚地看懂该服务器的整个分布式情况:

master节点

master节点管理所有的节点,它有两个端口rootport和webport,顾名思义,rootport用于和和服务器中其它节点通信,webport用于后台管理,如关闭和重启所有子节点。调用master.start()后,框架会自动创建master节点并监听rootport和webport端口,后者通过Flask实现。

分布式节点

如果将master节点称为整个服务器的根节点,那么servers中定义的节点即为分布式节点,样例config中定义了四个分布式节点,gate, dbfront, net, game1。每个节点都可以定义自己的父节点(通过remoteport,可有多个父节点),并且关联节点的实现文件(位于config所在目录 app/*.py)。其中gate是net和game1的父节点,意味着如果有网络消息需要game1节点处理,那么消息将由net->gate->game1,同理消息响应途径为:game1->gate->net。

3. 公共入口

appmain是我们定义的节点公共入口,它会由firefly通过python appmain.py 节点名 配置路径调用,节点名即为gate, dbfront, net, game1之一,配置路径即为 config.json。该入口允许我们对各分布式节点做一些预先特殊处理,在Demo的appmain.py中,仅仅是读取必须配置,通过一个firefly导出的统一节点类来启动节点:

#coding:utf8
"""
本模块在启动master时作为参数传入
firefly会在每个Server(除了master)启动时都调用该模块:
    cmds = 'python %s %s %s'%(self.mainpath, sername, self.configpath) [位于master/master.py, 其中self.mainpath即为本模块] 
"""
import os
import json, sys
from firefly.server.server import FFServer

if __name__ == '__main__':
    args = sys.argv
    servername = None
    config = None
    if len(args) > 2:
        servername = servername = args[1]
        config = json.load(open(args[2], 'r'))
    else:
        raise ValueError

    dbconf = config.get('db', {})
    memconf = config.get('memcached', {})
    servsconf = config.get('servers', {})
    masterconf = config.get('master',{})
    serverconf = servsconf.get(servername)
    server = FFServer()
    server.config(serverconf, dbconfig=dbconf, memconfig=memconf, masterconf=masterconf)
    print servername, 'start'
    server.start()
    print servername, 'stop'

appmain.py通过firefly的FFServer来启动节点,这里先不管FFServer如何区分各个节点。至此,我们的分布式服务器就算是启动了。