skynet cjson

Skynet早期拥有lua-cjson库,后被sproto取代。由于Lua5.3开始支持整形,但cjson并没有适配Lua5.3,若直接编译会造成JSON字符串中的数字转换为浮点数的问题。因此风云为cjson提供了一个补丁:https://github.com/mpx/lua-cjson/pull/22

也可使用风云维护的另一个分支:https://github.com/cloudwu/lua-cjson

cjson优缺点

  • 优点:速度快、支持UTF-8,没有依赖,MIT开源。
  • 缺点:不支持UTF-16、UTF-32

失败操作

查看Lua版本

$ lua -v
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio

下载代码

$ git clone https://github.com/cloudwu/lua-cjson
$ cd lua-cjson

首先不要急着编译,查看lua-cjson目录下的Makefile文件中,对Lua版本的保存位置的要求。

$ cat Makefile
LUA_VERSION =       5.3
TARGET =            cjson.so
PREFIX =            /usr/local
#CFLAGS =            -g -Wall -pedantic -fno-inline
CFLAGS =            -O3 -Wall -pedantic -DNDEBUG
CJSON_CFLAGS =      -fpic
CJSON_LDFLAGS =     -shared
LUA_INCLUDE_DIR =   $(PREFIX)/include
LUA_CMODULE_DIR =   $(PREFIX)/lib/lua/$(LUA_VERSION)
LUA_MODULE_DIR =    $(PREFIX)/share/lua/$(LUA_VERSION)
LUA_BIN_DIR =       $(PREFIX)/bin

需要配置Lua相关变量

默认采用的是Lua5.3版本

进入项目后编译生成动态库文件

$ make

编译成功后会在根目录下生成cjson.so动态库文件

gcc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include -fpic -o lua_cjson.o lua_cjson.c
lua_cjson.c:43:10: fatal error: lua.h: No such file or directory
   43 | #include <lua.h>
      |          ^~~~~~~
compilation terminated.
make: *** [Makefile:93: lua_cjson.o] Error 1

编译失败,问题出现在/usr/local/include目录下并没有lua.h头文件。

编译安装Lua

卸载使用apt安装的Lua

切换至root用户

$ sudo su root

自动移除所有不使用的软件包

$ apt autoremove

移除软件包和配置文件

$ apt-get purge lua5.3

检测是否具有损坏的依赖

$ apt-get check

清理下载文件归档

$ apt-get autoclean

手工编译安装Lua,进入Ubuntu根目录下的opt目录下,使用wget工具远程下载Lua5.4.3源码包。

$ cd /opt
$ wget http://www.lua.org/ftp/lua-5.4.3.tar.gz
$ tar -zxvf lua-5.4.3.tar.gz
$ mv lua-5.4.3 lua

编译Lua源文件

$ cd lua
$ make linux

编译成功后,进入Lua的src目录,查看Lua版本。

$ cd src
$ ./lua -v
Lua 5.4.3  Copyright (C) 1994-2021 Lua.org, PUC-Rio

在Lua的src目录中会发现存在lua.h头文件。

将编译好的Lua源码文件移动至/usr/local/src用户级源码目录下

$ mv /opt/lua /usr/local/src/lua

创建Lua的软连接,将其指向到/usr/bin目录下供管理员和一般用户使用。若已存在则先删除。

$ rm -rf /usr/bin/lua
$ ln -s /opt/lua/src/lua /usr/bin/lua
$ lua -v
Lua 5.4.3  Copyright (C) 1994-2021 Lua.org, PUC-Rio
$ whereis lua
lua: /usr/bin/lua

安装lua-cjson

远程下载lua-cjson到/usr/local/src目录下,解压后进入该目录。首先查看Makefile文件,修改其配置为当前安装的Lua位置。

$ cd lua-cjson
$ vim Makefile
LUA_VERSION =       5.4
TARGET =            cjson.so
PREFIX =            /usr/local/src/lua/src/
#CFLAGS =            -g -Wall -pedantic -fno-inline
CFLAGS =            -O3 -Wall -pedantic -DNDEBUG
CJSON_CFLAGS =      -fpic
CJSON_LDFLAGS =     -shared
LUA_INCLUDE_DIR =   $(PREFIX)
LUA_CMODULE_DIR =   $(PREFIX)
LUA_MODULE_DIR =    $(PREFIX)
LUA_BIN_DIR =       $(PREFIX)

然后在执行编译命令,即可成功生成cjson.so动态库文件。

$ make

将编译生成的cjson.so动态库文件复制到Skynet项目的luaclib文件夹内,即可使用cjson。

$ cp cjson.so /mnt/d/

使用

Skynet中配置文件若采用JSON字符串,此时就需要JSON序列化和反序列化操作。

例如:在项目的主配置文件中增加对MySQL主从配置,以JSON格式串作为配置。

$ vim conf/config

mysql_master = '{"host":"127.0.0.1", "port":3306, "user":"root", "password":"root", "database":"test"}'
mysql_slave = '[{"host":"127.0.0.1", "port":3306, "user":"root", "password":"root", "database":"test"}]'

在主入口服务脚本中读取JSON并反序列化

$ vim service/main.lua
local skynet = require "skynet"
local cjson = require "cjson"

skynet.start(function()
    skynet.error("skynet server start")
    -- 创建远程调试控制台服务
    local dcp = skynet.getenv("debug_console_port")
    if dcp then
        skynet.newservice("console")
        skynet.newservice("debug_console", "127.0.0.1", dcp)
    end

    -- 创建MySQL服务
    local mysql_master_config = cjson.decode(skynet.getenv("mysql_master"))
    local mysql_master = skynet.newservice("mysql", "master")
    skynet.call(mysql_master, "lua", "start", mysql_master_config, ".mysql_master")

    -- skynet.error(mysql_master_config)
end)

使用cjson.decode()函数从Skynet的环境配置中读取数据库配置并反序列化为table

`

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容