Erlang中OTP
具有较高的生产效率,可以在短时间内交付产品级的系统;具有较高的稳定性,OTP能够对来自于行为本身提供很高的容错性,具有可拓展性,动态代码提升等属性。Erlang
Server 1:基本的服务器:
server1.erl:
-module(server1).
-author("chen").
%% API
-export([start/2, rpc/2]).
start(Name,Mod) ->
register(Name,spawn(fun()->loop(Name,Mod,Mod:init()) end)).
rpc(Name,Request) ->
Name ! {self(),Request},
receive
{Name,Response} ->Response
end.
loop(Name,Mod,State) ->
receive
{From,Request} ->
{Response,State1}=Mod:handle(Request,State),
From ! {Name,Response},
loop(Name,Mod,State1)
end.
name_server.erl :
-module(name_server).
-author("chen").
%% API
-export([add/2, find/1, init/0, handle/2]).
-import(server1,[rpc/2]).
%%客户端方法
add(Name,Place) -> rpc(name_server,{add,Name,Place}).
find(Name) -> rpc(name_server,{find,Name}).
%%回调方法
init() ->dict:new().
handle({add,Name,Place},Dict) -> {ok,dict:store(Name,Place,Dict)};
handle({find,Name},Dict) -> {dict:find(Name,Dict),Dict}.
在server1.erl中回调的模块作为它的参数,在name_server.erl中既可以被服务器充当调用的回调模块,也可以被客户端调用。
运行结果:
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit:ns]
Eshell V14.0.2 (press Ctrl+G to abort, type help(). for help)
1> server1:start(name_server,name_server).
true
2> name_server:add(tom,"at home").
ok
3> name_server:find(tom).
{ok,"at home"}
Server 2:实现事务的服务器
server2.erl
-module(server2).
-author("chen").
%% API
-export([]).
-export([start/2, rpc/2]).
start(Name,Mod) ->
register(Name,spawn(fun()->loop(Name,Mod,Mod:init()) end)).
rpc(Name,Request) ->
Name ! {self(),Request},
receive
{Name,crash} ->exit(rpc);
{Name,ok,Response}->Response
end.
loop(Name,Mod,OldState) ->
receive
{From,Request}->
try
Mod:handle(Request,OldState) of
{Response,NewState}->
From ! {Name,ok,Response},
loop(Name,Mod,NewState)
catch
_:Why ->
log_the_error(Name,Request,Why),
From ! {Name,crash},
loop(Name,Mod,OldState)
end
end.
log_the_error(Name,Request,Why)->
io:format("Server ~p request ~p ~n""caused exception ~p ~n",[Name,Request,Why]).
server2.erl中在处理函数时如果抛出错误时会使用State的初始状态使循环继续,当函数处理成功时,会使用函数提供的NewState来继续循环;当函数处理失败时,服务器会向客户端发送消息使其崩溃,其他的客户端则不受影响。