erlang远程调用示例

简介:

下面的例子试用了erlang的分布式编程,从中可以看出像erlang这种基于消息的纯函数语言在分布式编程中的强大威力.

简单例子


在远程节点编写一个测试的模块


-module(distribution).
-export([a/0]).

a() ->
    hello.




首先启动远程节点,并设置cookie,载入模块


$ erl -name remote -setcookie abc

Erlang R16B03 (erts-5.10.4) [source] [64-bit] [async-threads:10] [kernel-poll:false]





Eshell V5.10.4  (abort with ^G)

(remote@example.com)1> c(distribution).


启动本地节点,设置同样的cookie


$ erl -name client@192.168.1.156 -setcookie abc
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
(client@192.168.1.156)1> rpc:call('remote@example.com',distribution,a,[]).
hello


要点

1.本地的长name,不能只写client,需要加上地址


复杂一点的例子


编写一个模块


-module(remote_local).
-export([start/1,echo/2]).


start(Node)-> spawn(Node,fun()->loop() end).

loop()->
    receive
    {From,Request}->
        From!{self(),Request},
        loop()
    end.

echo(Pid,Request)->
    Pid!{self(),Request},
    receive
    {Pid,Response}->
        Response
    end.


查看远端的cookie

$ cat ~/.erlang.cookie
FELWZVCNJEFSIMPPRBD   


设置本地cookie和远端一样,并注意文件方法权限


apple@apple-System:~/erlang$ ll ~/.erlang.cookie
-r-------- 1 apple apple 20  1月  4 00:00 /home/apple/.erlang.cookie
apple@apple-System:~/erlang$ chmod 755 ~/.erlang.cookie
apple@apple-System:~/erlang$ echo FELWZVCNJEFSIMPPRBDI>~/.erlang.cookie
apple@apple-System:~/erlang$ chmod 400 ~/.erlang.cookie
apple@apple-System:~/erlang$ ll ~/.erlang.cookie
-r-------- 1 apple apple 21  1月  5 03:17 /home/apple/.erlang.cookie


启动远端节点,并载入模块


apple@example:~/erlang$ erl -name gandalf
Erlang R16B03 (erts-5.10.4) [source] [64-bit] [async-threads:10] [kernel-poll:false]

Eshell V5.10.4  (abort with ^G)
(gandalf@example.com)1> c(remote_local).
{ok,remote_local}


启动本地节点载入模块,测试


apple@apple-System:~/erlang$ erl -name bilbo@192.168.1.153
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
(bilbo@192.168.1.153)1> c(remote_local).          
{ok,remote_local}
(bilbo@192.168.1.153)2> Pid=remote_local:start('gandalf@example.com').
<9747.49.0>
(bilbo@192.168.1.153)3> remote_local:echo(Pid,hello).
hello
(bilbo@192.168.1.153)4> remote_local:echo(Pid,hi).     
hi
(bilbo@192.168.1.153)5>












目录
相关文章
|
编解码 中间件 Go
Go语言学习 - RPC篇:gRPC拦截器剖析
我们在前几讲提到过,优秀的RPC框架都提供了`middleware`的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力: 1. gRPC中的`ServerOption`,是所有gRPC+HTTP都会被处理 2. gRPC-Gateway中的`ServeMuxOption`,只有HTTP协议会被处理 今天,我们先关注共同部分的`ServerOption`,它提供的能力最为全面,让我们一起了解下。
91 0
|
消息中间件 人工智能 移动开发
阿里云Rocket MQ PHP Http SDK发送消息示例Demo
消息队列 RocketMQ 版支持 RESTful 风格的 HTTP 协议通信,并提供了以下 7 种语言的 SDK,下面以最新的PHP Http SDK为范例介绍RocketMQ消息的发送。
2942 0
阿里云Rocket MQ PHP Http SDK发送消息示例Demo
|
7月前
|
Go
Go语言RPC实战:打造自己的远程调用服务
Go语言RPC实战:打造自己的远程调用服务
154 0
|
7月前
|
消息中间件 Kafka Python
python-kafka客户端封装
python-kafka客户端封装
89 0
|
消息中间件 JSON API
使用 REST API 操作 RabbitMQ(一)
使用 REST API 操作 RabbitMQ
267 0
|
消息中间件 API 数据安全/隐私保护
使用 REST API 操作 RabbitMQ(二)
使用 REST API 操作 RabbitMQ
185 0
|
Go API 数据库
Go 微服务框架 go-micro 使用客户端 RPC 调用服务端方法返回 408 怎么解决?
Go 微服务框架 go-micro 使用客户端 RPC 调用服务端方法返回 408 怎么解决?
89 0
|
XML JSON 网络协议
Python RPC | 连载 01 - RPC
Python RPC | 连载 01 - RPC
Python RPC | 连载 01 - RPC
|
JavaScript 网络协议 PHP
PHP 远程调用以及RPC框架
PHP 远程调用以及RPC框架
369 0
|
负载均衡 程序员 Go
Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?
就是因为无法在同一个进程内,或者无法在同一个服务器上通过本地调用的方式实现我们的需求。 HTTP能满足需求但是不够高效,所以我们需要使用RPC。
180 0
Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?