如何用rebar3 release将gen_server部署为独立Erlang节点?
Rebar3项目配置:GenServer守护进程节点运行与跨节点通信
一、让应用承载GenServer
要让GenServer随应用启动自动运行,需完成以下配置:
1. 修改应用资源文件 src/myapp.app.src
更新modules字段添加GenServer模块,指定应用启动模块,并可提前注册进程名方便跨节点调用:
{application, myapp, [{description, "My Erlang Application"}, {vsn, "0.1.0"}, {modules, [myapp_app, my_gen_server]}, {registered, [my_gen_server]}, % 注册GenServer进程名,无需传递PID即可调用 {applications, [kernel, stdlib]}, {mod, {myapp_app, []}}, {env, []} ]}.
2. 实现应用启动模块 src/myapp_app.erl
该模块负责启动应用时初始化GenServer,推荐通过监督树管理以提升健壮性:
-module(myapp_app). -behaviour(application). -export([start/2, stop/1]). start(_StartType, _StartArgs) -> % 启动GenServer并绑定到注册名my_gen_server gen_server:start({local, my_gen_server}, my_gen_server, [], []), % 若需容错,可创建监督者模块(如myapp_sup)将GenServer纳入监督树 {ok, self()}. stop(_State) -> ok.
二、生成支持守护进程的Release
Rebar3的release命令默认生成的发布包支持daemon模式,直接执行编译:
$ rebar3 release
发布包位于_build/prod/rel/myapp/,以守护进程启动节点(需指定节点名用于跨节点通信):
_build/prod/rel/myapp/bin/myapp daemon --setcookie biscuit --name myapp@your-hostname
同一机器可用
--sname指定短节点名,跨机器需用--name指定包含主机名/IP的全节点名。
三、跨节点通信配置
要实现跨节点调用,需满足两个核心条件:
1. 统一节点Cookie
所有互通节点必须使用相同的Cookie,启动时通过--setcookie指定,也可配置到config/sys.config避免手动输入:
% config/sys.config [{kernel, [{distributed_cookie, biscuit}]}].
2. 节点可互相访问
- 同一机器:使用
--sname即可,节点名格式如myapp@localhost - 跨机器:
- 确保主机名/IP可互相解析(修改
/etc/hosts或配置DNS) - 启动节点时用
--name指定全节点名(如myapp@192.168.1.100) - 防火墙开放Erlang分布式端口(默认4369,可通过
inet_dist_listen_min/inet_dist_listen_max指定固定范围)
- 确保主机名/IP可互相解析(修改
测试跨节点调用
启动守护进程后,在另一终端启动测试节点并调用GenServer:
$ erl --name test@your-hostname --setcookie biscuit
1> gen_server:call({my_gen_server, myapp@your-hostname}, test). response
若已配置
registered且节点互通,可直接用gen_server:call(my_gen_server, test),Erlang会自动解析远程注册进程。
内容的提问来源于stack exchange,提问作者radrow
相关产品推荐
相关产品推荐

