skynet quick

  • 操作系统: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到项目根目录下。

编译后会生成luaclibcservice目录,目录下均为*.so的系统动态库文件。

创建项目

规划项目目录结构

目录 描述
lib Skynet源码类库,Lua与C编写的核心扩展类库。
conf 配置文件目录
bin 可执行文件以及命令脚本存放位置
service 项目编写的服务存放位置
log 项目日志存放位置
$ mkdir sky && cd sky
$ mkdir lib
$ mkdir conf
$ mkdir bin
$ mkdir log
$ mkdir service

Skeynet核心文件为cserviceluacliblualibservice四个目录,创建项目后将编译后的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 . 日志保存的文件名

主入口脚本

  1. 根目录下创建自定义服务service文件夹
  2. 自定义服务文件夹下创建主入口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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容