【Cowboy源码阅读-2】Http服务器的启动流程

本文详细介绍了Erlang库Cowboy的HTTP服务器启动流程,从`echo_get_app.erl`开始,深入到`cowboy:start_clear/3`、`ranch:start_listener/5`等关键函数。在流程中,探讨了`ranch_server`如何设置监听器参数,以及`ranch_acceptor`如何处理连接。特别指出,Socket在被接受后,经过一系列操作绑定到`cowboy_http`,其消息处理不会丢失,因为Socket状态在子进程中从`{active,false}`变为`{active,true}`。" 128282030,16257584,Java大型项目启动优化实践:减少启动时间30%以上,"['后端', 'java', '性能优化']
摘要由CSDN通过智能技术生成

通过 examples中的 echo_get_app.erl 来顺着捋下来整体流程

echo_get_app.erl中的start函数,Dispatch是一个路由逻辑,暂时先不细究,先看 cowboy:start_clear/3,调用cowboy:start_clear/3会开启一个 listener 的监督者

cowboy:start_clear/3会先对参数进行格式化处理(List转Map等),其中比较有趣的就是ranch:normalize_opts/1中会处理 ack_timeout 的时间,读到这里产生一种莫名的底层牛逼感。参数格式化完成之后就会调用ranch:start_listene/5,ranch:start_listene/5在普通情况下的主要功能就是让ranch_sup去启动ranch_listener_sup


ranch_listener_sup:start_link/5 作用又分成:
ranch_server:set_new_listener_opts/5
这个函数的作用就是向ranch_server的gen_server中设置参数
由 ranch_sup 启动 ranch_server
其中各个参数分别是:
Ref : http
Transport : ranch_tcp,
MaxConns : 1024,
TransOpts : #{connection_type => supervisor,socket_opts => [{port,8080}]},
Protocol : cowboy_clear,
ProtoOpts : #{connection_type => supervisor, env => #{dispatch => [{’_’,[],[{[],[],toppage_h,[]}]}]}}
ranch_server:set_listener_sup(Ref, self()),将监听的监督者设置成自己,后续会用到
开启ranch_conns_sup,并且把自己set到ranch_server里面,ranch_server:set_connections_sup(Ref, self()) 。
开启ranch_acceptors_sup ,ranch_acceptors_sup的操作其实就是创建一个listener_socket,然后开启 ranch_acceptor 这个worker 进程。

注意这里的细节,是先开启 负责处理connect_socket的监督者 (connect_socket 和 listener_socket需要分清楚)


ranch_acceptor会在loop里面循环的accept,accept到connect_socket之后,就把socket controlling_process 给 ranch_conns_sup,然后发送消息 {?MODULE, start_protocol, self(), Socket} 给 ranch_conns_sup ,并且用 receive阻塞自己。(看到这里可能有点奇怪,怎么没有超时时间的?其实后面在处理连接的时候,如果超过最大连接数量,这里就一直阻塞了)

顺着下去看 ranch_conns_sup:loop/4,收到 {?MODULE, start_protocol, self

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值