这是对SGAME当前的演示框架与配置做一个详细说明

SGAME的安装请参考github地址的README:https://github.com/nmsoccer/sgame

框架

SGAME 框架说明

目前整个框架包含了两个功能组,四类进程。用于模拟一个最小的可用游戏框架

组:

  1. GROUPX:游戏的主要逻辑组。负责客户端的接入;游戏的逻辑处理,玩家数据缓存以及DB的读写。为了方便说明,GROUPX被横向扩展为GROUP1和GROUP2,它们都行使相同的功能
  2. DISPX: 游戏不同逻辑组的互相通信节点。负责维护不同逻辑组的交互以及后续的其他功能模块的接入

进程:

  1.    connect_serv:负责与客户端的连接管理,由于业务特性一般会与后端的logic_serv一对一通信,一般会同机部署
  2.    logic_serv: 负责游戏的具体逻辑,包括缓存游戏内的登陆角色,游戏内的功能实现等。同时提供动态的资源加载
  3.    db_serv:负责与redis的连接管理,负责游戏数据的DB读写
  4.    上面三种进程构成一个逻辑组,是框架的主要内容,一般游戏的三层结构(接入,逻辑,db)在一个逻辑组里实现。游戏在  实际部署的时候一般会将一个逻辑组同机部署(当然框架层面本身支持分布式的部署)。逻辑组可以构成一个平行扩展的基本单元
  5.    disp_serv: 用于逻辑组之间的消息互通

配置

配置分为底层的进程通信模块与上层的游戏框架部署,这里做一个分开说明:

消息通信

消息通信使用了个人编写的proc_bridge组件,具体用法与详细说明可以参考gitporn: https://github.com/nmsoccer/proc_bridge

这里只以框架内的使用来做一个直观的介绍:

配置文件位于:sgame/proc_bridge/sgame/bridge.cfg,这里主要关注的点有:

部署的用户及目录:

##########################CONGIGURE##################################
#BRIDGE_USER
#部署环境使用的用户名
[BRIDGE_USER]
xxooxx
[/BRIDGE_USER]

#BRIDGE_DIR
#部署安装的目录(绝对路径)
[BRIDGE_DIR]
/home/xxooxx/proc_bridge
[/BRIDGE_DIR]

      这里一般只需要修改BRIDGE_USER和BRIDGE_DIR为本机恰当的用户名即可

 具体的通信进程定义:

#PROC
#每一行表示一个需要通信的进程
#格式:进程名 = 全局ID : IP : PORT : SEND_SIZE : RECV_SIZE
#进程名:业务进程名.
#全局ID:业务进程在具体业务系统中的唯一ID. id属于[1,1000]为保留id,请勿使用
#IP:     业务进程部署的IP
#PORT:     业务进程在proc_bridge系统中的通信端口
#SEND_SIZE: 业务进程<-->委托carrier进程的发送缓冲区长度(最大包数目). null or <=0 则使用[DEFAULT_SEND_SIZE]
#RECV_SIZE: 业务进程<-->委托carrier进程的接收缓冲区长度(最大包数目). null or <=0 则使用[DEFAULT_RECV_SIZE]
[PROC]
conn_serv-1 = 10001:127.0.0.1:10060
logic_serv-1 = 20001:127.0.0.1:10083
db_logic_serv-1 = 30001:127.0.0.1:10070
conn_serv-2 = 10002:127.0.0.1:10061
logic_serv-2 = 20002:127.0.0.1:10084
db_logic_serv-2 = 30002:127.0.0.1:10071
disp_serv-1  = 40001:127.0.0.1:11000:60
disp_serv-2  = 40002:127.0.0.1:11001:60
[/PROC]

可以看到这里定义了我们上面所述的不同功能进程,其中重要的是PROC_ID和PROC_NAME.PROC_ID同时被上层的业务框架所使用,所以在这里需要保持准确和唯一性;PROC_NAME是该消息通信组件内部使用的管理标记,也应保持唯一

进程的通信关系:

#CHANNEL
#用于配制每个进程的发射通道。如果A需要与B互相通信,则A需要配置对B的发送通道;同时B配置对A的发送通道
#格式: proc_name:target_proc_name1,target_proc_name2,...
####通配符处理:在进程名合乎规范
#   proc_name='prefix+数字' 时,支持简单的通配处理:
#   prefix[A]:prefixA
#   prefix[A-B]:prefixA 直到 prefixB (注意A<=B)
#   prefix[A;B]:prefixA 和 prefixB
#   prefix[A-B;C]:prefixA 直到 prefixB 和 prefixC
[CHANNEL]
conn_serv-1:logic_serv-1
logic_serv-1:conn_serv-1,db_logic_serv-1,disp_serv-1,disp_serv-2
db_logic_serv-1:logic_serv-1
conn_serv-2:logic_serv-2
logic_serv-2:conn_serv-2,db_logic_serv-2,disp_serv-1,disp_serv-2
db_logic_serv-2:logic_serv-2
disp_serv-1:logic_serv-1,logic_serv-2
disp_serv-2:logic_serv-1,logic_serv-2
[/CHANNEL]

 定义好了通信进程,便可以配置它们的通信关系了。通道为单向发射通道,表明该进程想要发往的对端。到此底层的通信组件配置完毕。实际使用时在目录内执行./build.sh install 一般就可以建立完毕,同时提供一个manager进行管理。具体可以参考SGAME/README

上层业务

这里才开始真正部署SGAME框架内各业务进程

进入SGAME/SERVERS/SPUSH,这里会有一个sgame.json,通过这个配置文件来部署不同的业务进程。这里使用了一个部署工具spush,详细的使用说明可以参考 https://github.com/nmsoccer/spush

这里只以SGAME框架的使用来做一个实际说明,这里是详细配置:

{
  "task":"sgame" ,
  "deploy_host":"" ,
  "deploy_timeout":60,
  "remote_user":"nmsoccer" ,
  "remote_pass":"****" ,
 
  "procs":[
    {"name":"conn_serv-1" , "bin":["../conn_serv/conn_serv"] , "host":"127.0.0.1" , "host_dir":"/home/nmsoccer/sg/group1/conn_serv/" , "cmd":"./conn_serv -N sgame -p 10001 -P conn_serv-1 -f conf/conn_serv.json -D"},
    {"name":"conn_serv-2" , "bin":["../conn_serv/conn_serv"] , "host":"127.0.0.1" , "host_dir":"/home/nmsoccer/sg/group2/conn_serv/" , "cmd":"./conn_serv -N sgame -p 10002 -P conn_serv-2 -f conf/conn_serv.json -D"},
    {"name":"logic_serv-1" , "bin":["../logic_serv/logic_serv" , "../logic_serv/table" , "../logic_serv/table_desc"] , "host":"" , "host_dir":"/home/nmsoccer/sg/group1/logic_serv/" , "cmd":"./logic_serv -N sgame -p 20001 -P logic_serv-1 -f conf/logic_serv.json -D"},
    {"name":"logic_serv-2" , "bin":["../logic_serv/logic_serv" , "../logic_serv/table" , "../logic_serv/table_desc"] , "host":"" , "host_dir":"/home/nmsoccer/sg/group2/logic_serv/" , "cmd":"./logic_serv -N sgame -p 20002 -P logic_serv-2 -f conf/logic_serv.json -D"},    
    {"name":"db_logic_serv-1" ,   "bin":["../db_serv/db_serv"] , "host":"" , "host_dir":"/home/nmsoccer/sg/group1/db_serv/" , "cmd":"./db_serv -N sgame -p 30001 -P db_logic_serv-1 -f conf/db_serv.json -D"},
    {"name":"db_logic_serv-2" ,   "bin":["../db_serv/db_serv"] , "host":"" , "host_dir":"/home/nmsoccer/sg/group2/db_serv/" , "cmd":"./db_serv -N sgame -p 30002 -P db_logic_serv-2 -f conf/db_serv.json -D"},
    {"name":"disp_serv-1" ,   "bin":["../disp_serv/disp_serv"] , "host":"" , "host_dir":"/home/nmsoccer/sg/disp_serv/disp_serv-1/" , "cmd":"./disp_serv -N sgame -p 40001 -P disp_serv-1 -f conf/disp_serv.json -D"},
    {"name":"disp_serv-2" ,   "bin":["../disp_serv/disp_serv"] , "host":"" , "host_dir":"/home/nmsoccer/sg/disp_serv/disp_serv-2/" , "cmd":"./disp_serv -N sgame -p 40002 -P disp_serv-1 -f conf/disp_serv.json -D"},
    {"name":"manage_serv-1" , "bin":["../manage_serv/manage_serv" , "../manage_serv/html_tmpl/"] , "host":"" , "host_dir":"/home/nmsoccer/sg/manage/manage_serv-1/" , "cmd":"./manage_serv -N sgame -P manage_serv-1 -f conf/manage_serv.json -D"}        
  ],

  "proc_cfgs":[
    {"name":"conn_serv-1" ,  "cfg_name":"conf/conn_serv.json" , "cfg_tmpl":"./tmpl/conn_serv.tmpl" , "tmpl_param":"logic_serv=20001,listen_addr=:18909"},
    {"name":"conn_serv-2" ,  "cfg_name":"conf/conn_serv.json" , "cfg_tmpl":"./tmpl/conn_serv.tmpl" , "tmpl_param":"logic_serv=20002,listen_addr=:18910"},     
    {"name":"logic_serv-1" , "cfg_name":"conf/logic_serv.json" , "cfg_tmpl":"./tmpl/logic_serv.tmpl" , "tmpl_param":"conn_serv=10001,master_db=30001,slave_db=0"},
    {"name":"logic_serv-2" , "cfg_name":"conf/logic_serv.json" , "cfg_tmpl":"./tmpl/logic_serv.tmpl" , "tmpl_param":"conn_serv=10002,master_db=30002,slave_db=0"},    
    {"name":"db_logic_serv-1" ,    "cfg_name":"conf/db_serv.json" ,    "cfg_tmpl":"./tmpl/db_serv.tmpl" , "tmpl_param":"ts1=20001,redis_addr=127.0.0.1:6698"},
    {"name":"db_logic_serv-2" ,    "cfg_name":"conf/db_serv.json" ,    "cfg_tmpl":"./tmpl/db_serv.tmpl" , "tmpl_param":"ts1=20002,redis_addr=127.0.0.1:6698"},
    {"name":"disp_serv-1" ,    "cfg_name":"conf/disp_serv.json" ,    "cfg_tmpl":"./tmpl/disp_serv.tmpl" , "tmpl_param":""},
    {"name":"disp_serv-2" ,    "cfg_name":"conf/disp_serv.json" ,    "cfg_tmpl":"./tmpl/disp_serv.tmpl" , "tmpl_param":""},    
    {"name":"manage_serv-1" ,  "cfg_name":"conf/manage_serv.json" , "cfg_tmpl":"./tmpl/manage_serv.tmpl" , "tmpl_param":"listen_addr=:7000,http_addr=:8080"}
  ]
   
}

因为方便,所有的进程都部署到一台机器上。上面的配置主要分procs和proc_cfgs

procs

procs以name为key,表示一个分发子任务,这里可以很方便的对照proc_bridge:bridge.cfg里的配置文件,当然这里的name和消息组件的name完全没关系(一般为了减少歧义会配置成一样)。 比如

{"name":"conn_serv-1" , "bin":["../conn_serv/conn_serv"] , "host":"127.0.0.1" , "host_dir":"/home/nmsoccer/sg/group1/conn_serv/" , "cmd":"./conn_serv -N sgame -p 10001 -P conn_serv-1 -f conf/conn_serv.json -D"},

 表明我们有一个分发任务conn_serv-1,它要做的功能是将bin列表的文件分发到host:host_dir处,同时部署完毕后执行cmd

这里的cmd是./conn_serv -N sgame -p 10001 -P conn_serv-1 -f conf/conn_serv.json -D 就是我们框架内的业务进程了,它的proc_id为10001,这个是非常重要的,因为通过proc_id与底层的通信组件相关联。然后进程名是conn_serv-1,进程的配置文件位于conf/conn_serv.json -D选项表示以守护进程拉起。详细的业务进程请参考后面

proc_cfgs

这是一个选择配置,一般简单的分发任务是不需要的。但具体到游戏业务,会有非常多的自定义选项,所以这里集成到了spush里。还是以单项为例:

{"name":"conn_serv-1" ,  "cfg_name":"conf/conn_serv.json" , "cfg_tmpl":"./tmpl/conn_serv.tmpl" , "tmpl_param":"logic_serv=20001,listen_addr=:18909"},

这里的name必须在Procs里定义过的分发任务名;配置生成位置为当前目录的conf/conn_serv.json; cfg_tmpl是配置的模板,它结合tmpl_param将会生成conn_serv.json:  conn_serv.tmpl + tmpl_param = conn_serv.json。其模板如下:

conn_serv.tmpl

{
  "logic_serv":$logic_serv,
  "log_file":"conn_serv.log",
  "max_conn":10000,
  "listen_addr":"$listen_addr",
  "manage_addr":[":7000" , "127.0.0.1:7001"],
  "zlib_on":1,
  "monitor_inv":5
}

 结合tmpl_param将会填充到模板里生成conn_serv.json:

{
  "logic_serv":20001,
  "log_file":"conn_serv.log",
  "max_conn":10000,
  "listen_addr":":18909",
  "manage_addr":[":7000" , "127.0.0.1:7001"],
  "zlib_on":1,
  "monitor_inv":5
}

 分发

定义好了spush就可以分发框架各业务进程了,比如

 ./spush -P -f sgame.json 结果如下:

++++++++++++++++++++spush (2020-06-27 18:08:05)++++++++++++++++++++
      .push all procs
      create cfg:9/9
 
      ----------Push <sgame> Result----------
      ok
      .
      [9/9]
      [db_logic_serv-2]::success
      [disp_serv-1]::success
      [disp_serv-2]::success
      [manage_serv-1]::success
      [conn_serv-2]::success
      [logic_serv-2]::success
      [db_logic_serv-1]::success
      [conn_serv-1]::success
      [logic_serv-1]::success

      +++++++++++++++++++++end (2020-06-27 18:08:07)+++++++++++++++++++++

 更多的spush说明可以参考后面的进程说明

相关文章: