Erlang——cowboy源码剖析
到了这个时候才有时间开始写这篇文章,为了昨天的承诺,坚持。
cowboy是一个application,是一个小巧快速的良好模块化的http server。其中良好的clean module使得我们可以扩展到多种网络协议之中,cowboy自带的有tcp和ssl,而也有一些人提供了smtp等的扩展。我打算在接下去的项目中以cowboy作为框架完成一个服务器端来为移动互联网提供服务。。。移动互联网的特性上一章有所涉及,在此就不多说了。
cowboy的特点:
1.代码少。
2.速度快。
3.模块化程度高,transport和protocol都可轻易替换。
4.采用二进制语法实现http服务,更快更小。
5.极易嵌入其它应用。
6.有dispatcher,可以嵌入FastCGI PHP 或者是 Ruby.
7.没有进程字典,代码干净。
cowboy_app.erl照例启动一些初始化处理,然后创建cowboy_sup(supervisor)进程,它通过缓存来进行快速的时间计算。然后,就没有然后了。这就是cowboy所启动的全部进程。代码clean把,依赖关系少把。。。废话不说,接下去看cowboy_example的实例,官方开发人员提供了一份实例,然后我在网上找了一个较为复杂的应用cowboy的实例:bigwig。接着,看看官方的示例把。
下载cowboy_example后,
rebar get-deps compile即可。
启动以后,创建cowboy_example.erl(application),然后运行代码就如下:
start(_Type, _Args) ->
Dispatch = [
{'_', [
{[<<"websocket">>], websocket_handler, []},
{[<<"eventsource">>], eventsource_handler, []},
{[<<"eventsource">>, <<"live">>], eventsource_emitter, []},
{'_', default_handler, []}
]}
],
cowboy:start_listener(my_http_listener, 100,
cowboy_tcp_transport, [{port, 8080}],
cowboy_http_protocol, [{dispatch, Dispatch}]
),
cowboy:start_listener(my_https_listener, 100,
cowboy_ssl_transport, [
{port, 8443}, {certfile, "priv/ssl/cert.pem"},
{keyfile, "priv/ssl/key.pem"}, {password, "cowboy"}],
cowboy_http_protocol, [{dispatch, Dispatch}]
),
cowboy_examples_sup:start_link().
往上可以看出有一个dispatcher,然后下面创建了两个监听进程,最后启动监工进程。在dispatcher这里你可以转换成别的处理方式,如php。最后的cowboy_examples_sup.erl中则可以对你自己所需的进程服务进行监控,比如维持状态等。这么清爽的模块真是心旷神怡。
接下来就是参考cowboy的transport和protocol进行你所需要的网络协议部分的处理了,最后再在sup里面搞些自己的逻辑。这样就搞定了。。。
具体的协议模块编写我将会根据自己的运用经验再来讲述,希望能够通过实践理解来讲的更为透彻。
发现了一个朋友新写的cowboy源码剖析系列,讲的很是细致,希望大家去看看,有问题也可以继续问我,欢迎。
http://www.cnblogs.com/yourihua/archive/2012/05/24/2515380.html