https://github.com/celluloid/reel/wiki/Basic-Usage

Reel 为高性能应用提供了一组低阶的  Ruby API 。 如果你试图像使用 Unicorn 或 Puma 那样,将 Reel 直接作为一个 web server使用,那你最好再看看  Reel::Rack
下面是一段简单示例,用于展示如何使用 Reel 创建一个简单的  "Hello World" web server:

  1. require 'reel'

  2. Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
  3.   connection.each_request do |request|
  4.     request.respond :ok, "hello, world!"
  5.   end
  6. end
让我们逐行分析,看看他做了什么:

依赖:

  1. require 'reel'

This pulls in the following dependencies:

  • Celluloid: 使用 Ruby 编写的基于 Actor Model 的并发对象框架。 Reel servers 实现为一个 Celluloid actors。每一个 server 都是一个并发对象,运行在自己的线程中。
  • Celluloid::IO:  Celluloid 的事件驱动 I/O。类似于  EventMachine 或 Node.js,不过 Fibers 取代了回调函数,而且 Celluloid actors 间可以无缝通信。 内部的 Celluloid::IO 使用了基于 nio4r的 reactor,因此可以实现类似 epoll 和 kqueue 的高性能(在一个单线程中可以处理海量的文件描述符等待事件)。这意味着 Reel 非常适合作为 用于处理大量的 idle connections的 servers,比如流服务器或者 Websockets 服务器。
启动 Reel::Server::HTTP

Reel::Server::HTTP 实现为一个 Celluloid actor,而且类似 EventMachine 和 Node.js,通过使用  Celluloid::IO 即可用一个单线程处理多个网络接入。

  1. Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
这里调用的 #run 方法是由 Celluloid 自身定义的。它告诉 Celluloid 开启一个 actor,然后将主线程关联在它上面,并将这个 server actor 置于前端运行。其中的参数将传递至 Reel::Server::HTTP#initialize 方法。

Reel's initialize 被传入的参数 127.0.0.1 和 3000,指明其绑定到  localhost 和 3000 端口。

最后,我们将 connection 参数传入代码块。connection 是一个 Reel::Connection 对象,代表客户端接入到 Reel 的一个连接。

对 Reel::Requests 进行迭代


  1. connection.each_request do |request|
客户端连接可能使用了HTTP keepalive 或 pipelining,因此一个连接可能发出多个 request 。为支持此 HTTP 特性,我们使用 #each_request 在 connection 上进行迭代。 

每个 request 在这里都是 Reel::Request 对象。每个 request 都包含所有信息:如动作,请求的 URI,headers,body 等等。这只是一个简单示例,因此我们暂时将这些忽略。

发送 responses

现在我们已经有了一个 request,我们需要作出响应 (respond)! 这个程序很简单,因此我们不管 request 是什么,统统响应一个 "hello world"。
我们调用 Reel::Request 的  #respond 方法,参数包含一个我们要发送的响应类型。

  1. request.respond :ok, "hello, world!"
我们需要了解的事实真相是 #respond 只不过是一个快捷方式,用于构造一个 Reel::Response 对象 (you can see where that happens in connection.rb).

这行代码发送一个  HTTP/1.1 200 OK 响应至客户端,body 内容为 "hello, world!"

  • 参考:Responses 获取关于发送 responses 的更多信息。

09-04 13:02