- 操作系统:Window10安装
Ubuntu
- 开发工具
VSCode
:安装EmmyLua
插件,方便Lua代码编写与调试。
环境准备
$ su - root
$ apt install -y lua5.3
$ lua -v
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
$ apt install -y gcc
$ apt install -y g++
$ apt install -y make
$ apt install -y autoconf automake libtool
$ apt install -y git
下载源码
下载Skynet1.4源码,推荐Lua5.4。
$ git clone https://github.com/cloudwu/skynet.git
fatal: unable to access 'https://github.com/cloudwu/skynet.git/': OpenSSL SSL_read: Connection was reset, errno 10054
$ git config --global http.sslVerify "false"
关闭HTTPS的SSL验证
$ git clone https://github.com/cloudwu/skynet.git
$ cd skynet
Skynet源码目录结构
目录 | 描述 |
---|---|
3rd | 第三方库,包括Lua虚拟机、jmalloc等。 |
lualib | Lua封装的常用库,比如HTTP、MD5等。 |
lualib-src | C语言实现的插件捆绑为Lua库,比如MySQL驱动、BSON、加密算法等。 |
service | 使用Lua编写的Skynet服务模块 |
service-src | 使用C语言编写的Skynet服务模块 |
skynet-src | Skynet核心代码目录 |
test | 使用Lua编写的测试代码 |
example | 示例代码 |
Makefile | 编译规则文件,用于编写。 |
platform.mk | 编译与平台相关的配置 |
编译生成
在Ubuntu中编译生成Skynet程序
$ make linux
cd 3rd/jemalloc && ./autogen.sh --with-jemalloc-prefix=je_ --enable-prof
/bin/sh: 1: ./autogen.sh: not found
make[1]: *** [Makefile:44: 3rd/jemalloc/Makefile] Error 127
make[1]: Leaving directory '/mnt/d/skynet/project/sky'
make: *** [platform.mk:40: linux] Error 2
找不到autogen.sh
脚本文件,Git下载的3rd/jemalloc/
目录为空,没有任何文件。下载jemalloc
源码放入其中。
$ git clone https://github.com/jemalloc/jemalloc.git
再次在sky目录下运行make linux
编译生成Linux程序skynet
到项目根目录下。
编译后会生成luaclib
和cservice
目录,目录下均为*.so
的系统动态库文件。
创建项目
规划项目目录结构
目录 | 描述 |
---|---|
lib | Skynet源码类库,Lua与C编写的核心扩展类库。 |
conf | 配置文件目录 |
bin | 可执行文件以及命令脚本存放位置 |
service | 项目编写的服务存放位置 |
log | 项目日志存放位置 |
$ mkdir sky && cd sky
$ mkdir lib
$ mkdir conf
$ mkdir bin
$ mkdir log
$ mkdir service
Skeynet核心文件为cservice
、luaclib
、lualib
、service
四个目录,创建项目后将编译后的Skynet的四个核心文件放到项目下的lib
文件夹内,作为核心类库使用。
$ mv lualib lib
$ mv service lib
$ mv luaclib lib
$ mv cservice lib
在项目根目录下创建bin
文件夹,将生成的skynet
文件移动到bin
目录下。
$ mkdir bin
$ mv skynet bin
配置文件
- Skynet的配置文件在被读取时,会被当作Lua代码加载,并以
key = value
键值对形式为配置项赋值。 - Skynet中用户自定义的配置会以字符串的形式保存在内部的
env
表中,可通过skynet.getenv
获取配置。
Skynet的配置可分为必要配置、可选配置、环境配置、集群配置、用户配置。
必要配置 | 描述 |
---|---|
cpath | 设置C编写的服务模块位置路径 |
thread | 设置启动的工作线程数量 |
bootstrap | 设置初始启动的服务 |
start | 设置启动的服务脚本 |
路径配置
添加路径配置文件
$ vim /conf/path
使用编译生成的skynet程序加载主配置文件,都会在项目根目录下完成。因此配置项目根目录时使用当前相对于项目根目录的相对路径作为项目根目录。
-- 路径配置文件
-- 项目根目录
root = "./"
-- C语言编写的Skynet核心库文件
lua_cpath = root.."lib/luaclib/?.so"
-- C语言编写的Skynet核心服务
cpath = root.."lib/cservice/?.so"
-- Lua语言编写的Skynet核心库
lua_path = root.."lib/lualib/?.lua;"..root.."lib/lualib/?/init.lua"
-- Lua编写的Skynet核心服务
luaservice = root.."lib/service/?.lua;"..root.."service/?.lua"
-- Lua编写的Skynet加载程序
lualoader = root.."lib/lualib/loader.lua"
注意:配置luaservice
时需要将项目根目录下的service
,也就是用户自定义服务编码的路径添加进入。后续在此目录下会加载项目的主入口文件main.lua
。
luaservice = root.."lib/service/?.lua;"..root.."service/?.lua"
路径 | 描述 |
---|---|
root | 项目根目录 |
lua_cpath | C语言编写的Skynet核心库文件 |
cpath | C语言编写的Skynet核心服务 |
lua_path | Lua语言编写的Skynet核心库 |
luaservice | Lua编写的Skynet核心服务 |
lualoader | Lua编写的Skynet加载程序 |
主配置
添加主配置文件,主配置文件用于当使用skynet
应用程序启动时需读取的配置。
$ vim conf/config
-- 主配置文件
-- 包含路径配置
include "path"
-- 工作线程数量
thread = 4
-- 启动节点数量
harbor = 0
-- 启动名为bootstrap的Lua服务,位于lib/service/bootstracp.lua。系统启动的第一个服务,默认为snlua bootstrap。
bootstrap = "snlua bootstrap"
-- 启动日志服务
logservice = "logger"
logger = nil
logpath = "."
-- 启动自定义的入口主脚本,位于service/main.lua。
start = "main"
-- 以后台守护进程方式启动Skynet,需配置logger。
-- daemon = "./daemon.pid"
日志配置
配置项 | 配置值 | 描述 |
---|---|---|
logservice | logger | 设置日志服务 |
logger | nil | 设置Skynet内置skynet_error 这个C语言API将日志输出的位置,nil 表示输出到标准输出(屏幕),可指定文件路径输出到文件。 |
logpath | . |
日志保存的文件名 |
主入口脚本
- 根目录下创建自定义服务
service
文件夹 - 自定义服务文件夹下创建主入口
main.lua
文件
$ mkdir service && cd service
$ vim main.lua
local skynet = require "skynet"
skynet.start(function()
skynet.error("skynet server start")
end)
启动程序
启动程序时需保证当前位置位于项目根目录下,使用bin/skynet
应用程序加载conf/config
主配置文件来执行主入口文件service/main.lua
,查看屏幕打印信息。
$ cd sky
$ bin/skynet conf/config
查看自定义的错误信息是否打印
[:00000002] LAUNCH snlua bootstrap
[:00000003] LAUNCH snlua launcher
[:00000004] LAUNCH snlua cdummy
[:00000005] LAUNCH harbor 0 4
[:00000006] LAUNCH snlua datacenterd
[:00000007] LAUNCH snlua service_mgr
[:00000008] LAUNCH snlua main
[:00000008] skynet server start
[:00000002] KILL self
命令脚本
编写启动、关闭、重启脚本以快速执行程序
查看Skynet进程信息
$ vim bin/status.sh
#! /bin/bash
echo "runtime platform:" `uname`
echo `ps -ef|grep skynet|grep -v grep`
sleep 3
杀死进程关闭服务
$ vim bin/stop.sh
#! /bin/bash
echo "stop skeynet"
pids=`ps -ef|grep skynet|grep -v grep|awk '{print $2}'`
for pid in $pids
do
echo "kill pid " $pid
skill -9 $pid
done
echo "stop success"
sleep 3
启动服务
$ vim bin/start.sh
#! /bin/bash
echo "start skynet"
platform=`uname`
echo "skynet runtime platform: " ${platform}
if [ ${platform}x == 'Linux'x ]; then
./bin/skynet ./conf/config &
fi
echo `ps -ef|grep skynet|grep -v grep`
sleep 3
echo "start success"
重启服务
$ vim bin/restart.sh
#! /bin/bash
echo "restart skynet"
echo -e
echo "skynet status"
echo `ps -ef|grep skynet|grep -v grep`
echo -e
pids=`ps -ef|grep skynet|grep -v grep|awk '{print $2}'`
for pid in $pids
do
echo "kill skynet pid " $pid
skill -9 $pid
sleep 1
done
echo -e
echo "start skynet"
./bin/skynet ./conf/config &
sleep 1
echo -e
echo "skynet status"
echo `ps -ef|grep skynet|grep -v grep`
echo -e
sleep 1
echo "start success"