一、使用GIT安装 使用git下载skynet的编译源码
$ 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 #编译与平台相关的设置
1、执行编译
#编译
make linux
2、编译报错stdatomic.h
In file included from lstring.c:23:0:
../../skynet-src/atomic.h:33:23: fatal error: stdatomic.h: No such file or directory
#include <stdatomic.h>
^
compilation terminated.
make[4]: *** [lstring.o] Error 1
centOS系统自带的gcc版本4.8有BUG,更新gcc版本即可
# 查看版本呢
gcc --version
#我更新的是到9之上的gcc,大于等于4.9即可
sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc*
#启用
scl enable devtoolset-9 bash
重新编译
运行
#启动服务,启动成功编译完成
./skynet examples/config
二、安装lua-webclient(大批量http请求外部服务)
1、githuab下载webclient.c
GitHub - dpull/lua-webclient: Nonblocking lua http library.Nonblocking lua http library. Contribute to dpull/lua-webclient development by creating an account on GitHub.https://github.com/dpull/lua-webclient如果github打不开可以去码云搜索lua-webclient,可以找到webclient.c文件
复制C文件到 lualib-src 文件夹内,
2、配置Makefile文件
# 1、 54行 LUA_CLIB 中增加webclient扩展
LUA_CLIB = skynet \
client \
bson md5 sproto lpeg webclient $(TLS_MODULE)
# 2、 155 行增加扩展指向路径
$(LUA_CLIB_PATH)/webclient.so : lualib-src/webclient.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -Ilualib-src/webclient $^ -o $@ -lcurl
修改后文件为:
include platform.mk
LUA_CLIB_PATH ?= luaclib
CSERVICE_PATH ?= cservice
SKYNET_BUILD_PATH ?= .
CFLAGS = -g -O2 -Wall -I$(LUA_INC) $(MYCFLAGS)
# CFLAGS += -DUSE_PTHREAD_LOCK
# lua
LUA_STATICLIB := 3rd/lua/liblua.a
LUA_LIB ?= $(LUA_STATICLIB)
LUA_INC ?= 3rd/lua
$(LUA_STATICLIB) :
cd 3rd/lua && $(MAKE) CC='$(CC) -std=gnu99' $(PLAT)
# https : turn on TLS_MODULE to add https support
# TLS_MODULE=ltls
TLS_LIB=
TLS_INC=
# jemalloc
JEMALLOC_STATICLIB := 3rd/jemalloc/lib/libjemalloc_pic.a
JEMALLOC_INC := 3rd/jemalloc/include/jemalloc
all : jemalloc
.PHONY : jemalloc update3rd
MALLOC_STATICLIB := $(JEMALLOC_STATICLIB)
$(JEMALLOC_STATICLIB) : 3rd/jemalloc/Makefile
cd 3rd/jemalloc && $(MAKE) CC=$(CC)
3rd/jemalloc/autogen.sh :
git submodule update --init
3rd/jemalloc/Makefile : | 3rd/jemalloc/autogen.sh
cd 3rd/jemalloc && ./autogen.sh --with-jemalloc-prefix=je_ --enable-prof
jemalloc : $(MALLOC_STATICLIB)
update3rd :
rm -rf 3rd/jemalloc && git submodule update --init
# skynet
CSERVICE = snlua logger gate harbor
LUA_CLIB = skynet \
client \
bson md5 sproto lpeg webclient $(TLS_MODULE)
LUA_CLIB_SKYNET = \
lua-skynet.c lua-seri.c \
lua-socket.c \
lua-mongo.c \
lua-netpack.c \
lua-memory.c \
lua-multicast.c \
lua-cluster.c \
lua-crypt.c lsha1.c \
lua-sharedata.c \
lua-stm.c \
lua-debugchannel.c \
lua-datasheet.c \
lua-sharetable.c \
\
SKYNET_SRC = skynet_main.c skynet_handle.c skynet_module.c skynet_mq.c \
skynet_server.c skynet_start.c skynet_timer.c skynet_error.c \
skynet_harbor.c skynet_env.c skynet_monitor.c skynet_socket.c socket_server.c \
malloc_hook.c skynet_daemon.c skynet_log.c
all : \
$(SKYNET_BUILD_PATH)/skynet \
$(foreach v, $(CSERVICE), $(CSERVICE_PATH)/$(v).so) \
$(foreach v, $(LUA_CLIB), $(LUA_CLIB_PATH)/$(v).so)
$(SKYNET_BUILD_PATH)/skynet : $(foreach v, $(SKYNET_SRC), skynet-src/$(v)) $(LUA_LIB) $(MALLOC_STATICLIB)
$(CC) $(CFLAGS) -o $@ $^ -Iskynet-src -I$(JEMALLOC_INC) $(LDFLAGS) $(EXPORT) $(SKYNET_LIBS) $(SKYNET_DEFINES)
$(LUA_CLIB_PATH) :
mkdir $(LUA_CLIB_PATH)
$(CSERVICE_PATH) :
mkdir $(CSERVICE_PATH)
define CSERVICE_TEMP
$$(CSERVICE_PATH)/$(1).so : service-src/service_$(1).c | $$(CSERVICE_PATH)
$$(CC) $$(CFLAGS) $$(SHARED) $$< -o $$@ -Iskynet-src
endef
$(foreach v, $(CSERVICE), $(eval $(call CSERVICE_TEMP,$(v))))
$(LUA_CLIB_PATH)/skynet.so : $(addprefix lualib-src/,$(LUA_CLIB_SKYNET)) | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) $^ -o $@ -Iskynet-src -Iservice-src -Ilualib-src
$(LUA_CLIB_PATH)/bson.so : lualib-src/lua-bson.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -Iskynet-src $^ -o $@
$(LUA_CLIB_PATH)/md5.so : 3rd/lua-md5/md5.c 3rd/lua-md5/md5lib.c 3rd/lua-md5/compat-5.2.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -I3rd/lua-md5 $^ -o $@
$(LUA_CLIB_PATH)/client.so : lualib-src/lua-clientsocket.c lualib-src/lua-crypt.c lualib-src/lsha1.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) $^ -o $@ -lpthread
$(LUA_CLIB_PATH)/sproto.so : lualib-src/sproto/sproto.c lualib-src/sproto/lsproto.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -Ilualib-src/sproto $^ -o $@
$(LUA_CLIB_PATH)/webclient.so : lualib-src/webclient.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -Ilualib-src/webclient $^ -o $@ -lcurl
$(LUA_CLIB_PATH)/ltls.so : lualib-src/ltls.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -Iskynet-src -L$(TLS_LIB) -I$(TLS_INC) $^ -o $@ -lssl
$(LUA_CLIB_PATH)/lpeg.so : 3rd/lpeg/lpcap.c 3rd/lpeg/lpcode.c 3rd/lpeg/lpprint.c 3rd/lpeg/lptree.c 3rd/lpeg/lpvm.c 3rd/lpeg/lpcset.c | $(LUA_CLIB_PATH)
$(CC) $(CFLAGS) $(SHARED) -I3rd/lpeg $^ -o $@
clean :
rm -f $(SKYNET_BUILD_PATH)/skynet $(CSERVICE_PATH)/*.so $(LUA_CLIB_PATH)/*.so && \
rm -rf $(SKYNET_BUILD_PATH)/*.dSYM $(CSERVICE_PATH)/*.dSYM $(LUA_CLIB_PATH)/*.dSYM
cleanall: clean
ifneq (,$(wildcard 3rd/jemalloc/Makefile))
cd 3rd/jemalloc && $(MAKE) clean && rm Makefile
endif
cd 3rd/lua && $(MAKE) clean
rm -f $(LUA_STATICLIB)
重新编译
make linux
成功后luaclib下出现 webclient.so 文件可以使用
自定义文件看绑定资源:webclient.lua自定义使用该服务
3、使用HTTP请求
1、具体使用方法可查看github中lua-webclient文档
2、自己理解在绑定文件内有讲解
3、使用
local insertData = {
a=1,
b=2
};
local header = {
"a:1",
"b:2"
}
local res,data = skynet.call("http_client",'lua',"postbody","http://****/Index/test",json.tableTojson(insertData),header)
skynet.error(res,data)
三、protobuf安装和编译使用
1、pbc动态proto解析库编译
由于lua版本原生protobuf各种问题(听大佬说的,没有用过),使用风云大佬的pbc动态proto解析库,下载:
#使用git下载到linux服务器
git clone https://github.com/cloudwu/pbc.git
2、安装protoc编译器(后面编译都要用到,pbc也是依赖这个)
#查看是否已经安装过了
protoc --version
# --------------没有安装就安装下,安装3.*版本以上的,不再使用2.*的版本
#下载,可以使用码云的地址
git clone -b v3.21.10 https://github.com/protocolbuffers/protobuf.git
git clone -b v3.21.10 https://gitee.com/chooosky/protobuf.git
#进入克隆的目录,然后编译和安装 Protocol Buffers:
cd protobuf
./autogen.sh
./configure
#需要等会
make
sudo make install
#查看版本
protoc --version
出现了错误
protoc --version protoc: error while loading shared libraries: libprotobuf.so.31: cannot open shared object file: No such file or directory
##有时,您需要更新共享库缓存以使系统能够找到新安装的共享库文件。运行以下命令更新共享库缓存:
sudo ldconfig
再次查看版本
protoc --version
libprotoc 3.21.10
3、可以在pbc根目录下运行make指令编译项目(跟着做的,不知道作用):
[root@iZ2ze5ajstm9n1cpcc5cd2Z pbc]# make
mkdir -p build/o
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/context.o -MMD src/context.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/varint.o -MMD src/varint.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/array.o -MMD src/array.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/pattern.o -MMD src/pattern.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/register.o -MMD src/register.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/proto.o -MMD src/proto.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/map.o -MMD src/map.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/alloc.o -MMD src/alloc.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/rmessage.o -MMD src/rmessage.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/wmessage.o -MMD src/wmessage.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/bootstrap.o -MMD src/bootstrap.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/stringpool.o -MMD src/stringpool.c
gcc -O2 -fPIC -Wall -c -Isrc -I. -o build/o/decode.o -MMD src/decode.c
cd build && ar rc libpbc.a ../build/o/context.o ../build/o/varint.o ../build/o/array.o ../build/o/pattern.o ../build/o/register.o ../build/o/proto.o ../build/o/map.o ../build/o/alloc.o ../build/o/rmessage.o ../build/o/wmessage.o ../build/o/bootstrap.o ../build/o/stringpool.o ../build/o/decode.o
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o addressbook ../test/addressbook.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o pattern ../test/pattern.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o pbc ../test/pbc.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o float ../test/float.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o map ../test/map.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o test ../test/test.c -lpbc
cd build && gcc -O2 -fPIC -Wall -I.. -L. -o decode ../test/decode.c -lpbc
protoc -obuild/addressbook.pb test/addressbook.proto
protoc -obuild/descriptor.pb test/descriptor.proto
protoc -obuild/float.pb test/float.proto
protoc -obuild/test.pb test/test.proto
下面编译test的PD文件不用管,提示要加proto的头
4、生成动态编译文件protobuf.so文件和生成protobuf.lua文件
进入到pbc的目录
cd pbc/binding/lua53
正常直接make直接编译,但是我用的是新版本的skynet,带有的lua是5.4版本的,这个要求本地全局版本是5.3的,所以改下Makefile中lua的配置
CC = gcc
CFLAGS = -O2 -fPIC -Wall
# 更改这个配置,指向你自己的下载的skunet下的lua
LUADIR = /www/wwwroot/skynet/skynet/3rd/lua
TARGET = protobuf.so
SHARED = -shared
注意:和lua5.3同文件夹下的lua是要求5.1的不要使用
5、移动动态编译文件和lua进入到skynet项目内
#复制lua和so文件到skynet框架内,让skynet可以加载到(具体的加载可以看skynet启动配置,我没有改动)
[root@iZ lua53]# cp protobuf.lua /www/wwwroot/skynet/skynet/lualib
[root@iZ lua53]# cp protobuf.so /www/wwwroot/skynet/skynet/luaclib
# /www/wwwroot/skyent 这个是我的项目路径
6、创建一个proto文件
// 显示声明使用proto3; 否则使用默认的proto2
syntax = "proto3";
// 生成类的包名
package Message;
message Login {
string token = 1;
}
// 错误提示
message Error {
int32 type = 1;
string msg = 2;
}
#编译pb文件
protoc --descriptor_set_out Tao.pb Tao.proto
7、使用编译pd文件
local protobuf = require "protobuf"
protobuf.register_file "./proto/Game.pb"
local prolib = {}
---解密
---@param action any
---@param message any
---@return boolean|table
function prolib.decode(action,message)
return protobuf.decode(action,message)
end
---加密
---@param action any
---@param data any
---@return unknown
function prolib.encode(action,data)
return protobuf.encode(action,data)
end
local str = prolib.encode("Message.Error",{type=1,msg="测试"});
skynet.error(str);
local data = prolib.decode("Message.Error",str);
skynet.error(data,data.type,data.msg);