Rack杂记
07 November 2014
缘起
最近,系统
的学习了一下Rack,收获颇丰。毕竟,全新的概念,从无到有的飞跃。
所谓的系统的学习,其实就是将potian写的Rack编程囫囵吞枣的看了一遍,敲了敲其中的例子,并运行验证了而已。
对于,以后,项目中如何使用,还没个头绪,不过,最要紧的是先收集资料。
rake middleware
Rails早已支持Rack了,可以通过rake middleware
查看项目中使用的中间件。于是,作为对比,分别对公司的项目,Gitlab,Redmine运行了一下,从而得出如下列表:
三者通用的Rack中间件(后来,发现,其中很多都是Rails默认使用的中间件):
use ActionDispatch::Static # 服务静态资源文件
use Rack::Lock # 设置env["rack.multihread"]为false,程序互斥锁
use Rack::Runtime # X-Runtime,请求执行的时长
use Rack::MethodOverride # PUT和DELETE方法
use BetterErrors::Middleware # better error居然是Rack中间件
use ActionDispatch::RequestId # 设置响应的唯一X-Request-Id包头
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp # 欺骗攻击IP
use ActionDispatch::Reloader # 提供准备和清理回调
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement # 请求完成,处理
use ActiveRecord::QueryCache # 查询缓存
use ActionDispatch::Cookies
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::ConditionalGet
use Rack::ETag
use Warden::Manager # Redmine使用的OpenIdAuthentication授权
Redmine特有(Rails 3.2.19):
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001ca22a8> # Rails程序默认的缓存中间件
use ActionDispatch::Session::CookieStore
use ActionDispatch::Head
use ActionDispatch::BestStandardsSupport
use RequestStore::Middleware
Gitlab特有(Rails 4.1.0):
use Rack::MiniProfiler
use Rack::Sendfile
use ActionDispatch::Session::RedisStore
use Rack::Head
use Rack::Attack
use Rack::Cors
use RequestStore::Middleware
公司项目特有(Rails 3.2.13):
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x0000000307c8f0>
use ActionDispatch::Session::CookieStore
use Remotipart::Middleware
use ActionDispatch::Head
use ActionDispatch::BestStandardsSupport
use ClientSideValidations::Middleware::Validators # 客户端验证
use MetaRequest::Middlewares::MetaRequestHandler
use MetaRequest::Middlewares::AppRequestHandler
use Rack::Mongoid::Middleware::IdentityMap
use OmniAuth::Strategies::Weibo # 网站授权相关的Gem包
use OmniAuth::Strategies::QQConnect
use OmniAuth::Strategies::Xiaonei
use OmniAuth::Strategies::LinkedIn
对比了一下,可以得出如下的这些经验:
- Session的存储是通过Rack中间件实现,其存储存在多种方案,CookieStore,RedisStore以及MemcacheStore之类
- Rails不同版本之间处理差异,比如
ActionDispatch::Head
和Rack::Head
- 公司项目Rake执行比Gitlab和Redmine项目的要慢很多,why? 是复杂的表加载的关系
- 运行rake命令,需要加载整个应用程序代码
在《Rails高级编程》中,曾介绍Rails的插件。学习了Rack之后,发现,现阶段,使用Rack中间件要比使用Rails插件更好一些。实际应用中,也没发现多少使用了Rails插件(as_xxx之类的命令)的地方。
注: 前些天听前辈说 Rails存在七层,很是不解,询问了一下,原来说的是中间件。每一个中间件,就是一个包裹层。Rails默认的中间件可是有20个之多的。
后记
果然,Rack是需要仔细认真的学习的一个重要的点。 Rack是HTTP协议的抽象。
傲娇的使用Disqus