Skynet服务端框架搭建2-目录结构配置

Bertha 。 2022-08-28 00:42 547阅读 0赞

Skynet服务端框架搭建2-目录结构配置

通过前面几篇Skynet的小demo也大概清楚了skynet框架的使用方法,现在将skynet放在整个项目中我们就不能还在原来的框架里修改了,要重新设计文件结构

目录结构

  1. [root@feng1 game_demo]# ll
  2. total 20
  3. drwxr-xr-x 2 root root 4096 Oct 28 15:52 etc --这里我们存放服务配置的文件夹
  4. drwxr-xr-x 2 root root 4096 Oct 28 15:52 luaclib --存放一些C模块(.so文件)
  5. drwxr-xr-x 2 root root 4096 Oct 28 15:52 lualib --存放Lua模块
  6. drwxr-xr-x 8 root root 4096 Oct 28 15:54 service --存放各服务的Lua代码
  7. drwxr-xr-x 11 root root 4096 Oct 28 15:50 skynet --skynet框架本体,这里我们不会改动他,如果框架又更新直接更新这个文件夹即可
  8. -rw-r--r-- 1 root root 0 Oct 28 15:53 start.sh --启动脚本
  9. [root@feng1 game_demo]# tree -L 2
  10. .
  11. ├── etc
  12. ├── luaclib
  13. ├── lualib
  14. ├── service --service中的服务结构对应上一篇
  15. ├── agent
  16. ├── agentmgr
  17. ├── gateway
  18. ├── login
  19. ├── main.lua
  20. ├── nodemgr
  21. └── scene
  22. ├── skynet
  23. ├── 3rd
  24. ├── examples
  25. ├── HISTORY.md
  26. ├── LICENSE
  27. ├── lualib
  28. ├── lualib-src
  29. ├── Makefile
  30. ├── platform.mk
  31. ├── README.md
  32. ├── service
  33. ├── service-src
  34. ├── skynet-src
  35. └── test
  36. └── start.sh
  37. 19 directories, 7 files
  38. [root@feng1 game_demo]#

因为我们更改了目录结构所以需要重新编写Skynet的配置文件,让Skynet可以加载到各模块代码,在etc下新建config.node1和config.node2,表示两个节点的配置

注意这里配置文件的路径都是基于start.sh的当前路径来写的

skynet配置文件

config.node1

  1. --必须配置
  2. thread = 8 --启用多少个工作线程
  3. cpath = "./skynet/cservice/?.so" --用C编写的服务模块的位置
  4. bootstrap = "snlua bootstrap" --启动的第一个服务
  5. --bootstrap配置项
  6. start = "main" --主程序入口
  7. harbor = 0 --不使用主从节点模式
  8. --lua配置项
  9. lualoader = "./skynet/lualib/loader.lua"
  10. luaservice = "./service/?.lua;" .."./service/?/init.lua;".. "./skynet/service/?.lua;"
  11. lua_path = "./etc/?.lua;" .. "./lualib/?.lua;" .. "./skynet/lualib/?.lua;" .. "./skynet/lualib/?/init.lua"
  12. lua_cpath = "./luaclib/?.so;" .. "./skynet/luaclib/?.so"
  13. --后台模式
  14. --daemon = "./skynet.pid"
  15. --logger = "./userlog"
  16. --节点
  17. node = "node1"

跟之前的配置文件差别不大,主要是因为我们skynet的框架单独放进了一个文件夹,所以要改动path、lualoader、luaservice、lua_path、lua_cpath的路径,我们自己写的服务也放在了service文件夹下,所以要修改luaservice配置项,”./service/?.lua;“会查找service下所有××.lua的文件,而”./service/?/init.lua;“失去找启动文件,如果都没找到,最后才去找skynet本身的文件”./skynet/service/?.lua;”

最后自定义环境变量node(表示节点名),因为使用了多节点所以开启了harbor(集群模式cluster)

主服务还是main,到时候我们在service下写一个main.lua作为主服务即可,再创建一个config.node2和1一致,就是最后节点名不一样,为node2

主服务文件

service/main.lua

  1. local skynet = require "skynet"
  2. skynet.start(function()
  3. --初始化
  4. skynet.error("[start main]")
  5. --退出自身
  6. skynet.exit()
  7. end)

先配置一个最简单的主服务,让整个系统能启动并且退出,并打印”[start main]“,供我们测试整个系统的路径结构是否有问题

启动脚本

关于shell脚本的知识我没专门总结过用法,毕竟我也只是看的懂,会用简单的,sh脚本还是每个程序员必备的技能了,大家最好也要到会看会写一些基本的水平,这里我们脚本很简单,只是把我们之前./skynet ××config的过程配置进来,我们每次调用脚本启动即可

start.sh

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

我们在start.sh目录下调用

  1. sh start.sh 1

启动一下,可以发现运行成功了,如果我们需要启动2,只需要把参数改成2就行了

image-20211029113626168

服务配置

虽然我们只是简单配置了节点1节点2,但还是需要一个配置文件来规范我们各个节点之间的服务是如何通信的,端口也需要配置

ets/runconfig.lua

  1. return {
  2. --集群
  3. cluster = {
  4. node1 = "127.0.0.1:7771",
  5. node2 = "127.0.0.1:7772",
  6. },
  7. --agentmgr
  8. agentmgr = {
  9. node = "node1" },
  10. --scene
  11. scene = {
  12. node1 = {
  13. 1001, 1002},
  14. --node2 = {1003},
  15. },
  16. --节点1
  17. node1 = {
  18. gateway = {
  19. [1] = {
  20. port=8001},
  21. [2] = {
  22. port=8002},
  23. },
  24. login = {
  25. [1] = {
  26. },
  27. [2] = {
  28. },
  29. },
  30. },
  31. --节点2
  32. node2 = {
  33. gateway = {
  34. [1] = {
  35. port=8011},
  36. [2] = {
  37. port=8022},
  38. },
  39. login = {
  40. [1] = {
  41. },
  42. [2] = {
  43. },
  44. },
  45. },
  46. }

配置文件虽然长,但各个功能都很明了,

  • 比如node1地址为127.0.0.1:7771 ,node2则是127.0.0.1:7772,
  • agentmgr全局唯一的服务属于节点1
  • scene则是在节点1开启1001和1002的两个战斗场景
  • node1和node2描述了各节点的本地服务,两个节点分别开启了两个gateway和两个login,节点1的两个gateway监听8001和8002,而2节点则是8011和8012

image-20211029112917344

如何读取该配置文件呢?

./service/main.lua

  1. local skynet = require "skynet"
  2. skynet.start(function()
  3. --初始化
  4. skynet.error("[start main]")
  5. skynet.error(runconfig.agentmgr.node)
  6. --退出自身
  7. skynet.exit()
  8. end)

使用runconfig.agentmgr.node即可拿到runconfig中agentmgr类里的node名,在编译器中也会有代码提示,表示取到了

image-20211029113205530

发表评论

表情:
评论列表 (有 0 条评论,547人围观)

还没有评论,来说两句吧...

相关阅读