- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《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
%%%====
文档评论(0)