《Erlang开发及应用》PPT课件_第1页
《Erlang开发及应用》PPT课件_第2页
《Erlang开发及应用》PPT课件_第3页
《Erlang开发及应用》PPT课件_第4页
《Erlang开发及应用》PPT课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Erlang开发及应用,litaocheng,WhatisErlang?,ERicssonLANGuage?函数式编程语言(FP)面向并发(OC),基于消息Ericsson创建,最初用于电信系统开发成熟,稳定,具有20多年历史适于电信系统,分布式系统,高并发服务器OpenSource,跨平台,GC不适于底层系统开发,History,1980sEricsson实验室思考如何轻松开发电信系统应用1987年左右,Erlang浮出水面1989年JAM虚拟机C语言实现1996年OTP项目启动,融合开发经验,提供易用,强大的Erlang开发库1998年开源2007年ProgrammingErlang出版目前版本ErlangR13B1(5.7.2),Erlang优势,多核SMP支持内建分布式支持基于轻量进程及消息的高并发模型代码热替换开发速度快,高性能,高稳定性FP编程,代码灵活高效,副作用小丰富的分析及监控程序经过商业产品,长久大规模验证OpenSource,代码面前无秘密,ErlangHelloWorld,代码hello.erl:1-module(hello).2-compile(export_all).34main()-5io:format(helloworld!n).编译:$erlchello.erl运行:$erlEshellV5.7.1(abortwithG)1hello:main().helloworld!ok,ErlangHelloWorldCONT,1-module(hello).声明模块名称,其必须和文件名一致.模块是Erlang项目中代码组织的基本方式.2-compile(export_all).指明编译选项,export_all用来导出所有本模块中的函数,exportedfunction是模块的接口,其他模块只能调用exportedfunction4main()-为函数头(head),包含函数名称和参数,后紧随一个-分割符5io:format(helloworld!n).为函数体(body),包含Erlang表达式,这里调用io模块的format函数在默认输出中打印helloworld!在上面的运行结果中,最后有一个ok,这是io:format/1的返回值,表示打印成功,Erlang中任何函数都有返回值.,Erlang语法,DataTypes8种基本类型integer-4,-4,2#100,16#4,920828990801238101010.float-3.0,3.5e2,6.5e-2,(IEEE75464bit)atom-hello,your_name,roothost,IsAtombinary-reference-make_ref(),一个随机值fun-fun()-some_exprendport-与外部应用进行交互的接口pid-processidentifier,用来操作process2种复合类型tuple-foo,male,28,china,list-ip,any,port,1234,binary,Erlang语法CONT,PatternMatch语言层级的模式匹配,代码更加简洁.适用于函数调用,case,receive,try表达式及=操作caseValueofNwhenis_integer(N)-N;_whenis_list(Value)-list_to_integer(Value)end变量大写字母或_开头,只能包含数字,字母,_,.如X,Name1,_Phone,_,Host变量分为Unbound和Bound,Unbound变量只能用在模式匹配中.变量Bound后,Value就不可修改变量只能单次赋值(并发及调试考虑)N=3(ok)N=4(oops!notmatch),Erlang语法CONT,Binary匹配使用binary可以轻松的实现二进制协议.(1)解析IP包:-define(IP_VERSION,4).-define(IP_MIN_HDR_LEN,5).DgramSize=size(Dgram),caseDgramofwhenHLen=5,4*HLen=OptsLen=4*(HLen-?IP_MIN_HDR_LEN),=RestDgram,Erlang语法CONT,(2)自定义协议假如我们定义了一个协议,前2bytes(16位)标记消息体的长度,后面为消息体,最后为占用1个byte的结尾符0 xef,示意图如下:-length-payload-ef|-2-|-Length-|-1-|(单位byte)则对应的binary匹配表达式如下:.Packet=.casePacketof-body,PayLoad;_-error,invalid_packetend.,Erlang语法CONT,序列化与反序列化Erlang中序列化非常简单term_to_binary/1-将任意数据转化为二进制序列binary_to_term/1-将编码的二进制数据转化为Erlang数据比如:Obj=apple,price,2.0,origin,shandong,Bin=term_to_binary(Obj),Obj=binary_to_term(Bin)CouchDB中大量使用erlang的序列化相关函数,完成数据的存储与加载.,Erlang语法CONT,函数一切皆函数,每个调用都有return,函数可以作为基本数据类型.作为返回值:op_fun(+)-fun(N1,N2)-N1+N2end;op_fun(-)-fun(N1,N2)-N1-N2end.作为参数:FIsEven=fun(E)-Eband2#1=:=0end.lists:filter(FIsEven,1,2,3,4,5,6).2,4,6,Erlang语法CONT,TailRecursion尾递归Erlang中没有for,while关键字可以利用递归实现循环在server开发中,确保使用尾递归:server_loop(Args)-.someaction.server_loop(Args).使用尾递归,可以消耗很少的内存,仅仅是一个地址跳转.server_loop(Args)-.someaction.server_loop(Args),other_fun().,Erlang语法CONT,发送Message!基于消息通信,NoLock!NoSharedMemroy!Pid!msg,hello,Iloveerlang向Pid(本地或远程主机)代表的进程发送消息receive,1,阻塞等待任意消息:receiveMsg-okend3,等待消息,超时为5sec:receiveMsg-okafter5000-timeoutend,2,实现sleep:receiveafterTime-okend4,检测是否存在消息:receiveSomeMsg-existafter0-no_existend,Erlang并发,关于Process每个Process拥有一个mailbox,保存消息Processes之间通过发送异步Message进行交互,无共享状态轻量,兼有OSProcess的隔离及OSThread的高效Process具有自己Stack,Heap,GCProcess可以位于Local,也可以位于RemoteMachineProcess能够进行多种形式的管理及控制(link,monitor,exitsignal)Process为erlang高并发,高容错,分布式的基础并发Process数:default32768,max268435456,Erlang并发CONT,创建Processspawn(Fun),比如spawn(fun()-io:format(impn,self()end).imspawn(Mod,Fun,Args),比如spawn(io,format,impn,self().imspawn_link,spawn_opt,spawn_monitor.销毁Process进程内部调用exit(Reason),比如exit(normal),正常退出进程内部发生异常导致程序退出其他进程调用exit(PidBeTerminate,Reason),Erlang并发CONT,基于Process的httpserver框架(oneloopprocess,perconectionperprocess):setupuplistensocket,spawn(listen_process).inlisten_process:whilecanacceptnewclientconnectaccept,spawn(client_process)loopinclient_process:processprotocol,closesocket.,Erlang并发CONT,使用Erlang我们可以:以清晰的风格开发高并发的应用我们将不在受困于:线程池的复杂死锁,竞赛的窘迫内存泄露局部问题,导致的全局崩溃与跨平台多核SMP的格格不入,Erlang分布式,ErlangNode是分布式通讯的基本单元,可以位于同一机器or多台机器,实现了原语级的节点通讯ErlangNode通过erl-snameNameorerlang-nameName启动,同一台机器可以启动多个Node每台机器上启动ErlangNode时,都会启动一个epmd(ErlangPortMapperDaemon,port4396),用来进行Node和Machine之间的映射不同机器的Node之间通过Tcp连接进行Message传输(可以自定义分布式通讯实现,如通过ssh)global维护一个全局的Nodes网络spawn_link|_opt都具有分布式版本,可以再其他节点创建Process,Erlang分布式CONT,rpc模块可以在其他Node上执行操作slave,remsh,remoteshell等方式启动,连接ErlangNodeErlang中进程具有位置透明性通过message及receive表达式,轻松实现同步or异步,timeout等网络通信中多种机制Erlang本身提供tcp,udp等常规的网络编程方式使用Erlang内建分布式机制,可以快速开发多种应用,也可以基于socket开发各种专有应用,Erlang分布式CONT,Erlang分布式CONT,节点A2连接节点B2步骤NodeA2,B2启动,绑定一个本机端口,并注册到本机的epmd(defaultport4396)A2连接HostBepmd,请求获取B2节点的绑定端口HostBepmd将B2的bindport及dist协议版本等信息返回给A2A2与B2协商,建立tcp连接,如果连接成功,维护一个tick,来定期检测B2节点A2与B2节点之间的消息,通过此连接进行发送,ErlangOTP,OTP(OpenTelecomPlatform),其定义了一系列项目开发中需要的模式及部署升级策略,为提高开发效率,构建高效,稳定系统提供了巨大的帮助。同最初时的专有电信平台应用已没有太多关系当前系统都是采用OTP进行开发Erlang中各种lib都是基于OTP开发可以理解成某种轻量的框架,或者具体化的设计模式behaviours包含:application,supervisor,gen_server,gen_fsm,gen_eventapplication,release,releasehandling提供应用的部署,升级,回退等实现,ErlangOTPCONT,Behaviours通过定义一些简单的callback模块实现特定功能.application定义application,实现某种功能,由其他behaviours组成supervisor-定义一个supervisortree,实现各种策略的任务重启机制gen_server-定义一个通用的server模型,一个processloop,提供同步异步接口gen_fsm-实现一个状态机gen_event-实现一个eventmanager及eventhandler模型,与其它语言的交互,ExternalApp外部应用崩溃不会影响Erlang虚拟机Ports-通过port与外部应用交互(stdin/stdout)Erl_Iterface-提供c的封装,方便开发port应用LinkinDriversharedlibrary(SOinUnix,DLLinWindows),影响Erlang虚拟机稳定性(不推荐)Portdirvers-提供c封装,运行在erlang虚拟机内部CNodes遵照erlang的交互协议,使用c实现的一个erlangnodeJinterface提供一系列与Erlang进行交互的Java包,Erlang代码片段,求某个数的阶乘factorial(0)-1;factorial(N)-Nfactorial(N-1).获取远程机器的issue信息(linux)-module(issue).-compile(export_all).%startserverserver()-register(issue_server,spawn(funserver_loop/0).server_loop()-receiveFrom,get,issue-From!issue,get_issue();_-okend,server_loop().,Erlang代码片段CONt,get_issue()-ok,Bin=file:read_file(/etc/issue),Bin.%startclientclient(ServerNode)-true=net_kernel:connect_node(ServerNode),issue_server,ServerNode!self(),get,issue,receiveissue,Issue-io:format(serverissue:sn,Issue)after1000-io:format(receiveissuetimeoutn)end.调用:$erl-snameserver(serverlitao)1issue:server().true$erl-snameclient(clientlitao)1issue:client(serverlitao).serverissue:Ubuntu9.04nl,产品开发流程,架构设计单台or分布式?Master-SlaveorGrid?Monitor,Failover,NetComunication,Database,Replica.OTPBehaviourhowmanyapplication?usesupervisor,gen_server,gen_fsm,gen_eventCoding,及单元测试用例.每个module都经过测试(eunit)编写系统测试框架,覆盖测试,确保系统正确(commontest)压力测试,分析性能瓶颈,进行优化(fprof)系统上线,监控功能(ganglia,nagios,mo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论