skynet安装和配置

一、使用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.icon-default.png?t=N7T8https://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);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值