cowboy源码分析(一)
前段时间导读了ranch的源码,具体见ranch 源码分析(一),
现在整理了下ranch框架下经典应用cowboy。
源码地方:https://github.com/ninenines/cowboy(目前使用的是cowboy-1.0.4版本)
还是找其中最简单的例子来入手,那就选这个static_world吧~~

首先我们来看static_world_app.erl
[root@erlang004 src]# cat static_world_app.erl
%% Feel free to use, reuse and abuse the code in this file. %% @private
-module(static_world_app).
-behaviour(application). %% API.
-export([start/2]).
-export([stop/1]). %% API. start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/", cowboy_static, {priv_file, static_world, "index.html"}},
{"/[...]", cowboy_static, {priv_dir, static_world, "",
[{mimetypes, cow_mimetypes, all}]}}
]}
]),
{ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
{env, [{dispatch, Dispatch}]}
]),
static_world_sup:start_link(). stop(_State) ->
ok.
cowboy_router.erl是路径路由设置,我们就不看这个源码,直接看一下结果
1> cowboy_router:compile([
1> {'_', [
1> {"/", cowboy_static, {priv_file, static_world, "index.html"}},
1> {"/[...]", cowboy_static, {priv_dir, static_world, "",
1> [{mimetypes, cow_mimetypes, all}]}}
1> ]}
1> ]).
[{'_',[],
[{[],[],cowboy_static,{priv_file,static_world,"index.html"}},
{['...'],
[],cowboy_static,
{priv_dir,static_world,[],
[{mimetypes,cow_mimetypes,all}]}}]}]
其实这个路由的意思是如果请求的是/,就路由在priv目录的index.html下面,
否则就直接读取请求的文件。
然后我们开始看cowboy:start_http/4,就是应用启动的主进程,
-module(cowboy). -export([start_http/4]).
-export([start_https/4]).
-export([start_spdy/4]).
-export([stop_listener/1]).
-export([set_env/3]). %%省略若干行 -spec start_http(ranch:ref(), non_neg_integer(), ranch_tcp:opts(),
cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}.
start_http(Ref, NbAcceptors, TransOpts, ProtoOpts)
when is_integer(NbAcceptors), NbAcceptors > 0 ->
ranch:start_listener(Ref, NbAcceptors,
ranch_tcp, TransOpts, cowboy_protocol, ProtoOpts). -spec start_https(ranch:ref(), non_neg_integer(), ranch_ssl:opts(),
cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}.
start_https(Ref, NbAcceptors, TransOpts, ProtoOpts)
when is_integer(NbAcceptors), NbAcceptors > 0 ->
ranch:start_listener(Ref, NbAcceptors,
%%省略若干行
可以看到这里启动ranch,而cowboy_protocol就是定义的用户进程,根据ranch源码(忘记了的参见ranch源码分析)理解,我们知道会启动cowboy_protocol:start_link/4来处理用户的应用数据请求
下面我们就进入cowboy的代码世界,从cowboy_protocol:start_link/4开始
(未完待续~)
cowboy源码分析(一)的更多相关文章
- cowboy源码分析(三)
上接 cowboy源码分析(二) 我们接着分析cowboy_protocol.erl的request/7模块 -module(cowboy_protocol). %% API.-export([sta ...
- cowboy源码分析(二)
接 cowboy源码分析(一) 下面我们重点看看cowboy_protocol.erl代码 -module(cowboy_protocol). %% API. -export([start_link/ ...
- ranch 源码分析(完)
接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
随机推荐
- JDK8 BigDecimal API-创建BigDecimal源码浅析三
第三篇 先介绍以BigInteger为构造参数的构造器 public BigDecimal(BigInteger val) {// 根据BigInteger创建BigDecimal对象 scale = ...
- PeopleSoft 单点登录
第一次会以guest 用户进来,code 为空 第二次也以guest 进来code 从ssoAP获取到code,根据code 获取token,根据token 获取用户id.
- 光圈,快门, 曝光,焦距, ISO,景深。
光圈,快门, 曝光,焦距, ISO,景深. ISO(感光度)与图片质量 ISO -- 感光度,是一个曝光率极高的词,我们在超市买饼干的时候就可能会看见包装袋上写:本公司已通过ISO9001质量体系认证 ...
- sql where 里面判定要加 ' '
WHERE year>=2010 and year<=2017 and indicator_code = 'SE.XPD.TOTL.GD.ZS'
- 配置nginx + keepalived 双主模式(双机互为主备)
- UDP广播-缓冲区过小
上次介绍到了关于客户端实时刷新摄像头所识别的图片的一些方法,采用了了UDP广播的技术做处理.理论上是没有问题的,将客户端运行在不同电脑上也能很好的看到效果,运行日志也没看出啥问题,结果今天翻看日志的时 ...
- Vue 中如何引入第三方 JS 库
一绝对路径直接引入全局可用 二绝对路径直接引入配置后import 引入后再使用 三webpack中配置 aliasimport 引入后再使用 四webpack 中配置 plugins无需 import ...
- java线程学习之yield方法
yield方法是暂停当前正在执行的线程对象,并执行其他线程. 这是一个静态方法,一旦执行,它会使当前线程让出CPU.让出的cpu并不代表当前线程不执行了.当前线程让出CPU后,还会CPU资源的争夺,但 ...
- vue获取路由地址栏url里面的指定参数
this.$route.query.gid //gid是获取指定参数的名字
- js时间相关
let date = new Date(); date.getYear(); //获取当前年份(2位) date.getFullYear(); //获取完整的年份(4位) date.getMonth( ...