【从零开始学Skynet】实战篇《球球大作战》(二):结构设计

news2025/1/15 16:36:56

        万丈高楼平地起,既然这是个“大项目”,就要有大项目的样子,就要有所规划,下面先把项目的目录结构搭起来。

1、目录结构

        建议把Skynet框架放到一个文件夹里,把所有自己编写的内容都放到外层的文件夹里。建立如下表所示的目录结构:

文件(夹)说明
etc存放服务配置的文件夹
luaclib存放一些C模块(.so文件)
lualib存放Lua模块
service存放各种服务的Lua代码
skynetSkynet框架,我们不会改动Skynet的任何内容。如果后续Skynet有更新,直接替换该文件夹即可
start.sh启动服务器的脚本

    创建完目录结构之后如下图所示:

             service文件夹用于存放各种服务的代码,每个服务的代码都放到一个以服务名称命名的文件夹里。如下图所示:

         服务端会开启gatewayloginagent等多种服务,我们光给每个服务建立对应的文件夹。主服务是节点启动后第一个被加载的服务,用于启动其他各个服务,它比较特殊,我们不给它创建对应的文件夹,而是为它创建一个main.lua文件。

2、配置文件

        更改了目录结构,需要重新编写Skynet的配置文件,让Skynet可以加载项目代码。在etc文件夹下新建文本文件config.node1config.node2,它们代表各个节点的配置。

config.node1中的代码如下所示:

--必须配置
thread = 8 --启用多少个工作线程
cpath = "./skynet/cservice/?.so" --用C编写的服务模块的位置
bootstrap = "snlua bootstrap" --启动的第一个服务
--bootstrap配置项
start = "main" --主服务入口
harbor = 0 --不使用主从节点模式
--lua配置项
lualoader = "./skynet/lualib/loader.lua"
luaservice = "./service/?.lua;" .."./service/?/init.lua;".."./skynet/service/?.lua;"
lua_path = "./etc/?.lua;" .. "./lualib/?.lua;" .. "./skynet/lualib/?.lua;" .. "./skynet/lualib/?/init.lua"
lua_cpath = "./luaclib/?.so;" .. "./skynet/luaclib/?.so"
--后台模式(必要时开启)
--daemon = "./skynet.pid"
--logger = "./userlog"
--节点
node = "node1"

这份配置与Skynet的默认配置没有太大区别,但有一些需要注意的地方,具体如下:

  • 因为Skynet引擎被放置到skynet文件夹下了,所以要重设cpath、lualoader、luaservice、lua_path、lua_cpath的路径;
  • 由于自定义服务位于service文件夹下,因此要修改luaservice配置项,让它搜索该文件夹。按照上面代码的设置,它会依次查找service/[服务名].luaservice/[服务名]/init.lua作为服务的启动文件。如果查找失败,才去搜索skynet提供的服务。
  • 依据代码中lua_path项的配置,当程序需要加载Lua模块时,它会依次查找etc/[模块名].lualualib/[模块名].lua,再查找skynet提供的模块;
  • 自定义环境变量“node”,代表节点名称;
  • 使用cluster集群模式,设置harbor=0
  • 主服务为main,根据luaservice项的配置,skynet会启动service/main.lua作为主服务;
  • config.node2config.node1的内容一样,只是将node="node1"改成了node="node2"

3、主服务           

         先编写个最简单的主服务,用于测试。首先要让系统能启动,后面才好编写功能逻辑。

local skynet = require "skynet"
skynet.start(function()
    --初始化
    skynet.error("[start main]")
    --退出自身
    skynet.exit()
end)

4、启动脚本

        因为启动脚本的命令很长:“./skynet/skynet./etc/config.node1”,不方便输入,在我们之前创建的start.sh中编写如下所示的代码:

./skynet/skynet ./etc/config.node$1

        在start.sh所在的目录执行“sh start.sh 1”即可启动程序,执行“sh start.sh 2”即可开启第二个节点,方便多了。启动主服务后如下图所示:

倒数第三行的“[start main]”正是主服务打印出的内容,如果能看到此信息,说明启动成功。

5、服务配置

  • 服务端支持横向拓展,每个节点可以开启不同数量的gateway、login,此处需要通过一份配置文件来描述服务端的拓扑结构
  • 各个服务也需要根据这份配置文件来查找其他服务的位置;
  • 比如login服务器需要与agentmgr通信,那么它就需要知道agentmgr在哪个节点,配置文件会提供这个信息;
  • 服务配置还会提供服务所需的一些参数,比如每个gateway监听哪个端口号。

   新建文件etc/runconfig.lua,代码如下所示:

return {
    --集群
    cluster = {
		  node1 = "127.0.0.1:7771", 
		  node2 = "127.0.0.1:7772",
    },
    --agentmgr
    agentmgr = { node = "node1" },
    --scene
    scene = {
      node1 = {1001, 1002},  
      --node2 = {1003},
    },
    --节点1
    node1 = {
        gateway = {
          [1] = {port=8001},
          [2] = {port=8002},
        },
        login = {
            [1] = {},
            [2] = {},
        },
    },

    --节点2
    node2 = {
        gateway = {
          [1] = {port=8011},
          [2] = {port=8022},
        },
        login = {
            [1] = {},
            [2] = {},
        },
    },
}

 代码说明:

  • cluster指明服务端系统包含两个节点,分别为node1node2。各个节点需要通信,其中node1的地址为“127.0.0.1:7771”node2的地址为“127.0.0.1:7772”
  • agentmgr指明全局唯一的agentmgr服务位于node1处;
  • scene指明在node1开启编号为10011002的两个战斗场景服务,语句“node2={1003}”代表在node2开启编号为1003的场景服务。为了方便前期开启单个节点来调试功能,我们先把node2={1003}这行代码注释掉,用时再开启;
  • node1node2描述了各节点的“本地”服务。两个节点分别开启了两个gateway和两个loginnode1处的两个gateway的监听端口分别是80018002node2的是80118012

    下图对代码中各项也做出了解释:

 6、服务测试

        该如何读取这份配置文件呢?我们可以做个简单测试,在./service/main.lua文件中添加两句代码,代码如下所示:

local skynet = require "skynet"
local runconfig = require "runconfig"
skynet.start(function()
    --初始化
    skynet.error(runconfig.agentmgr.node)
    --退出自身
    skynet.exit()
end)

        在start.sh所在的目录下执行“sh start.sh 1”,主服务应该能把“runconfig.agentmgr.node”的值“node1”打印出来:

         这段代码仅是范例,大家可以根据项目需要自行修改。如果游戏在线人数很多,要配置更多节点,开启更多gateway

        后面的主程序会读取runconfig.lua,决定节点内要启动哪些服务。gateway也会读取它,用于设置监听端口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL运维10-MySQL数据的导入导出

文章目录0、概述1、mysqldump导出数据mysql导入数据1.1、使用mysqldump导出数据1.1.1、使用--tables导出指定表1.1.2、使用--tab选项将表定义文件和数据文件分开导出1.1.3、使用--fields-terminated-by选项定义数据分隔符1.1.4、使用--databases选项导出整个库或多个库1.1.5、使…

Python算法设计 - 蒙特卡洛法

版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 目录一、蒙特卡洛法二、求圆周率π三、Python算法实现四、作者Info一、蒙特卡洛法 蒙特卡洛方法又称统计模拟法,随机抽样技术,是一种随机模拟方法&#x…

pytorch进阶学习(五):神经网络迁移学习应用的保姆级详细介绍,如何将训练好的模型替换成自己所需模型

代码资源和数据集资源使用进阶学习(四)中的代码,大家可以配合食用哟~ pytorch进阶学习(四):使用不同分类模型进行数据训练(alexnet、resnet、vgg等)_好喜欢吃红柚子的博客-CSDN博客…

数据结构之八大排序算法

文章目录一.常见的排序二.插入排序三.希尔排序四.选择排序五.堆排序六.冒泡排序七.快速排序八.归并排序九.计数排序十.排序总结一.常见的排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起…

pytorch性能分析工具Profiler

1. Torch Profiler工具介绍 https://zhuanlan.zhihu.com/p/360479566 PyTorch Profiler 是一个开源工具,可以对大规模深度学习模型进行准确高效的性能分析。包括如下等功能: 分析model的GPU、CPU的使用率各种算子op的时间消耗trace网络在pipeline的CPU和GPU的使用情况Profil…

Educational Codeforces Round 146 (Rated for Div. 2) - B. Long Legs(思维 数学)

题目如下: 题目链接 题解 or 思路: 我们可以发现我们有两个可选的入手方向: 1.正推 2.反推 我们可以发现正推似乎看不出来什么东西,而反推可以发现一个性质! 性质如下: 我们假设最终的腿长为 MMM 可以得到…

sql需要注意的地方 以及 云记模块逻辑

标题模糊搜素时 sql语句需要注意的地方 用concat拼; 用户行为 actionName 进入发布云记页面 actionNameview 添加或修改云记 actionNameaddOrUpdate 查询云记详情 actionNamedetail 删除云记 actionNamedelete 分页查询云记列表 …

第05章_数组

第05章_数组 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 数组的概述 1.1 为什么需要数组 需求分析1: 需要统计某公司50个员工的工资情况,例如计…

chatGPT中文版入口-chatGPT不可以用的地区

ChatGPT老出现不可用 如果您在使用ChatGPT时发现它经常不可用,可能是由于以下原因: OpenAI API的服务不稳定。由于技术问题、网络问题或维护(如软件更新)等原因导致OpenAI API服务不稳定,会导致ChatGPT无法使用。 接…

【JSON学习笔记】2.JSON vs XML及JSON的对象和数组

前言 本章介绍JSON vs XML及JSON的对象和数组。 JSON vs XML JSON 和 XML 都用于接收 web 服务端的数据。 JSON 和 XML在写法上有所不同,如下所示: JSON 实例 {"sites": [{ "name":"csdn教程" , "url":&q…

〖Python网络爬虫实战⑪〗- 正则表达式实战(二)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费…

《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数

本期给大家带来的是是《LeetCode 热题 HOT 100》第四题——寻找两个正序数组的中位数的题目讲解!!!() 本文目录 💥题意分析 💥解题思路: 1、直接法 (❌) …

2023年证券、基金、银行从业资格证考试计划

一、证券从业: 考试时间:统一测试拟于6月3日-4日举办1次,在全国41个城市举办。 报名网站:考试报名-中国证券业协会 (sac.net.cn) 目标:一般从业资格考试(入门资格考试) 考试人群:即将进入证券业从业的人…

Linux命令·ping

Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送ICMP ECHO_REQUEST数据包到网络主机&#xff08…

【ROS2指南-5】理解ROS2服务

目标:使用命令行工具了解 ROS 2 中的服务。 教程级别:初学者 时间: 10分钟 内容 背景 先决条件 任务 1 设置 2 ros2服务列表 3 ros2服务类型 4 ros2 服务查找 5 ros2界面展示 6 ros2 服务调用 概括 下一步 相关内容 背景 服务是 …

Ubuntu18.04安装linux-lab

Ubuntu18.04安装linux-lab 文章目录Ubuntu18.04安装linux-labdocker安装linux-lab安装意外事件流处理参考资料本文主要目的是搭建linux内核实验环境 因为工作需要所以学习linux内核,目前主要根据《linux内核完全注释》和《自己动手写操作系统》进行学习&#xff0c…

代码随想录【链表】---->反转链表、两两交换链表中的节点

文章目录206. 反转链表思路双指针实现递归写法24. 两两交换链表中的节点思路代码实现206. 反转链表 题目LeetCode206. 反转链表 思路 翻转链表实际上只需要将每一个节点的指针域指向前一个节点即可,原来第一个节点的指针域指向NULL指针 原头节点是1&#xff0c…

前端的性能对业务数据的影响

性能总论 一切没有 profiling 的性能都是耍流氓。凡是真正有价值的性能优化,必定是从端到端的业务场景建立体系来考虑的。 性能体系的建立可以分成以下几部分: 现状评估和建立指标;技术方案;执行;结果评估和监控。 …

【博学谷学习记录】超强总结,用心分享 | 架构师 Redis学习总结

文章目录1.Redis概述&安装配置安装启动2.Redis的Key的设计规范1、key名设计2、避免bigkey**string字符串类型**hash类型(散列表)list列表类型set集合类型sortedset有序集合类型bitmap位图 类型geo地理位置类型1.Redis概述&安装配置 官网&#x…

SQL SERVER数据库生成数据字典并且导出方法

SQL SERVER数据库生成数据字典并且导出方法打开SQL SERVER 2014找到你所需要建立数据字典的数据库在代码区输入如下SQL语句点击运行,导出或者带标题复制出来打开SQL SERVER 2014找到你所需要建立数据字典的数据库 右键→点击 新建查询 在代码区输入如下SQL语句 S…