代码改变世界

Cowboy 源码分析(一)

2012-05-15 00:35  rhinovirus  阅读(13817)  评论(6编辑  收藏  举报

  首先,今天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个文件。谢谢