ErlangのCowboyを試す
cowboyを触ってみたのでメモ代わりに。
cowboyを触ろうと思った理由はmspgack-rpc-erlangの内部にcowboyが使われているからという理由です。特に理由になってない。
環境
私は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さんの記事のころとはいくつかの相違点があるようです。
- ranchに依存している
- cowboy_http_req -> cowboy_reqにモジュール名が変更されている
- cowboy:start_listener -> cowboy:start_httpとcowboy:start_httpsに機能分割されている
と、ざっと眺めて知っている範囲ではこんな感じです。
あと、先の記事には参考としてcowboy_examplesリポジトリのリンクが記述されていますが、あのリポジトリは今後更新されないようです(READMEいわく、cowboyリポジトリ内のexamplesを見てねとのこと)。