Reel 为高性能应用提供了一组低阶的 Ruby API 。 如果你试图像使用 Unicorn 或 Puma 那样,将 Reel 直接作为一个 web server使用,那你最好再看看 Reel::Rack。
下面是一段简单示例,用于展示如何使用 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
依赖:
- 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 实现为一个 Celluloid actor,而且类似 EventMachine 和 Node.js,通过使用 Celluloid::IO 即可用一个单线程处理多个网络接入。
- Reel::Server::HTTP.run('127.0.0.1', 3000) do |connection|
Reel's initialize 被传入的参数 127.0.0.1 和 3000,指明其绑定到 localhost 和 3000 端口。
最后,我们将 connection 参数传入代码块。connection 是一个 Reel::Connection 对象,代表客户端接入到 Reel 的一个连接。
对 Reel::Requests 进行迭代
- connection.each_request do |request|
每个 request 在这里都是 Reel::Request 对象。每个 request 都包含所有信息:如动作,请求的 URI,headers,body 等等。这只是一个简单示例,因此我们暂时将这些忽略。
- 参考 Requests 了解更多信息
发送 responses
现在我们已经有了一个 request,我们需要作出响应 (respond)! 这个程序很简单,因此我们不管 request 是什么,统统响应一个 "hello world"。
我们调用 Reel::Request 的 #respond 方法,参数包含一个我们要发送的响应类型。
我们调用 Reel::Request 的 #respond 方法,参数包含一个我们要发送的响应类型。
- request.respond :ok, "hello, world!"
这行代码发送一个 HTTP/1.1 200 OK 响应至客户端,body 内容为 "hello, world!"
- 参考:Responses 获取关于发送 responses 的更多信息。