skynet学习笔记 01

环境: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 

config客户端:
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文件并修改里面内容
路径修改config文件如果你自己的代码没有在skynet文件夹下,需要修改config.path文件,将代码路径添加进去
修改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)

init

参考博文:https://blog.youkuaiyun.com/qq769651718/article/details/79432835

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值