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

SGAME的安装请参考github地址的README:https://github.com/nmsoccer/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说明可以参考后面的进程说明

SGAME 框架说明相关推荐

  1. SGAME:一个简单的go游戏服务端框架

    SGame是一个由GO实现的游戏简单服务端框架. 说明 主要是使用GO丰富的库资源和较高的开发效率. 开发简单 可以使用已有的代码框架很方便的构建一个新的进程 方便扩展 基于已有的框架可以动态的扩展进 ...

  2. SGAME的日志系统

    综述 SGAME框架所使用的日志系统基于一个小的日志库slog,具体细节可以参考https://github.com/nmsoccer/slog 其安装也很简单,会在/usr/local/lib下生成 ...

  3. SGame 页面管理

    SGame框架提供了一个页面管理工具,用来实时的监控和对运行时进程提供一些通用指令 管理进程 manager_serv是框架的管理进程 代码 位于sgame/servers/manager_serv目 ...

  4. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  5. Gin 框架学习笔记(03)— 输出响应与渲染

    在 Gin 框架中,对 HTTP 请求可以很方便有多种不同形式的响应.比如响应为 JSON . XML 或者是 HTML 等. ​ Context 的以下方法在 Gin 框架中把内容序列化为不同类型写 ...

  6. Gin 框架学习笔记(02)— 参数自动绑定到结构体

    参数绑定模型可以将请求体自动绑定到结构体中,目前支持绑定的请求类型有 JSON .XML .YAML 和标准表单 form数据 foo=bar&boo=baz 等.换句话说,只要定义好结构体, ...

  7. QT学习之状态机框架

    状态机框架 创建状态机

  8. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  9. 开源自动化机器学习框架

    20211101 在 Airbnb 使用机器学习预测房源的价格 https://blog.csdn.net/weixin_33735077/article/details/87976278?spm=1 ...

最新文章

  1. 【Cmake】Cmake学习记录
  2. Android TextView的一些小知识
  3. lj245a引脚功能图_如何快速读懂时序图?
  4. wxpython使用folium_wxPython实现文本框基础组件
  5. 1012 The Best Rank (25)
  6. php连接mysql乱码原因_PHP连接MYSQL出现乱码的原因与解决办法
  7. 我很生气,帮了不足一个月就离开了
  8. 逆天的GPT-2居然还能写代码(但OpenAI却被无情吐槽)
  9. 如何将composer设置为全局变量?
  10. Facebook回应追踪无账号用户:源于网站插件漏洞
  11. Guava LoadingCache用法
  12. 第115章 SQL函数 REPEAT
  13. 【云计算的1024种玩法】使用阿里云+微擎打造微信公众号管理系统
  14. [转]音乐天堂 Music Heaven Vol.1 ~ Vol.36 的目录
  15. mysql ping命令_Ping命令详解
  16. Idea快速入门指南
  17. 由浅入深玩转华为WLAN—21 漫游系列(8)不同AC之间三层漫游【二层上线+直连式+隧道转发模式,相同VLAN,但不同子网的环境】
  18. VB 任意随机数(N-M)的通用函数(单取、多取存入数组、排序等功能) 内附随机数介绍
  19. Kafka设计解析(十三)Kafka消费组(consumer group)
  20. c语言开发题库管理系统,c语言程序设计_题库管理系统.doc

热门文章

  1. 钾钠离子净化树脂,除钾钠树脂
  2. 统计学进阶之临床建立模型(一)
  3. 从问题的处理方式感悟学习方法 (r4笔记第39天)
  4. vivado如何评估_在Vivado下进行功耗估计和优化
  5. HTML行内元素标签:b、strong、i、u、del、sub、sup
  6. 简单新闻发布系统前台界面(html+css)
  7. uni-app base64加密解密
  8. 读《下一个倒下的会不会是华为》
  9. OpenShift简介(二)
  10. MySQL序列以及生成主键编号记录