You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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指定固定范围)

测试跨节点调用

启动守护进程后,在另一终端启动测试节点并调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:06:23