《Erlang分布式编程》.docx
文本预览下载声明
Erlang分布式编程
文档版本跟踪
文档版本跟踪日期变更说明备注2014-11-23A Outline
A 1.1-1.22014-12-08A 1.32014-12-13A 2, 32014-12-14A 4, M参考文献说明:A(新增)、M(修改)、D(删除)
0范围
节点和通信
基本分布式编程模块
empd进程
套接字编程
1 Erlang节点和通信
1.1节点
一个Erlang节点是已命名的(named)的正在运行的Erlang运行时系统(erts)。
多个节点可以运行在一台机器上,也可以运行在不同的机器上。之前的顺序编程、并发编程中示例实际上是在一个Erlang节点上运行的。
存活节点/可命名的节点:如果一个节点可以与其他节点通信。任何存活的节点都需要命名,命名有两种方式:
(1)短名字 erl -sname sname
sname在局域网中命名一个主机,已name@host给出,例:foo@zhoujiagen
(2)长名字 erl -name name
name给出完整的主机IP地址,可以是foo@192.168.1.103,或foo@zhoujiagen(可DNS解析的主机名)。
长名字节点只能与长名字节点通信,短名字节点只能与短名字节点通信。
节点启动和信息
erl -[s]name nodeName
命名节点方式启动
net_kernel:start([‘foo@zhoujiagen’]).
启动节点
net_kernel:stop().
停止当前节点
node().
查看当前节点
elrang:is_alive().
当前节点是否存活
1.2 节点通信
节点连通性测试
net_adm:ping(‘bar@zhoujiagen’).
pang:不连通,pong:连通。
Cookie
每个节点在任意时刻只有一个cookie,共享同一值的节点可以通信。
启动时设置cookie
erl -sname foo -setcookie cookieValue
运行时设置cookie
erlang:set_cookie(node(), cookieValue).
局限性
分布式节点通过cookie与另一远程节点建立连接后,远程节点的拥有者获得本地节点运行者用户相同的权限。远程节点能够执行spawn(YourNode, os, cmd, [“rm -rf *”]).是任何人都不想看到的。故,cookie安全通信在封闭式系统中是足够的,但在开放式系统中需要融入其他的安全通信机制,可以考虑安全套接字等。
连接性建立和配置
只要分布式Erlang节点共享相同的cookie值,它们之间就可以通信。
Erlang运行时系统(erts)在第一次引用一个节点时,自动建立连接。自动建立连接可以是通过调用net_adm:ping/1或者发送一个消息到该节点注册的进程上来完成。
连接在一起的节点,信息是共享的,具有可传递性。
net_kernel进程
每个节点的net_kernel进程负责协调分布式Erlang节点之间的操作,例如:spawn/4会被net_kernel进程转换为消息发送到远程节点的net_kernel进程上、net_kernel进程处理cookie认证。很重要的一点:用户可以修改net_kernel进程以获得期望的行为。
自动建立的可传递的连接行为的覆盖方法有:使用net_kernel模块中的函数手动的控制连接、运行erl -connect_all false拒绝节点全局的相互连接。
隐藏节点
希望覆盖默认配置下所有节点互相连接行为,只在必要时建立与其他节点的连接的时候,可以考虑隐藏节点。
启动隐藏节点: erl -sname ‘nodeName’ -hidden。
手动建立节点连接:net_kernel:connect(NodeName).。
nodes/0不会返回隐藏节点,nodes(hidden)返回隐藏节点,nodes(connected)返回隐藏节点和非隐藏节点。
1.3 远程过程调用与本地调用的区别
?Sample: facserver/facclient[1]
facserver.erl
-module(facserver).
%% API
-export([start/0]).
%%%===================================================================
%%% API
%%%====
显示全部