如何通过本地网络连接两个Elixir节点?

Cha*_*fen 51 elixir

如何通过网络连接连接两台不同机器的两个Erlang/Elixir节点?

Ric*_*tti 63

您必须为节点命名并在两个节点上使用相同的cookie.

在机器1中:

iex --name node1@machine1.com --cookie a_cookie_string
Run Code Online (Sandbox Code Playgroud)

在机器2中:

iex --name node2@machine2.com --cookie a_cookie_string
Run Code Online (Sandbox Code Playgroud)

现在两台机器可以通信.要测试它,你可以在machine1上做这样的事情:

iex(node1@machine1.com)1> Node.connect :"node2@machine2.com"
true

iex(node1@machine1.com)2> print_node_name = fn -> IO.puts Node.self end
#Function<erl_eval.20.80484245>

iex(node1@machine1.com)3> Node.spawn(:"node2@machine2.com", print_node_name)
node2@machine2.com
#PID<7789.49.0> 
Run Code Online (Sandbox Code Playgroud)

域名machine1.commachine2.com可以与机器的IP地址也被改变.

  • BTW:只要域名部分不同,节点名称就可以在`@`符号之前相同(名称在网络中必须是唯一的,所以如果你使用的是你的机器的IP地址,那么它是唯一的部分) .示例:`node @ 192.168.0.2`和`node @ 192.168.0.3`也正在运行.(刚才提到可能会简化与机器/节点名称相关的代码.) (2认同)

adi*_*yah 5

如果您尝试通过代码连接节点:您需要将正在运行的代码转换为分布式节点。为了做到这一点,运行Node.start(:fullNameOfServer)

例如:如果您的 IP 是 192.168.0.1,您可以拥有完整的节点名称,例如:"foo@192.168.0.1"

将节点转变为分布式节点后,您可以设置 cookie: Node.set_cookie :cookie_name

最后,您需要与远程节点建立连接。(您还需要在远程节点上执行 Node.start 和 Node.set_cookie)为此,您需要远程节点的名称。让我们假设远程节点的名称是 bar@192.168.0.2(假设该节点是同一本地网络上的另一台计算机)。执行此操作的代码看起来像Node.connect :"bar@192.168.0.2"

您现在可以运行 Node.list 以查看bar@192.168.0.2可用的内容foo@192.168.0.1,反之亦然。

总结以上几点,您的代码应该类似于

在 Foo 机器上

Node.start :"foo@192.168.0.1" #this is the IP of the machine on which you run the code
Node.set_cookie :cookie_name
Node.connect "bar@192.168.0.2"
Run Code Online (Sandbox Code Playgroud)

在酒吧机上

Node.start :"bar@192.168.0.2" 
Node.set_cookie :cookie_name
Run Code Online (Sandbox Code Playgroud)