介绍:
如果我们想以长连接的形式改进skynet服务器和客户端之间的连接,并选择Google的Protobuf来定制我们的网络合约,那么接下来我们要解决的问题就是:如何在skynet框架中使用socket+原型缓冲区。
蜜蜂
几种常用的skynet套接字:
* 输出错误信息: skynet.error(...)
* 获取本地服务句柄方式: skynet.localname(...)
* 设置定时器方式: skynet.timeout(...)
* skynet强制退出方式: skyname.abort()
* 服务开始方式: skynet.start(...)
* 服务注销方式: skynet.exit()
* 发送原始文本消息方式: skynet.core.send(...)
protobuf在skynet中的使用:
由于lua版本的protobuf支持存在一些缺陷,为了防止踩坑,这里直接使用云峰博客推荐的pbc动态proto解析库。
下载:
下载pbc:和下载skynet源码一样编译lua源码,通过git将pbc源码clone到本地:
bogon:project linshuhe$ git clone https://github.com/cloudwu/pbc.git
Cloning into 'pbc'...
remote: Counting objects: 1156, done.
remote: Total 1156 (delta 0), reused 0 (delta 0), pack-reused 1156
Receiving objects: 100% (1156/1156), 302.95 KiB | 310.00 KiB/s, done.
Resolving deltas: 100% (682/682), done.
Checking connectivity... done.
编译并合并到项目中:
项目编译:
可以在pbc根目录下执行make命令来编译工程:
linsh@ubuntu:/application/pbc$ sudo make
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
如果编译结果报错:
make: protoc:命令未找到
make: *** [build/addressbook.pb] 错误 127
这是因为当前环境还没有安装protobuf。 安装步骤如下:
安装命令:
sudo apt-get install protobuf-c-compiler protobuf-compiler 1
查询版本验证完成:
linsh@ubuntu:/application/pbc$ protoc --version libprotoc 2.5.0 12
我想给大家推荐一个关于天网项目实战的训练营。 现在可以免费申请考试。 (后台私信“天网”获取地址)讲座内容:
多核并发编程
消息队列.线程池
演员消息调度
网络模块实现
时间轮定时器的实现
lua/c/接口编程
天网编程要点
demo展示了actor编程思维
更多skynet及c/c++ linux服务器开发资料加群:812855908免费分发!
(包括C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK、ffmpeg等)
工具编译:
使用终端进入pbc项目pbc/binding/lua53目录,编译protobuf.so:
cd pbc/binding/lua
sudo make
如果编译成功,将protobuf.so放到配置文件中lua_cpath项配置的目录下,将protobuf.lua放到配置文件中lua_path项配置的目录下,然后就可以调用库方法了原型缓冲区。 我当前项目中这两项的配置如下:
lua_path = root.."lualib/?.lua;"..root.."lualib/?/init.lua"
lua_cpath = root .. "luaclib/?.so"
那么联通文件命令可以如下:
sudo cp protobuf.so /application/skynet/luaclib
sudo cp protobuf.lua /application/skynet/lualib
编译错误:
在pbc/binding/lua目录下编译,出现如下错误:
linsh@ubuntu:/application/pbc/binding/lua$ sudo make
gcc -O2 -fPIC -Wall -shared -o protobuf.so -I../.. -I/usr/local/include -L../../build pbc-lua.c -lpbc
pbc-lua.c:4:17: fatal error: lua.h: 没有那个文件或目录
#include "lua.h"
^
compilation terminated.
make: *** [protobuf.so] 错误 1
错误原因:由于这里没有安装lua5.3,所以不能是lua5.2或者lua5.1等低版本,否则会报错。 因为pbc使用了lua_rotate,它是lua5.3的新类型。
解决方法:安装lua5.3即可解决,步骤如下:
去lua官网下载lua5.3的安装包:
lua-5.3.0.tar.gz
您还可以使用命令行下载工具axel:
linsh@ubuntu:/application/pbc/binding$ sudo axel http://www.lua.org/ftp/lua-5.3.0.tar.gz
初始化下载: http://www.lua.org/ftp/lua-5.3.0.tar.gz
File size: 278045 bytes
打开输出文件 lua-5.3.0.tar.gz
开始下载
[ 0%] .......... .......... .......... .......... .......... [ 53.8KB/s]
[ 18%] .......... .......... .......... .......... .......... [ 73.1KB/s]
[ 36%] .......... .......... .......... .......... ....
连接 3 结束
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,...... [ 96.9KB/s]
[ 55%] .......... .......... .......... .......... .......... [ 92.5KB/s]
[ 73%] .......... .......... .......... ......
连接 0 结束
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,.... ........
连接 1 结束
,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,.. [ 80.5KB/s]
[ 92%] .......... .......... .
271.5 千字节 已下载,用时 6 秒。(43.52 千字节/秒)
使用压缩包解压安装:
首先将下载的文件复制到usr/local/src目录下
sudo cp lua-5.3.0.tar.gz /usr/local/src
依次执行以下命令:
sudo tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0/
sudo make linux test
创建软链接,以便当前环境下任何地方都可以使用lua:
sudo ln -s /usr/local/src/lua-5.3.0/src/lua /usr/bin/lua
测试软连接是否成功:
linsh@ubuntu:/usr/local/src/lua-5.3.0/src$ lua
程序 'lua' 已包含在下列软件包中:
* lua5.2
* lua5.1
* lua50
请尝试:sudo apt-get install
我也出现了这个问题,最后发现原因是因为我在添加软链接的时候把第一个地址(lua安装地址)/usr/local/src/lua-5.3.0/src/lua写入了/usr/ local/src/lua5.3.0/src/lua,解决问题可以看到:
linsh@ubuntu:/usr/bin$ lua
Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio
>
修改pbc/binding/lua/Makefile中lua库的地址配置信息LUADIR为当前lua安装的地址:
LUADIR = /usr/local/src/lua-5.3.0/src 1
再次运行编译命令,查询当前目录下文件的变化:
linsh@ubuntu:/application/pbc/binding/lua$ sudo make
gcc -O2 -fPIC -Wall -shared -o protobuf.so -I../.. -I/usr/local/src/lua-5.3.0/src -L../../build pbc-lua.c -lpbc
linsh@ubuntu:/application/pbc/binding/lua$ ls
build_ios.sh Makefile parser.lua pbc-lua.c protobuf.lua protobuf.so README.md test2.lua test.lua testparser.lua
测试:
首先在项目根目录下创建一个protos文件夹用于存放合约文件,并创建一个Person.proto合约文件,内容如下:
sudo mkdir protos
cd protos
sudo vi Person.proto
协议文件内容如下:
package cs;
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
将合约文件转换为.pb格式:
linsh@ubuntu:/application/skynet/protos$ sudo protoc --descriptor_set_out Person.pb Person.proto
linsh@ubuntu:/application/skynet/protos$ ls
Person.pb Person.proto
目录下有对应的.pb文件。
在lua中注册对应的合约文件:
引入protobuf.lua:
local pb = require "protobuf" 1
注册.proto合约文件对应的.pb文件有两种方式:
方法一:直接注册文件:
pb.register_file "Person.pb"
方法二:通过io读取文件,然后获取文本内容进行注册:
file = io.open("Person.pb","rb")
buffer = file:read "*a"
file:close()
pb.register(buffer)
编码和解码是通过encode和decode两个socket实现的编译lua源码,完整的测试脚本:
local skynet = require "skynet"
local protobuf = require "protobuf"
skynet.start(function()
protobuf.register_file "./protos/Person.pb"
skynet.error("注册协议文件:Person.pb")
stringbuffer = protobuf.encode("cs.Person", {
name = "linsh",
id = 1,
})
local data = protobuf.decode("cs.Person",stringbuffer)
skynet.error("数据编码:name="..data.name..",id="..data.id)
end)
```
如果注册的合约文件依赖于其他合约文件,则必须先注册依赖的合约文件,否则会出现注册失败的错误
运行正确结果:
[:0100000c] 注册协议文件:Person.pb
[:0100000c] 数据编码:name=linsh,id=1
另外,云峰还定制了一套合约格式sproto,据说比protobuf更简单。
俗话说:“多才多艺”linux源码编译,即使你很少编译安装PHP等软件,而作为一名程序员,你仍然需要掌握这一点。 如果以后转入运维怎么办? 接下来就跟随小编一起来了解一下PHP编译安装吧!
php
环境及原材料:centos7.6+php7.2+swoole4.3(linux系统环境自行安装)
1.源码编译安装PHP7.2
第一步:下载PHP7.2源码(最好从PHP官网下载)
命令:wget
下载php源码包
php2.1源码包
第二步:解压下载的PHP源码包
命令:tarxvfphp-7.2.1.tar.gz
解压后的php文件
第三步:进入PHP源代码目录,开始编译步骤
在cdphp-7.2.1中,查看configure文件,该文件是编译前指定具体配置的命令,下面会用到
php源码包中的文件
编译之前可以使用./configure--help看看可以进行哪些配置
./配置--帮助
编译分为几个步骤:
1、编译前配置,这里配置php安装目录(前面可以添加参数配置其他配置项)
命令:./config --prefix=/usr/local/php21
./configure --prefix=/usr/local/php21
配置时检测结果
2.编译源码并使用make命令
编译源码make
编译成功
3、使用maketest命令排除故障
maketest故障排除流程
4. makeinstall 将编译好的文件安装到系统中
makeinstall 安装编译文件
5.将php.ini-development文件复制到/usr/local/php21/lib
命令:cpphp.ini-development/usr/local/php21/lib/php.ini
php.ini 文件
这样,PHP源码的编译安装就完成了,进入安装目录查看,cd /usr/local,看到php21就是安装的PHP
PHP安装目录
拿出来我们验证一下是否安装成功,命令 /usr/local/php21/bin/php -v
查看PHP版本,安装成功
可以将安装好的php添加到环境变量中,然后命令行使用就很方便了; 编辑vim/etc/profile文件linux源码编译,在文件末尾添加aliasphp21='/usr/local/php21/bin/php',保存退出,执行source/etc/profile即可生效。 然后直接执行php21 -v命令,如右图,说明成功:
添加环境变量php21-v后
至此,PHP的源码编译安装就已经完成了,接下来我们在此基础上编译安装swoole4。
2.源码编译安装swoole4
当然,编译安装和安装php类似,只是中间需要多做一步,使用php的config进行配置和安装。 我们上去看看
第一步:下载swoole4源码
命令 wget
下载swoole源码
swoole源码包
第二步:解压swoole源码包
命令:tarxzvfv4.3.5.tar.gz
swoole源码解压包
swoole源代码文件
第三步:在swoole源码目录下使用phpize生成并编译swoole扩展配置文件
命令:/usr/local/php21/bin/phpize(该命令是PHP专门用来安装扩展的)
phpize 生成配置
phpize后的源代码文件
现在源代码文件中已经包含了configure文件,接下来的安装就和正常编译基本一样了。
第四步:编译安装swoole
1.加载php配置php-config
命令:./configure --with-php-config=/usr/local/php21/bin/php-config
./configure --with-php-config
2.make编译源代码
make编译源代码
编译结果
3.maketest故障排除
进行测试故障排除
4. makeinstall 将编译好的文件安装到系统中
makeinstall安装结果
进入/usr/local/php21/lib/php/extensions/no-debug-non-zts-20170718/目录查看生成的swoole.so文件,swoole编译安装成功
swoole.so 扩展
5.编辑php.ini文件,添加一行extension=swoole.so
添加扩展名=swoole.so
6.验证swoole安装成功,php21 -m 检查扩展中是否有swoole
php -m 检查swoole是否加载成功
至此,我们的swoole源码编译安装成功。 接下来我们可以写一个程序来看看php+swoole的运行情况。
3.php+swoole程序验证
1.新建php文件vimhttpServer.php,编译以下代码,保存退出。