- 浏览: 337732 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
litaocheng@gmail.com |
2009-3-1 |
0.2 |
tiny OTP Application
为了简单,我们创建一个超级简单的application, 其只有一个module, 其不使用supervisor, 只创建一个简单的process, 我们为这个应用名叫:tinyapp (tinyapp-1.0).
其代码如下(tiny.erl):
-module(tiny). -behaviour(application). -export([start/2, stop/1]). start(_Type, _Args) -> start_process(). stop(_State) -> ok. start_process() -> FLoop = fun() -> Fun = fun(F) -> receive Msg -> io:format("receive msg:~p~n", [Msg]), F(F) after 1000 -> {ok, App} = application:get_application(self()), io:format(user, "~p 1.0 running...~n", [App]), F(F) end end, Fun(Fun) end, {ok, proc_lib:spawn_link(FLoop)}.
这个tiny.erl就是我们所有的application代码了.功能很简单就是定期打印 tiny_app running ... 信息.
请注意,这个程序并不是一个标准的Erlang OTP 应用. 因为其没有使用 supervisor , gen_server , gen_fsm , gen_event 等behavior. 在后面的部分,我们会对这个tiny app进行改造,升级.
然后我们定义application resource 文件(.app), tiny_app.app 文件内容如下:
{application, tiny_app, [{description, "tiny app"}, {vsn, "1.0"}, {modules, [tiny]}, {registered, []}, {applications, [kernel, stdlib, sasl]}, {mod, {tiny, []}} ] }.
好了,这两个文件就构成了我们的一个tiny application, 当然其内部实现可能不是很符合OTP, 但是无所谓了,我们今天的 目标是为OTP application创建installer.
我们的目录结构如下:
tiny-1.0/ |-- ebin/ |-- src/
编译tiny.erl, 将tiny.beam输出到ebin目录中, 当然有时间你可以写个Makefile, 我这里就不描述了,我们这个小应用还是很 容易编译的: $ erlc -o ../ebin tiny.erl
到这里,有必要看看我们的application是否可以正常运行, 进入erl shell:
[da66@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> application:start(tiny_app). ok 2> tiny_app version 1.0 live group leader:<0.33.0> tiny_app version 1.0 live group leader:<0.33.0> 3> application:which_applications(). [{tiny_app,"tiny app","1.0"}, {stdlib,"ERTS CXC 138 10","1.15.5"}, {kernel,"ERTS CXC 138 10","2.12.5"}] 4> application:stop(tiny_app). =INFO REPORT==== 2-Mar-2009::03:44:43 === application: tiny_app exited: stopped type: temporary ok
好的,一切正常, 我的application已经可以start, stop. 接下来要生成release了.
生成Release
参照 OTP Design Principles Releases 部分, 使用你喜欢的Editor定义release resource file(.rel) tiny-1.0.rel 其内容如下:
{release, {"tiny app release", "1.0"}, {erts, "5.6.5"}, [{kernel, "2.12.5"}, {stdlib, "1.15.5"}, {sasl, "2.1.5.4"}, {tiny_app, "1.0"} ]}.
rel文件中,指明Erlang Emulator的版本信息: erts 5.6.5(R12B-5). 我们将tiny-1.0.rel文件放在tiny-1.0目录下:
tiny-1.0/ |-- ebin/ |-- src/ |-- tiny-1.0.rel
现在让我们使用sasl lib中的systools模块,根据rel文件,生成boot script和tar 运行如下:
[da66@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin/ Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> systools:make_script("tiny-1.0"). ok 2> systools:make_tar("tiny-1.0", [{erts, "/opt/local/lib/erlang/"}]). ok
查看我们的tiny-1.0目录下看多了什么东西:
[da6600a1@litaocheng ~/install/tiny-1.0]$ ls -p ebin/ tiny-1.0.boot tiny-1.0.script src/ tiny-1.0.rel tiny-1.0.tar.gz
恩,我们通过make_script生成了 tiny_app.boot和 tiny_app.script, 通过make_tar生成了tiny-1.0.tar.gz.
在生成tar时,通过指定erts选项,可以将当前的erts运行时,也会被包含到打包的文件中.这样即使被部署的机器 没有安装Erlang, 我们这个Relase包依旧可以运行.
此时,我们的tiny-1.0.tar.gz包含下面几个目录:
tiny-1.0.tar.gz -- |-- erts-5.6.5/ |-- lib/ | |-- kernel-2.12.5/ | |-- stdlib-1.15.5/ | |-- tiny_app-1.0/ |-- releases/
其中make_script及make_script有很多选项,我们可以根据需要进行设定.
有了这个Relase, 我们怎么使用它呢? 这里就要用到sasl lib了, 我们首先把这个tiny-1.0.tar.gz copy到 $ERL_ROOT/releases 目录中, 其中$ERL_ROOT是你的erlang安装 目录,我这里是/opt/local/lib/erlang.
随后我们运行命令:
erl 1> application:start(sasl) % first start sasl ok 2> release_handler:unpack_release("tiny-1.0"). {ok,"1.0"}
release_handler:unpack_release/1 的参数 Name , 对应releases目录下的 Name .tar.gz, 这里就是 tiny-1.0
通过上面的调用, tiny-1.0.tar.gz被解压,然后放置到$ERL_ROOT对应目录中:
$ERL_ROOT/lib 新增 tiny_app-1.0/ $ERL_ROOT/release 1.0/ 目录 $ERL_ROOT/release/RELEASES 文件被修改,添加tiny_app相关记录
恩, 这个过程其实归根结底,就是吧tiny_app-1.0放到了ERL_ROOT/lib目录,然后对ERL_ROOT/releases目录做了一些修改.
现在让我们重新启动erl, 随后, 你可以在任何目录运行tiny_app了.
- in erl shell > application:start(tiny_app).
- in linux shell $ erl -boot $ERL_ROOT/releases/1.0/start
说明:$ERL_ROOT/lib下的所有application路径都会加载到code中,所以通过第一种方式也可以方便的启动tiny_app 两种方式皆可.
上面解决了生成的release在本机运行的问题, 其实更多的时候,我们想将系统部署到一台"新"的机器中. 所以我们需要创建一个target system.
Target System
Target System的制作方法,请参考 Createing a First Target System . 这个target_system.erl中,根据rel文件,创建了script, boot以及tar, 也就是说,我们上一个章节的很多工作, 在这个module中都进行了处理. 我们对这个erl文件稍微进行一些改进, 加入一些传递给make_script和make_tar的参数. 改造后的文件可以从此下载: target_system.erl
在tiny-1.0.rel所在目录,运行target_system:create/1来创建target system:
[da6600a1@litaocheng ~/install/tiny-1.0]$ erl -pa ./ebin/ ../ Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> target_system:create("tiny-1.0"). Reading file: "tiny-1.0.rel" ... ...省略... Removing directory "tmp" ... ok
ok 表明生成成功; 如果发生错误, 请检查你的路径信息是否正确, 以及是否拥有创建文件相关权限.
好了一切正常,现在tiny-1.0目录下包含下面文件:
[da6600a1@litaocheng ~/install/tiny-1.0]$ ls -p ebin/ plain.script tiny-1.0.rel plain.boot src/ tiny-1.0.script plain.rel tiny-1.0.boot tiny-1.0.tar.gz
plain.* 系列文件启动时只加载kernel, stdlib两个lib, 没有包含我们的tiny_app,所以叫plain. 而tiny_app系列, 除却plain的项目,还包含了我们的tiny_app相关加载. 我们可以通过查看plain.script或tiny_app.script获取相关信息.
现在我们要安装target system了, 我们假设想安装在: /opt/local/tiny-1.0 目录.
这里有一个问题:如果目标机器没有安装erlang, 那么就不能使用target_system进行安装, 需要使用一段shell脚本进行安装, 主要就是解压文件, 随后替换路径从而完成安装. 这个小脚本随后会提供下载
执行下面命令:
[da6600a1@litaocheng ~/install/tiny-1.0]$ sudo erl -pa ../ Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> target_system:install("tiny-1.0", "/opt/local/tiny"). Extracting tiny-1.0.tar.gz ... Substituting in erl.src, start.src and start_erl.src to form erl, start and start_erl ... Creating the RELEASES file ... ok
恩,好的,现在在/opt/local/tiny目录下已经安装成功.
接下来让我们运行这个新部署的应用:
[da6600a1@litaocheng ~]$ /opt/local/tiny/bin/erl -boot /opt/local/tiny/releases/1.0/start Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> tiny_app 1.0 running...
不错,我们的tiny_app部署成功, 下面的部分我们要讲述更加激动人心的部分, 关于应用的热升级及回退.
- target_system.zip (2.4 KB)
- 下载次数: 134
- tiny-1.0.zip (2.3 KB)
- 下载次数: 120
评论
收益非浅。
另外补充一条,可能新手会有疑问。
将作者这句
erl -pa ./ebin/
换成这个
erl -boot start_sasl -pa ./ebin
以防止,sasl没有默认加载。
提醒下 sasl无需-boot start_sasl
{release, {"tiny app release", "1.0"}, {erts, "5.6.5"},
[{kernel, "2.12.5"},
{stdlib, "1.15.5"},
{sasl, "2.1.5.4"},
{tiny_app, "1.0"}
]}.
因为在 启动tiny_app之前 已经先启动了sasl 2.1.5.4
收益非浅。
另外补充一条,可能新手会有疑问。
将作者这句
erl -pa ./ebin/
换成这个
erl -boot start_sasl -pa ./ebin
以防止,sasl没有默认加载。
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5323平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7682项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21917本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4603inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10745Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3738Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2996今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 4017经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5809最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5103因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3777从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6412说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6400好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3709前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3365好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9592Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6200Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5299并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3698就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4370在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-solutions-1.0-1.noarch.rpm erlang-solutions-1.0-1.noarch.rpm
总的来说,"erlang-otp-win64位 25.3版本"的安装是部署RabbitMQ等基于Erlang OTP技术的应用的第一步。理解Erlang OTP的特性和RabbitMQ的工作原理,能够帮助开发者更好地利用这些工具构建高效、可靠的系统。在实际...
erlang otp25 win安装包
标题中的"otp_win64_20.3-Erlang.zip"表明这是一个包含Erlang编程语言特定版本的Windows 64位版本的压缩文件。OTP(Open Telecom Platform)是Erlang的主要实现,它是一个用于构建高度并发、容错且可扩展的系统平台...
总结来说,"Erlang-otp_win64_23.0.zip"提供的Erlang OTP 23.0版本是安装RabbitMQ所必需的前置条件,尤其对于Windows 64位用户而言。这个版本包含了运行RabbitMQ所需的所有组件,并且进行了优化,能够提供一个稳定且...
Erlang/OTP 26.2.1,Erlang,OTP,26.2.1
Erlang OTP(Open Telephony Platform)是一种开源的编程语言和框架,专为构建高度并发、分布式和容错系统而设计。"Erlang otp_win64_21.2.exe" 是Erlang OTP在Windows 64位平台上的一个特定版本,编号为21.2。这个...
JWChat 1.0 是一个专为实现即时通讯功能而设计的Web客户端,它允许用户在浏览器上进行实时的消息交换,无需安装额外的桌面应用。这个开源项目不仅提高了沟通的便捷性,而且兼容了多种服务器平台,如Openfire和...
Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...
OTP(Open Telephony Platform)是爱立信公司开发的一个开源软件框架,主要为构建高度可靠、可扩展且具有容错能力的分布式系统提供基础。它以其内置的编程语言Erlang为核心,Erlang是一种静态类型、函数式编程语言,...
otp_win64_21.1.exe是OTP在Windows 64位系统的特定版本,包含了运行Erlang应用程序所需的全部组件,如Erlang虚拟机、标准库和工具集。 RabbitMQ是一款广泛使用的开源消息代理和队列服务器,它基于AMQP(Advanced ...
erlang otp学习文档 学习还不错的
Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads
Erlang OTP 20.3 是一个针对Linux CentOS系统的软件包,主要为开发者提供了一个强大的并发和分布式计算环境。Erlang是一种静态类型的、函数式的编程语言,它以其在处理高并发、容错和实时系统方面的优秀表现而闻名。...
5. **Erlang-otp_win64_21-22压缩包内容** - 可能包含Erlang OTP的完整安装程序,包括编译器、运行时系统、标准库以及相关工具。 - 文档和教程,帮助用户了解和学习Erlang OTP的使用。 - 示例代码和测试用例,...
内容概要:本文档详细介绍了Erlang编程语言及其并行编程模型,并重点阐述了Erlang OTP框架的特性和应用场景。首先,文档简述了Erlang语言的特点,包括轻量级进程、模式匹配和热代码升级等特性,以及它在构建高可用、...
该客户端不仅兼容ejabberd服务器,这是一款用Erlang编写的强大、可扩展的即时通讯服务器,还能够与Openfire服务器无缝集成。Openfire是基于Java的XMPP服务器,以其易用性和高性能而受到赞誉。这意味着JWChat 1.0 ...
Erlang 安装包(otp_win32_R16B03-1.part2)