基础镜像构建好了之后,就可以使用镜像来构建容器,从而来进行服务。这里想创建一个 websocket 服务的项目。
这里可以有几个文章可以参考:
https://blog.csdn.net/linxinfa/article/details/120573016
https://github.com/Skycrab/skynet_websocket
创建基础文件夹和文件
按照 https://blog.csdn.net/linxinfa/article/details/120573016 的博客,对文件进行分类安排,创建基础文件夹和文件。如下所示:
│ .dockerignore
│ docker-compose.yaml
│
├─service
│ └─skynet
│ Dockerfile
│
└─www
└─websocket
│ main.lua
│
├─etc
│ cluster.lua
│ config
│
├─luaclib
├─lualib
└─service
对于 skynet
, config 文件会作为入口文件。而这个 config 文件可以是项目中任何位置,因为是由 skynet config
来明确指定的。不过,依照前人的约定习惯,把 config 文件放在 ./websocket/etc/
下。
再来全局来看项目结构。最外层是 docker 相关的配置。 www 目录是项目的总和。这样是方便存放项目。今天存放一个 websocket 的项目,明天可能就会存放 socket.io 的项目。
在 websocket 项目中结果,还是遵循前人的约定习惯。
到此,仅可以看到创建的一些文件夹和两个文件:config 文件和 main.lua 文件。cluster.lua 暂时是空的。
config 文件你也可以命名为 config.lua 文件。
config
config.lua 作为入口文件,其地位当然是举足轻重的。来看看里边的内容。
-- 根目录
skynet_path = '/skynet'
service_path = '/www/websocket'
-- 节点名称
node = 'node_1'
-- 启用工作线程数 | c 编写的服务模块的位置 | 启动第一个服务
thread = 8
cpath = skynet_path .. '/cservice/?.so'
bootstrap = 'snlua bootstrap'
-- 主程序入库 | 适用 cluster 的集群模式
start = 'main'
harbor = 0
-- lua 配置项
lualoader = skynet_path .. '/lualib/loader.lua'
luaservice = skynet_path .. "/service/?.lua;" .. service_path .. "/?.lua"
lua_path = skynet_path .. "/lualib/?.lua;" .. skynet_path .. "/lualib/?/init.lua;" .. service_path .. "/?.lua"
lua_cpath = skynet_path .. "/luaclib/?.so;" .. service_path .. "/luaclib/?.so"
skynet_path 配置的是 skynet 的安装的位置。
service_path 配置的是项目的位置。
这两个位置下边的配置会用到。
代码中,也加了一些注释说明。下边用表格的方式,再说明一次。
参数 | 描述 |
---|---|
thread | 启用的工作线程数量,一般配置为CPU核心数 |
harbor | 主从节点模式。skynet 初期提供了 master/slave 集群模式,后来提供了更适用的 cluster 集群模式,建议使用 cluster 模式,配 0 |
cpath | 用 C 语言编写的服务模块的路径。cpath 配置项通常用于指定 C 模块的搜索路径。它不是必须的,但是如果你需要在你的服务中使用 C 编写的模块,那么你需要配置 cpath 来指定这些模块的位置。cpath 应该放在 bootstrap 配置之前,因为 bootstrap 会使用 cpath 指定的路径来加载 C 模块。如果你没有配置 cpath,那么你的服务将无法找到和加载C模块。因此,根据你的需求,你可能需要根据你的具体路径来配置 cpath |
bootstrap | 指定 skynet 启动时的第一个服务以及其启动参数。默认配置为 snlua bootstrap,即启动一个名为 bootstrap 的lua服务,通常指的是 service/bootstrap.lua 这段代码。这个服务是启动其他服务的入口点,并且会根据配置文件中的其他参数来加载和启动其他服务。因此,bootstrap 是用于引导 skynet 系统启动的重要配置选项。 |
start | 主服务入口 |
luaservice | 用于指定 Lua 服务的路径。它通常是一个字符串,包含了服务的名称或路径。在配置文件中,你可以指定多个服务,用分号(;)分隔。(包括 skynet 框架自带的一些服务和自己写的服务。) |
lualoader | lua 脚本加载器。用于配置调用哪一段Lua代码加载Lua服务。通常配置为lualib/loader.lua,由这段代码解析服务名称,进一步加载Lua代码。snlua会将核心配置项取出,放置在初始化好的Lua虚拟机的全局变量中。 |
lua_path | lua_path用于指定Lua模块的搜索路径。它通常是一个字符串,包含了多个路径,用分号(;)分隔。 |
lua_cpath | 用于指定C模块的搜索路径。它通常是一个字符串,包含了多个路径,用分号(;)分隔。 |
最后啰嗦一下。在 config 中配置的信息,在后续的逻辑中都可以通过 skynet.getenv
方法获取到。在这里,不需要使用 skynet.setenv
方法来明确设置。
skynet.setenv
有一个严格的问题,就是不能对已存在的变量进行设置。相对于一个 const
的行为。
虽然吧,在其他地方通过 skynet.getenv
方法获取到。但是也能通过 skynet.setenv
进行赋值一次。再第二次赋值就会报错。
从显现来看,虽然可以通过 skynet.getenv
方法获取到 config
中的参数,那似乎不是通过 skynet.setenv
的方式来传递的。
再来看 main.lua 中的代码。
local skynet = require 'skynet'
skynet.start(function()
skynet.error('hello world')
skynet.error(skynet.exit())
end)
就这么多。
代码都准备好了,最后在 docker-compose.yaml
文件中添加使用镜像,构建容器,启动服务的配置。
…
websocket:
image: skynet:1.7
container_name: websocket
volumes:
- ./www:/www
command: /skynet/skynet /www/websocket/etc/config
depends_on:
- skynet
运行 docker-compose up
看看 。
(base) PS D:\Study\skynet\websocket> docker-compose up
[+] Building 0.0s (0/0) docker:default
[+] Running 2/0
✔ Container skynet1.7 Created 0.0s
✔ Container websocket Created 0.0s
Attaching to skynet1.7, websocket
skynet1.7 exited with code 0
websocket | [:00000002] LAUNCH snlua bootstrap
websocket | [:00000003] LAUNCH snlua launcher
websocket | [:00000004] LAUNCH snlua cdummy
websocket | [:00000005] LAUNCH harbor 0 4
websocket | [:00000006] LAUNCH snlua datacenterd
websocket | [:00000007] LAUNCH snlua service_mgr
websocket | [:00000008] LAUNCH snlua main
websocket | [:00000008] hello world
websocket | [:00000008] KILL self
websocket | [:00000002] KILL self
是不是已经运行起来了,也达到了预期的效果了。
提交版本
git init -b main
git add .
git commit -m 'init skynet'