ErlangのCowboyを試す

cowboyを触ってみたのでメモ代わりに。

cowboyを触ろうと思った理由はmspgack-rpc-erlangの内部にcowboyが使われているからという理由です。特に理由になってない。

参考にした記事とか

本家リポジトリのREADMEとexampleを参考にしました。

extend/cowboy · GitHub

環境

私はErlang R15B02で試しました。

cowboyのインストール

rebarを使うので、rebar.configを以下のように記述しました。

{deps, [
    {cowboy, ".*",
        {git, "git://github.com/extend/cowboy.git", "master"}}
]}.

rebarのテンプレート機能を使う

rebarのテンプレート機能を使って必要そうなファイルを生成してもらいましょう。

$ ./rebar create-app appid=sample
$ ./rebar create template=simplemod modid=sample

構成

最近のcowboyはranchを使って接続処理を行っているらしいので、cobowyを起動する前に必ずapplication:start(ranch)を行う必要があるみたいです。ranchを起動したらapplication:start(cowboy)でcowboyを起動します。

その後、cowboy:start_http/4でトランスポートとプロトコル、acceptorを指定します(でいいのかな?)。

cowboyのexamplesではappにそのまま書かれていますが、今回は見易さを重視してsample_cowboy.erlというファイルを新たに作成して記述してみました。

-module(sample_cowboy).                                         

-export([start/0]).

start() ->
    application:start(ranch),
    application:start(cowboy),
    Dispatch = [
        {'_', [
            {'_', default_handler, []}
        ]}
    ],
    cowboy:start_http(sample_http_handler, 100,
        [{port, 19860}], [{dispatch, Dispatch}]
    ),
    ok.

このコードではすべてのアクセスをdefault_handlerに送っています。

default_handlerは文字列を返すだけの簡単なものです。

-module(default_handler).

-behaviour(cowboy_http_handler).

-export([init/3, handle/2, terminate/2]).

init(_Transport, Req, []) ->
    {ok, Req, undefined}.

handle(Req, State) ->
    {ok, Req2} = cowboy_req:reply(200, [], <<"Hello world!">>, Req),
    {ok, Req2, State}.

terminate(_Req, _State) ->
    ok.

sample.erlはapplication:start(sample)を実行するだけのコードになります。

-module(sample).
-export([start/0]).

start() ->
    application:start(sample).

sample_app.erlにはsample_cowboy:startの呼び出しを追加します。

-module(sample_app).
-behaviour(application).
-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
    ok = sample_cowboy:start(),
    sample_sup:start_link().

stop(_State) ->
    ok.

起動

$ ./rebar get-deps compile
$ erl -pa ebin deps/*/ebin -s sample

これでlocalhost:19860にアクセスするとHello Worldが表示されるはずです。

本当はMakefileを書いておいたほうが便利なのですが、今回は割愛。

過去記事との比較

Voluntasさんの記事のころとはいくつかの相違点があるようです。

  1. ranchに依存している
  2. cowboy_http_req -> cowboy_reqにモジュール名が変更されている
  3. cowboy:start_listener -> cowboy:start_httpとcowboy:start_httpsに機能分割されている

と、ざっと眺めて知っている範囲ではこんな感じです。

あと、先の記事には参考としてcowboy_examplesリポジトリのリンクが記述されていますが、あのリポジトリは今後更新されないようです(READMEいわく、cowboyリポジトリ内のexamplesを見てねとのこと)。

感想

フレームワークを触ったことがないので比較とかはできません(ザ・Erlang初心者)。

時間ができたらmochiwebも触って比較したいなとは思ってます。

負荷試験は・・・現状やれる気がしないので後回し。