Mochiweb源代码研究

Mochiweb是一个框架,在你用它来生成一个你"指定名字(Name)"项目前(下载源码,然后这样来生成你的项目:make app PROJECT=project_name PREFIX=$HOME/projects/),它是什么都不做的。

假设你生成的是name项目。

就会在你的项目里自动生成下面的文件:name.erl, name_app.erl, name_sup.erl, name_deps.erl, name.app等

然后入口在,你的name.erl的start/0,然后里面最后会调用application:start(name)。就是会用这个配置文件:name.app,启动整个项目(标准的OTP gen_server框架:name.app, name_app.erl, name_sup.erl, name_web.erl)。然后,就是name_app.erl,然后再是name_sup.erl(在这里可以配置你的mochiweb server的参数,例如,IP,Port等)。然后就是name_web.erl。

然后,你的逻辑就加在name_web.erl里面的loop/2里面。当一个接到一个请求,loop/2就会被执行一次。


其实,在name_web.erl里面,第一个被调用的fun是start/1。这里就是mochiweb自己的入口。

start(Options) ->
{DocRoot, Options1} = get_option(docroot, Options),
Loop = fun (Req) ->
?MODULE:loop(Req, DocRoot)
end,
mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).

这里把name_web.erl的loop当一个Param传给mochiweb_http。

-define(DEFAULTS, [{name, ?MODULE},
{port, 8888}]).

parse_options(Options) ->
{loop, HttpLoop} = proplists:lookup(loop, Options),
Loop = fun (S) ->
?MODULE:loop(S, HttpLoop)
end,
Options1 = [{loop, Loop} | proplists:delete(loop, Options)],
mochilists:set_defaults(?DEFAULTS, Options1). %%看看,DEFAULT的属性Options1里有没有,没有的话就设置成DEFAULT,有就保留原样。
...

start() ->
start([{ip, "127.0.0.1"},
{loop, {?MODULE, default_body}}]).

start(Options) ->
mochiweb_socket_server:start(parse_options(Options)).

然后,就是mochiweb_socket_server了。又是一个OTP的gen_server(所以才叫socket_server)。先调用start/1,然后就是start_server/1

-record(mochiweb_socket_server,
{port,
loop,
name=undefined,
%% NOTE: This is currently ignored.
max=2048,
ip=any,
listen=null,
nodelay=false,
backlog=128,
active_sockets=0,
acceptor_pool_size=16,
ssl=false,
ssl_opts=[{ssl_imp, new}],
acceptor_pool=sets:new()}).

start(State=#mochiweb_socket_server{}) ->
start_server(State);
start(Options) ->
start(parse_options(Options)).

...

start_server(State=#mochiweb_socket_server{ssl=Ssl, name=Name}) ->
case Ssl of
true ->
application:start(crypto),
application:start(ssl);
false ->
void
end,
case Name of
undefined ->
gen_server:start_link(?MODULE, State, []);
_ ->
gen_server:start_link(Name, ?MODULE, State, [])
end.

注意了,从name_sup.erl调用开始,一直都是函数调用,在start_server/1里面,调用gen_server:start_link/3or/4后,这个叫Name的gen_server就成为supervisor name_sup的一个worker了!

哈哈,大家知道这个时候Name里面是什么吗?在默认的情况下?
………………
恩恩,聪明的同学已经看到了,就是"name_web"。这里mochiweb框架很好地嫁接了,项目的处理逻辑和本身mochiweb的supervisor-worker的关系。

今天累了,以后有时间继续……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下命令来查看RabbitMQ的版本: rabbitmqctl status | grep RabbitMQ 其中,rabbitmqctl是RabbitMQ的控制命令,status表示查看RabbitMQ的状态,grep RabbitMQ是用来过滤出包含RabbitMQ关键字的信息。执行该命令后,会输出类似以下的信息: Status of node 'rabbit@localhost' ... [{pid,1234}, {running_applications,[{rabbit,"RabbitMQ","3.8.9"}, {rabbit_common,[],"3.8.9"}, {rabbitmq_management,"RabbitMQ Management","3.8.9"}, {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.8.9"}, {webmachine,"webmachine","1.10.3"}, {mochiweb,"MochiMedia Web Server","2.20.1"}]}, {os,{unix,linux}}, {erlang_version,"22.3.4.16"}, {memory,[{total,123456789}, {connection_readers,}, {connection_writers,}, {connection_channels,}, {connection_other,}, {queue_procs,}, {queue_slave_procs,}, {plugins,}, {other_proc,123456789}, {mnesia,}, {mgmt_db,}, {msg_index,}, {other_ets,}]}, {alarms,[]}, {listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]}, {vm_memory_high_watermark,.4}, {vm_memory_limit,1073741824}, {disk_free_limit,50000000}, {disk_free,123456789}, {file_descriptors,[{total_limit,924}, {total_used,4}, {sockets_limit,829}, {sockets_used,2}]}, {processes,[{limit,1048576},{used,123}]}, {run_queue,}, {uptime,123456789}, {kernel,{net_ticktime,60}}] 其中,RabbitMQ的版本号为3.8.9。 ### 回答2: RabbitMQ是一种开源的消息中间件,它支持多个协议,包括AMQP(高级消息队列协议)和STOMP(可简单传输消息协议),可以用于构建分布式应用程序。在Linux系统上,使用以下命令可以查看RabbitMQ版本: 1. 使用rabbitmqctl命令 先使用sudo命令切换到root用户,然后输入以下命令: rabbitmqctl status 该命令将返回RabbitMQ服务器的状态信息,其中包括RabbitMQ服务器的本地版本信息。有时候,rabbitmqctl这个命令可能由于环境变量问题而无法找到。这种情况下,可以在命令前面加上sudo,以root用户的身份运行。 2. 使用rabbitmq-server命令 另一种查看RabbitMQ版本的方法是使用rabbitmq-server这个命令: sudo rabbitmq-server -version 该命令将返回RabbitMQ服务器的版本信息。 无论是使用rabbitmqctl还是rabbitmq-server命令,都可以方便地查看RabbitMQ版本信息。在开发和测试过程中,需要不断了解所采用的技术栈中各种软件和工具的版本信息,以便进行问题排查和性能优化。 ### 回答3: 在Linux系统中,我们可以通过多种方式来查看已安装的 RabbitMQ 版本。 1. 使用 rabbitmqctl 命令 rabbitmqctl 是 RabbitMQ 自带的命令行工具,我们可以通过执行以下命令来查看版本信息: ``` sudo rabbitmqctl status ``` 执行完命令后,会输出 RabbitMQ 的版本信息,如下所示: ``` Status of node rabbit@localhost ... [{pid,xxxx}, {running_applications, [{rabbitmq_management,"RabbitMQ Management Console","3.9.7"}, {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.9.7"}, {rabbitmq_management_agent,"RabbitMQ Management Agent","3.9.7"}, {rabbitmq_auth_backend_ldap,"LDAP Authentication Backend","3.9.7"}, {rabbitmq_auth_mechanism_ssl,"SSL Authentication Mechanism","3.9.7"}, {rabbitmq_shovel_management,"Shovel Management Plugin","3.9.7"}, {rabbitmq_auth_backend_cache,"Caching Authentication Backend","3.9.7"}, {rabbitmq_mqtt,"RabbitMQ MQTT Adapter","3.9.7"}, {rabbitmq_recent_history_exchange,"RabbitMQ Recent History Exchange","3.9.7"}, {rabbitmq_consistent_hash_exchange,"RabbitMQ Consistent Hash Exchange","3.9.7"}, {rabbitmq_federation_management,"Federation Management Plugin","3.9.7"}, {rabbitmq_event_exchange,"RabbitMQ Event Exchange","3.9.7"}, {rabbitmq_federation,"RabbitMQ Federation","3.9.7"}, {rabbitmq_random_exchange,"RabbitMQ Random Exchange","3.9.7"}, {rabbitmq_amqp1_0,"AMQP 1.0 support plugin","3.9.7"}, {rabbitmq_management_visualiser,"RabbitMQ Management Visualiser","3.9.7"}, {rabbit,"RabbitMQ","3.9.7"}, {rabbit_common,[],"3.9.7"}, {amqp_client,"RabbitMQ AMQP Client","5.6.0"}, {rabbitmq_prometheus,"RabbitMQ Prometheus Adapter","3.9.7"}]}, {os,{unix,linux}}, {erlang_version,"24.0.5"}, {memory,[{connection_readers,0}, {connection_writers,0}, {connection_channels,0}, {connection_other,13776}, {queue_procs,27512}, {queue_slave_procs,0}, {plugins,0}, {other_proc,106791992}, {mnesia,117776}, {mgmt_db,0}, {msg_index,0}, {other_ets,3172904}, {binary,68324}, {code,27758417}, {atom,235669}, {other_system,12130443}]}, {disk_free_limit,50000000}, {disk_free,192183007232}, {file_descriptors,[{total_limit,1048576}, {total_used,604}, {sockets_limit,943626}, {sockets_used,588}]}, {processes,[{limit,1048576},{used,296}]}, {run_queue,0}, {uptime,576}, {kernel,{net_ticktime,60}}] ``` 在上述输出结果中,我们可以看到 RabbitMQ 的版本号是 “{rabbit,"RabbitMQ","3.9.7"}” . 2. 查看 RabbitMQ 安装目录下的版本文件 在 Linux 中,RabbitMQ 的版本文件位于 /usr/lib/rabbitmq/erlang/lib/rabbitmq_server-x.x.x/ebin/ 目录下,我们可以通过 cd 命令切换到该目录下,执行 ls 命令查看可以看到版本文件名类似 rabbit_common-3.9.7.ez,其中 3.9.7 即为 RabbitMQ 当前的版本。 3. 查看 erlang 包依赖版本 RabbitMQ 是基于 Erlang 编写的,我们可以通过执行以下命令来查看 erlang 依赖的 RabbitMQ 版本: ``` sudo erl -eval '{ok, A} = file:read_file(filename:join([code:root_dir(), "lib", "rabbitmq_server-3.9.7", "ebin", "rabbit.app"])), {ok, [{version, V}]} = re:run(A, ".*{version, \"(\\d+\\.\\d+\\.\\d+)\"}.*", [{capture, [1]}]), io:format("~s~n", [V]), halt().' -noshell ``` 执行完命令后,会输出 RabbitMQ 的版本信息,如下所示: ``` "3.9.7" ``` 以上是 Linux 查看 RabbitMQ 版本的三种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值