美文网首页
初步理解 Rack Application

初步理解 Rack Application

作者: z_k | 来源:发表于2017-03-22 15:31 被阅读0次

    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 来说,可能路由和中间件在此基础上又做了一层包装,有待进一步学习验证。

    相关文章

      网友评论

          本文标题:初步理解 Rack Application

          本文链接:https://www.haomeiwen.com/subject/zewnnttx.html