Rack系列: 1Rack的协议和实现(网上牛文的摘录和笔记)4-7日第一篇

 Rack协议

 用途:把外界的web请求通过这个协议解析成三部分:status, the headers ,and the body.

 A Rack application is a Ruby object (not a class) that responds to call. It takes exactly one argument, the environment and returns an Array of exactly three values: The status, the headers, and the body.

 rack-app

 遵守Rack协议的应用框架,就可以称为RackApp.

 不止是Rails,几乎所有的Ruby的web框架都是一个Rack的应用。

 

中间件

Rack协议和中件件是Rack达到今天地位的重要的2个特性。Rack协议规定了webserver和Rack应用之间应该如何通信,而中间件能够在上层改变http的响应或者请求,在不改变应用的基础上为Rack应用增加新的功能。 

中间件是一个类,有两个方法.initialize和#call。 

 

wrapped-app 

 所有的请求都会先经过中间件,每一个中间件都会在 #call 方法内部调用另一个中间件或者应用,在接收到应用的返回之后会分别对响应进行处理最后由最先定义的中间件返回。

 

Rails 和 Rack


Rails 应用就是一堆 Rake 中间件和一个 Rack 应用的集合,在任意的工程中我们执行 rake middleware 的命令都可以得到以下的输出:
use Rack::Sendfile

 

use ActionDispatch::Static
use ActionDispatch::Executor
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Depot::Application.routes

最后这行是RouteSet实例 对象,也就是说Rails所有请求在经过中间件之后都会交给这个路由表来处理,路由根据规则(如:对url网址的解析,判断controller和action)将请求交给不同的controllers处理。

 rails-application

 

总结:

Rack 协议可以说占领了整个 Ruby 服务端的市场,无论是常见的服务器还是框架都遵循 Rack 协议进行了设计,而正因为 Rack 以及 Rack 协议的存在我们在使用 Rails 或者 Sinatra 开发 Web 应用时才可以对底层使用的 webserver 进行无缝的替换,在接下来的文章中会逐一介绍不同的 webserver 是如何对 HTTP 请求进行处理以及它们拥有怎样的 I/O 模型。

 

本文摘录于博客draveness.me/rack 。

 

posted @ 2018-04-07 15:50  Mr-chen  阅读(256)  评论(0编辑  收藏  举报