环境:centos7
获取源码
- 安装git代码管理工具
$ sudo yum update
$ sudo yum install git
如果安装失败,先安装支持库
$ sudo yum install build-essential libssl-dev libcurl4-gnutls-dev libexpat1-dev gettext unzip
- 使用git工具从GitHub上拷贝源码
git clone https://github.com/cloudwu/skynet.git
- 代码目录结构
3rd # 第三方支持库,包括LUA虚拟机,jmalloc等
lualib # Lua语言封装的常用库,,包括http、md5
lualib-src # 将c语言实现的插件捆绑成lua库,例如数据库驱动、bson、加密算法等
service # 使用lua写的skynet的服务模块
service-src # 使用c写的skynet的服务模块
skynet-src # skynet核心代码目录
test # 使用lua写的一些测试代码
examples # 示例代码
Makefile # 编译规则文件,用于编译
platform.mk # 编译与平台相关设置
编译与运行
- 编译skynet
cd skynet
make linux
出现错误:致命错误:stdatomic.h:没有那个文件或目录 #include <stdatomic.h>
原因:因为centos 自带的gcc版本过低,导致的错误。(具体是4.8版本的一个bug导致)
解决:
更新到更高版本gcc
sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc*
scl enable devtoolset-9 bash
再次执行make linux
目录下出现skynet可执行文件
- 执行config例子测试是否成功
./skynet examples/config
- 运行客户端
另外打开一个终端运行client.lua脚本
./3rd/lua/lua examples/client.lua
客户端:
构建服务的基础API
local skynet = require "skynet"
--conf配置信息已经写入到注册表中,通过该函数获取注册表的变量值
skynet.getenv(varName) 。
--设置注册表信息,varValue一般是number或string,但是不能设置已经存在的varname
skynet.setenv(varName, varValue)
--打印函数
skynet.error(...)
--用 func 函数初始化服务,并将消息处理函数注册到 C 层,让该服务可以工作。
skynet.start(func)
--若服务尚未初始化完成,则注册一个函数等服务初始化阶段再执行;若服务已经初始化完成,则立刻运行该函数。
skynet.init(func)
--结束当前服务
skynet.exit()
--获取当前服务的句柄handler
skynet.self()
--将handle转换成字符串
skynet.address(handler)
--退出skynet进程
require "skynet.manager" --除了需要引入skynet包以外还要再引入skynet.manager包。
skynet.abort()
--强制杀死其他服务
skynet.kill(address) --可以用来强制关闭别的服务。但强烈不推荐这样做。因为对象会在任意一条消息处理完毕后,毫无征兆的退出。所以推荐的做法是,发送一条消息,让对方自己善后以及调用 skynet.exit 。
注:skynet.kill(skynet.self()) 不完全等价于 skynet.exit() ,后者更安全。
- 编写第一个测试程序
vim 1-test.lua
local skynet = require "skynet"
skynet.start(function()
skynet.error("Server First Test")
end)
执行需要回到skynet文件夹下
进入example文件夹中拷贝一份config文件并修改里面内容
如果你自己的代码没有在skynet文件夹下,需要修改config.path文件,将代码路径添加进去
执行程序
./skynet examples/1-test
- 另一种启动服务的方式
先启动main.lua,再在控制台输入要启动的服务
同样需要注意路径问题
环境变量
1、预先加载的环境变量是在conf中配置的,加载完成后,所有的service都能去获取这些变量。
2、也可以去设置环境变量,但是不能修改已经存在的环境变量。
3、环境变量设置完成后,当前节点上的所有服务都能访问的到。
4、环境变量设置完成后,即使服务退出了,环境变量依然存在,所以不要滥用环境变量。
添加环境变量vim examples/config
写一个程序测试添加的环境变量
2-test.lua
local skynet = require "skynet"
skynet.start(function()
local name = skynet.getenv("myname") -- 获取环境变量myname myage的值
local age = skynet.getenv("myage")
-- skynet.setenv("myname", "kaxi") -- 设置已经存在的变量 报错
-- skynet.setenv("myage", 3)
-- name = skynet.getenv("myname")
skynet.error("my name is ", name, ",", "age", age)
skynet.setenv("newname", "Ynlii") -- 设置新的变量
skynet.setenv("newage", 3)
name = skynet.getenv("newname")
age = skynet.getenv("newage")
skynet.error("my name is ", name, ",", "age", age)
skynet.exit()
end)
skynet.init
skynet.init用来注册服务初始化之前,需要执行的函数。也就是在skynet.start之前运行。
3-test.lua
local skynet = require "skynet"
skynet.init(function()
skynet.error("service init")
end)
skynet.start(function()
skynet.error("service start")
end)
参考博文:https://blog.youkuaiyun.com/qq769651718/article/details/79432835