Erlang分布式编程 #
一、分布式概述 #
Erlang内置分布式支持,允许多个节点之间透明通信。
1.1 特点 #
- 透明通信
- 位置透明
- 内置支持
- 安全机制
二、节点 #
2.1 启动节点 #
bash
erl -name node1@localhost
erl -sname node1
2.2 节点名 #
erlang
-module(node_info).
-export([demo/0]).
demo() ->
io:format("Node: ~p~n", [node()]),
io:format("Nodes: ~p~n", [nodes()]).
2.3 连接节点 #
erlang
-module(connect_nodes).
-export([demo/1]).
demo(Node) ->
case net_kernel:connect_node(Node) of
true -> io:format("Connected to ~p~n", [Node]);
false -> io:format("Failed to connect~n")
end.
三、分布式通信 #
3.1 发送消息 #
erlang
-module(dist_message).
-export([send/3]).
send(Node, Process, Msg) ->
{Process, Node} ! Msg.
3.2 远程spawn #
erlang
-module(dist_spawn).
-export([remote_spawn/2]).
remote_spawn(Node, Fun) ->
spawn(Node, Fun).
3.3 远程调用 #
erlang
-module(dist_rpc).
-export([call/3]).
call(Node, Module, Function) ->
rpc:call(Node, Module, Function, []).
四、分布式应用 #
4.1 分布式服务器 #
erlang
-module(dist_server).
-export([start/0, start/1, loop/0]).
start() ->
spawn(?MODULE, loop, []).
start(Node) ->
spawn(Node, ?MODULE, loop, []).
loop() ->
receive
{request, From, Msg} ->
From ! {response, Msg},
loop();
stop -> ok
end.
4.2 分布式注册 #
erlang
-module(dist_register).
-export([start/0, call/1]).
start() ->
Pid = spawn(fun() -> loop() end),
global:register_name(my_server, Pid).
call(Msg) ->
global:whereis_name(my_server) ! {request, self(), Msg},
receive
{response, Response} -> Response
after 5000 -> timeout
end.
loop() ->
receive
{request, From, Msg} ->
From ! {response, Msg},
loop()
end.
五、Cookie安全 #
5.1 设置Cookie #
bash
erl -name node1@localhost -setcookie mycookie
5.2 代码中设置 #
erlang
erlang:set_cookie(node(), mycookie).
六、最佳实践 #
6.1 使用global注册 #
erlang
global:register_name(Name, Pid).
global:whereis_name(Name).
global:unregister_name(Name).
6.2 使用rpc模块 #
erlang
rpc:call(Node, Module, Function, Args).
rpc:cast(Node, Module, Function, Args).
七、总结 #
本章学习了:
- 分布式概述
- 节点操作
- 分布式通信
- 分布式应用
- Cookie安全
- 最佳实践
最后更新:2026-03-27