首先,今天0点《暗黑破坏神3》就要正式开服了,但是我把晚上献给了erlang,经过前几天的努力,我已经看完了 Erlang OTP设计原则,在这里非常感谢,翻译成中文的作者 ShiningRay,没有你无私的奉献,也就没有我们这些菜鸟的幸福,废话不多说,进入今天的正题,我在今后这一段时间,跟大家一起来分享 Cowboy 这个开源的 erlang http 服务器。
我们看下官方的简介:
Cowboy is a small, fast and modular HTTP server written in Erlang.
Cowboy is also a socket acceptor pool, able to accept connections for any kind of TCP protocol.
源码下载地址:https://github.com/extend/cowboy
例子:https://github.com/extend/cowboy_examples
首先是下载源码:git clone https://github.com/extend/cowboy.git
好,我们开始分析 CowBoy这个项目,首先是
1. cowboy.app.src 这个文件,这个文件在编译后为cowboy.app也就是应用资源文件,又称为应用配置文件,Erlang不管是应用程序,还是一般的类库,最后都是以应用程序的方式启动,这个可以参看 Erlang OTP设计原则 中的 应用 ,内容如下:
{application, cowboy, [ {description, "Small, fast, modular HTTP server."}, {vsn, "0.5.0"}, {modules, []}, {registered, [cowboy_clock, cowboy_sup]}, {applications, [ kernel, stdlib ]}, {mod, {cowboy_app, []}}, {env, []} ]}.
资源文件中的每个字段我们在这边就不详细介绍了,推荐没有看过 Erlang OTP 设计原则 的朋友去看下,它能帮助你了解 Erlang 整体上的结构,比如,应该程序下一般是监控进程,然后监控进程又负责监控子进程等等,当然,在这个文档中,详细描述了上面所有字段的含义。
配置文件中,键 mod 定义了回调模块以及应用的启动参数,在这个例子中相应是 cowboy_app 和 []。这表示应用启动的时候会调用:
cowboy_app:start(normal, [])
而当应用被停止的时候会调用:
cowboy_app:stop([])
2. 既然上面提到 应用被启动时,会调用 cowboy_app:start(normal, []),那么我们接下来看下下面这个文件:
cowboy_app.erl
-module(cowboy_app). -behaviour(application). -export([start/2, stop/1, profile_output/0]). %% API. -type application_start_type() :: normal | {takeover, node()} | {failover, node()}. %% API. -spec start(application_start_type(), any()) -> {ok, pid()}. start(_Type, _Args) -> consider_profiling(), cowboy_sup:start_link(). -spec stop(any()) -> ok. stop(_State) -> ok. -spec profile_output() -> ok. profile_output() -> eprof:stop_profiling(), eprof:log("procs.profile"), eprof:analyze(procs), eprof:log("total.profile"), eprof:analyze(total). %% Internal. -spec consider_profiling() -> profiling | not_profiling. consider_profiling() -> case application:get_env(profile) of {ok, true} -> {ok, _Pid} = eprof:start(), eprof:start_profiling([self()]); _ -> not_profiling end.
当应用程序启动时,会调用这个方法 start(_Type, _Args) 这个方法有2个参数,_Args 这个参数是从 应用程序配置文件中 {mod, {cowboy_app, []}},在这里 [] 空列表,
_Type 这个参数的值一般为 normal;
我们看到在 start/2 方法中,有2行代码,consider_profiling() 这个是 和 eprof相关的,今天先不详细介绍,因为我也没见过。。。抱歉,我大概百度了下,A Time Profiling Tool for Erlang 想研究的可以看下官方DOC http://www.erlang.org/doc/man/eprof.html 大概意思就是 erlang 代码分析工具。
我们看 cowboy_sup:start_link() 这行的意思是启动督程,就是监控进程,然后一般在其他子进程会在这棵监控进程树下。
剩下一个方法就是 stop(_State), 用于停止应用程序使用。
下面介绍下启动应用程序的方法:
application:start(cowboy).
停止应用程序的方法:
application:stop(cowboy).
今天就简单介绍这2个文件。谢谢