rack是ruby服務(wù)器和rack應(yīng)用程序之間的一個(gè)框架,rails,sinatra都是基
于rack構(gòu)建的,都屬于rack應(yīng)用程序。
rack提供了一個(gè)標(biāo)準(zhǔn)的接口,用于與服務(wù)器進(jìn)行交互。標(biāo)準(zhǔn)的rack程序
是一個(gè)可以響應(yīng)call的對(duì)象,可以是對(duì)象、Proc、lambda甚至是method,
它接收env參數(shù)(環(huán)境對(duì)象),返回一個(gè)數(shù)組,數(shù)組包括:
- 狀態(tài)(status),http響應(yīng)狀態(tài)碼
- 可以是hash,為http的header信息
- 擁有each方法的對(duì)象,each返回字符串
rack通過(guò)中間件來(lái)進(jìn)行擴(kuò)展,即對(duì)原始的rack程序進(jìn)行裝飾,
在原有返回?cái)?shù)組的基礎(chǔ)上進(jìn)一步處理,并返回rack對(duì)象
簡(jiǎn)單的rack程序
require 'rack'
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run app
使用中間件的rack程序
require 'rack'
class Decorator
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
new_body = "from middleware input <br/>"
body.each{|str| new_body << str}
headers['Content-Length'] = new_body.bytesize.to_s
[status, headers, [new_body]]
end
end
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run Decorator.new(app)
上面使用中間件的方法在使用多個(gè)時(shí)容易混亂,rack有一個(gè)Builder類可以有效管理
使用如下
require 'rack'
require 'decorator'
app = Rack::Builder.new{
use Rack::ContentLength
use Decorator
run lambda {|env| [200, {"Content-Type"=>"text/html"}, ["hello world"]]}
}.to_app
Rack::Handler::WEBrick.run app
使用Rack::Builder的map方法,可以創(chuàng)建有路由的rack程序
require 'rack'
app = Rack::Builder.new {
map '/hello' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["hello"]] } end
map '/world' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["world"]] }
end
map '/' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["all"]] } end
}.to_app
Rack::Handler::WEBrick.run app, :Port => 3000
由于rails的全棧性,rack中間件很多,在一些高并發(fā)但業(yè)務(wù)簡(jiǎn)單的網(wǎng)站或api使用時(shí)
響應(yīng)時(shí)間過(guò)長(zhǎng),在這種情況下可以考慮使用rack或者sinatra。
轉(zhuǎn)載請(qǐng)注明出處:me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1/