Reel 为高性能应用提供了一组低阶的 Ruby API 。 如果你试图像使用
Unicorn 或 Puma 那样,将 Reel 直接作为一个 web server使用,那你最好再看看 。
下面是一段简单示例,用于展示如何使用 Reel 创建一个简单的 "Hello World" web server:
-
require 'reel'
-
-
Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
-
connection.each_request do |request|
-
request.respond :ok, "hello, world!"
-
end
-
end
让我们逐行分析,看看他做了什么:
依赖:
This pulls in the following dependencies:
-
: 使用 Ruby 编写的基于 Actor Model 的并发对象框架。 Reel servers 实现为一个 Celluloid actors。每一个 server 都是一个并发对象,运行在自己的线程中。
-
: Celluloid 的事件驱动 I/O。类似于 EventMachine 或 Node.js,不过用 Fibers 取代了回调函数,而且 Celluloid actors 间可以无缝通信。 内部的 Celluloid::IO 使用了基于 的 reactor,因此可以实现类似 epoll 和 kqueue 的高性能(在一个单线程中可以处理海量的文件描述符等待事件)。这意味着 Reel 非常适合作为 用于处理大量的 idle connections的 servers,比如流服务器或者 Websockets 服务器。
启动 Reel::Server::HTTP
Reel::Server::HTTP 实现为一个 Celluloid actor,而且类似 EventMachine 和 Node.js,通过使用 Celluloid::IO 即可用一个单线程处理多个网络接入。
-
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 进行迭代
-
connection.each_request do |request|
客户端连接可能使用了
或 ,因此一个连接可能发出多个 request 。为支持此 HTTP 特性,我们使用 #each_request 在 connection 上进行迭代。
每个 request 在这里都是 Reel::Request 对象。每个 request 都包含所有信息:如动作,请求的 URI,headers,body 等等。这只是一个简单示例,因此我们暂时将这些忽略。
发送 responses
现在我们已经有了一个 request,我们需要作出响应 (respond)! 这个程序很简单,因此我们不管 request 是什么,统统响应一个 "hello world"。
我们调用 的 #respond 方法,参数包含一个我们要发送的响应类型。
-
request.respond :ok, "hello, world!"
我们需要了解的事实真相是 #respond 只不过是一个快捷方式,用于构造一个 对象 (you can ).
这行代码发送一个 HTTP/1.1 200 OK 响应至客户端,body 内容为 "hello, world!"
-
参考: 获取关于发送 responses 的更多信息。
阅读(1638) | 评论(0) | 转发(0) |