esockd网络库的来源是:https://github.com/emqtt/esockd,这里使用的是V4.2版本。
来自作者对该网络库的自我评价:
版本功能:
1. 异步非阻塞TCP/SSL Socket服务器框架
2. 支持Acceptor池与异步Accept
3. 支持最大连接数管理
Q: 为什么不用Ranch?
A: 如果你深入理解下Erlang的TCP服务器结构,比如inet httpd、rabbitmq、ejabberd,就知道Ranch框架不及格。比如两次controlling_proccess,SSL握手阻塞Acceptor,连接Supervisor和最大连接控制都写得如屎。
当然,eSockd也可能如屎一般,但目前是我尽了很大努力拉出来的了...
从https://github.com/rebar/rebar/wiki/rebar下载已经编译好的执行文件rebar,Linux环境使用。然后放入工程路径,最终工程文件夹情况如图所示:
其中的deps,doc,ebin文件夹都是后续生成的,rel文件夹是手动创建的。完整的实施过程如下:
1、修改rebar.config如下:
{deps, [{gen_logger,".*",{git,"https://github.com/emqtt/gen_logger.git",""}}]}.
{erl_opts, [debug_info,{parse_transform,lager_transform}]}.
{sub_dirs, ["rel"]}.
2、esockd-4.2路径下执行终端命令
查看rebar的版本
[root@localhost esockd-4.2]# ./rebar -V
生成应用文档
[root@localhost esockd-4.2]# ./rebar doc
获得依赖文件
[root@localhost esockd-4.2]# ./rebar get-deps
编译
[root@localhost esockd-4.2]# ./rebar compile
3、进入rel文件夹执行
[root@localhost rel]# ../rebar create-node nodeid=esockd
会自动生成文件reltool.config,手动修改如下:
%% -*- mode: erlang -*-
%% ex: ft=erlang
{sys, [
{lib_dirs, ["../deps"]},%%指出应用依赖库的路径,如果没有依赖库则留空{lib_dirs, []}
{erts, [{mod_cond, derived}, {app_file, strip}]},
{app_file, strip},
{rel, "esockd", "1",
[
kernel,
stdlib,
sasl,
goldrush,%%指出需要自动启动的应用
lager,
gen_logger,
esockd
]},
{rel, "start_clean", "",
[
kernel,
stdlib
]},
{boot_rel, "esockd"},
{profile, embedded},
{incl_cond, derived},
{excl_archive_filters, [".*"]}, %% Do not archive built libs
{excl_sys_filters, ["^bin/(?!start_clean.boot)",
"^erts.*/bin/(dialyzer|typer)",
"^erts.*/(doc|info|include|lib|man|src)"]},
{excl_app_filters, ["\.gitignore"]},
{app, kernel, [{incl_cond, include}]}, %%这段有人建议要有,要求把每个依赖的工程标明。但是我实测没有也行,一样发布成功。
{app, stdlib, [{incl_cond, include}]},
{app, sasl, [{incl_cond, include}]},
{app, goldrush, [{incl_cond, include}]},
{app, lager, [{incl_cond, include}]},
{app, gen_logger, [{incl_cond, include}]},
{app, esockd, [{mod_cond, app}, {incl_cond, include}, {lib_dir, ".."}]} %%指出应用的路径
]}.
{target_dir, "esockd"}.
{overlay, [
{mkdir, "log/sasl"},
{copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
{copy, "files/nodetool", "releases/\{\{rel_vsn\}\}/nodetool"},
{copy, "esockd/bin/start_clean.boot",
"\{\{erts_vsn\}\}/bin/start_clean.boot"},
{copy, "files/esockd", "bin/esockd"},
{copy, "files/esockd.cmd", "bin/esockd.cmd"},
{copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
%% Following line may be safely removed in new projects
{copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"},
{copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
{copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
]}.
4、又回到esockd-4.2路径执行,发布应用
[root@localhost esockd-4.2]# ./rebar generate
5、生成结果文件的路径:
可执行文件
/home/firecat/Prj/esockd-4.2/rel/esockd/bin
日志文件
/home/firecat/Prj/esockd-4.2/rel/esockd/log
虚拟机文件
/home/firecat/Prj/esockd-4.2/rel/esockd/releases/1/vm.args
我这里把vm.args节点修改为局域网IP地址
## Name of the node
#-name esockd@127.0.0.1
-name esockd@172.16.6.147
6、调试测试:
[root@localhost bin]# ulimit -n 100000 %%修改可建立的Linux socket上限值
[root@localhost bin]# ./esockd console%%控制台运行
Eshell V8.3 (abort with ^G)
(esockd@172.16.6.147)1> esockd:open(echo, 5000, [{sockopts, [binary, {reuseaddr, true}]}], {echo_server, start_link, []}).
echo listen on 0.0.0.0:5000 with 16 acceptors.
{ok,<0.1321.0>}
[root@localhost bin]# ./esockd start %%后台守护者进程运行
7、注:以上描述的方式仅仅是用来测试rebar工具和esockd网络库的使用。真正项目开发使用还是需要自己写app程序,把esockd作为第三方的依赖库使用。
{deps, [
{esockd, ".*", {git, "git://github.com/emqtt/esockd.git", {tag, "v4.2"}}}
]}.
详情且听下回分解:erlang高性能网络库esockd的编译和使用(二)
参考文献:
rebar进行项目部署和热更
使用rebar工具开发erlang工程项目和发布erlang工程项目
使用rebar生成erlang release 并进行热代码升级