初步理解 Rack Application

2017-03-22  本文已影响0人  z_k

Rack 是 web 服务器和应用程序接口的抽象。一个最基本的 Rack Application 是一个能够响应 call 方法的对象。该方法返回一个数组 [status, {header}, [body]] 。例如,像下面这样就可以创建一个最简单的 Rack 应用程序。

Rack::Server.start(
  :app => lambda do |e|
    [200, {'Content-Type' => 'text/html'}, ['hello world']]
  end
)

Rack::Server 内部的构造主要由两个类 Rack::Builder Rack::Handler 实现。
Rack::Builder 负责构造 APP ,所谓的 APP 即是任何能够响应 call 方法,并返回 [status, {header}, [body]] 数组的对象。在 Rails 里这个 APP 就是我们自己的 Rails::Application 实例。Rack::Builder 通过 to_app 方法将作为参数传递进来的 app 包装,即穿过所有中间件,然后把 app 传递给 Rack::Server 的 app,最终传递给 server 。
同时,这个类还负责路由和中间件的管理和执行。中间件可以通过 use 方法添加。中间件实际上是一个能响应 call(env) 方法的类,其构造函数接收一个 app 对象作为参数,实际上它的作用相当于在请求的过程中,不断包装 app ,不断往 call 方法里添加内容,它构成了一连串的 call 调用。路由可以通过 map 添加,保存在 @map 里,它是请求路径与 rack app 的对应。

Rack::Builder.app do
  map '/' do
    run Heartbeat
  end
end

不知道 Rails S 的路由机制与这个有没有什么关系,Rails 的路由在什么地方加载的?

Rack::Handler 负责选择服务器和启动服务器。以 puma 为例,它提供了一个 run 方法用来启动服务器,该方法以 app 对象为参数。app 对象的 call(env) 方法应该就是由服务器内部调用的,env 参数也来自服务器。

总的来说,Rack::Server 负责了服务器选择和管理,如启动和关闭;中间件和路由的管理、执行。它在 webserver 和应用程序之间建立了标准接口,定义了 app 的统一模式。对于 rails 来说,可能路由和中间件在此基础上又做了一层包装,有待进一步学习验证。

上一篇下一篇

猜你喜欢

热点阅读