erlang高性能网络库esockd的编译和使用(一)

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 并进行热代码升级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值