前段时间导读了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源码分析(一)的更多相关文章

  1. cowboy源码分析(三)

    上接 cowboy源码分析(二) 我们接着分析cowboy_protocol.erl的request/7模块 -module(cowboy_protocol). %% API.-export([sta ...

  2. cowboy源码分析(二)

    接 cowboy源码分析(一) 下面我们重点看看cowboy_protocol.erl代码 -module(cowboy_protocol). %% API. -export([start_link/ ...

  3. ranch 源码分析(完)

    接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ ...

  4. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  5. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  6. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  7. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  8. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  9. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

随机推荐

  1. BigDecimal源码

    1 public BigDecimal(char[] in, int offset, int len, MathContext mc) {// 使用字符数组的构造方法,一般我们推荐使用的是一Strin ...

  2. oracle删除数据库

    1.确认当前数据库是否为要删除的那一个select name from v$database; 2.关闭数据库shutdown immediate; 3.以restrict方式重新打开数据库,并启动到 ...

  3. final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  4. Spring Boot默认的JSON解析框架设置

    方案一:启动类继承WebMvcConfigurerAdapter,覆盖方法configureMessageConverters ... @SpringBootApplication public cl ...

  5. redis 在 php 中的应用(key篇)

    本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: KEY(键) DEL           ...

  6. Linux下使用acme.sh 配置https 免费证书

    acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...

  7. 如何实现win7系统多用户同时远程登录

    使用Win7系统的时候,不同的管理账号远程登录桌面时,会把远程登录的人给记下来.如何设置Win7让两个账号的两会话同时存在,且相互之间不冲突. 方法/步骤     第一步:创建需要远程的两个用户账号. ...

  8. 使用littleTools简化docker/kubectl的命令

    littleTools littleTools是我根据日常运维时编写的一个小工具,开源在了https://github.com/xuxinkun/littleTools上. littleTools包含 ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

  10. JavaWeb网上商城项目中sql语句问题的解决

    出现的问题 解决方法 对ProductDaoImpl建立Junit测试得到问题所在 学到了 Junit case测试验证和debug分步执行 mysql是关系型数据库.Redis是非关系型数据库且比m ...