首页 > 代码库 > Erlang--分布式编程

Erlang--分布式编程

(一)分布式编程:

    1、基本概念:

            1、分布式编程:通过网络间的消息传递,来协调不同机器,从而共同完成一个任务。

            2、节点          :一个分布式系统中的一个需要被协调,并且独立的系统

            3、Erlang的分布式:

                    1、分布式Erlang

                    2、基于套接字的分布式模型

    2、分布式Erlang:

        1、cookie保护系统:  只有cookie相同的机器间,才能通信

        2、设置cookie:

                1、在文件$HOME/.erlang.cookie, 将这个文件中的字符串,复制到其它节点上去

                2、启动erlang时,用命令行参数"-setcookie XXXX", 将cookie设置为XXXX

                3、内置函数erlang:set_cookie(node(), XXXX),  将node()的cookie设置为XXXX

        3、分布式Erlang的特点:

                1、cookie只用来初始认证,其它时刻的会话都是未加密的

                2、适合运行在一个可信任的环境中

        4、分布式编程的库和内置函数:

            1、库:

                    1、rpc, 提供了远程调用服务

                    2、global, 提供分布式里的注册和加锁,以及维护一个全连接网络

            2、内置函数(BIF):

                    1、spawn(node, Fun)

                    2、spawn(node, Mod, Func, Args)

                    3、spawn_link(node, Mod, Func, Args)

                    4、spawn_link(node, Fun)

                    5、disconnect_node(node)

                    6、monitor_node(node, flag)

                    7、node(),  返回本地节点名字,如果不是分布式,返回nonode@nohost

                    8、nodes(), 返回一个列表,表示所有与本机相连的node

                    9、is_alive(), 判断本地节点是否活动

            3、分布式Erlang的例子:

    demo.erl         

-module(demo).
-export([rpc/4, start/1]).
start(Node) ->
    spawn(Node, fun() -> loop() end).
rpc(Pid, M, F, A) ->
    Pid ! {rpc, self(), M, F, A},
    receive
        {Pid, Response} ->
            Response
    end.
loop() ->
    receive
        {rpc, Pid, M, F, A} ->
            Pid ! {self(), (catch apply(M, F, A))},
            loop()
    end.

运行步骤:

        1、在一台机器上A运行  :erl -sname aa -setcookie abc

        2、在另一台机器B上运行:  erl -sname bb -setcookie abc

        3、在A机器上运行        :

                1、Pid = demo:start(‘bb@192.168.100.1‘).

                2、demo:rpc(Pid, erlang, node, []).

    3、基于套接字的分布式Erlang:

        1、在《Erlang程序设计(第二版)》中有一个lib_chan的例子:

                 1、思路:

                            1、通过Socket建立连接

                            2、因为套接字进程(如果某一个进程创建了一个通信Socket,那么当Socket有数据到达时,该进程

                                 就会收到数据), 所以当两台连接后,就把套接字进程作为中间人,如果需要把消息发往另一个

                                节点,就向该中间人发送数据,此时中间人就是另一个节点的代表,但其它在中间人的内部实现

                                ,就是一个转发的功能,将接受到的数据转发到另一个节点,因为中间人是一个进程,所以就将

                                两个节点的通信转换成两个进程间的通信,因为进程间的通信比较方便,而且也是基于TCP的,

                                所以其安全性、稳定性也得到了保证

                   2、图示:

 




Erlang--分布式编程