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::HeadRack::Head
  • 公司项目Rake执行比Gitlab和Redmine项目的要慢很多,why? 是复杂的表加载的关系
  • 运行rake命令,需要加载整个应用程序代码

在《Rails高级编程》中,曾介绍Rails的插件。学习了Rack之后,发现,现阶段,使用Rack中间件要比使用Rails插件更好一些。实际应用中,也没发现多少使用了Rails插件(as_xxx之类的命令)的地方。

注: 前些天听前辈说 Rails存在七层,很是不解,询问了一下,原来说的是中间件。每一个中间件,就是一个包裹层。Rails默认的中间件可是有20个之多的。

后记

果然,Rack是需要仔细认真的学习的一个重要的点。 Rack是HTTP协议的抽象。




傲娇的使用Disqus