2018 年 1 月 31 日,星期三

Rails 5.2.0 RC1:Active Storage、Redis Cache Store、HTTP/2 早期提示、CSP、Credentials

由 dhh 发布

距离 Rails 5.2 的第一个 beta 版本 发布已经两个月了,这段时间以来,我们对该版本进行了大量的改进、优化和调整,使其成为第一个候选发布版本。

我们的重点功能,全新的 Active Storage 框架,已经扩展了更深入的内容类型识别,以及许多其他改进。它还在 Basecamp 和其他地方进行了几个月的实际生产环境的压力测试。它是一个非常稳健的开箱即用框架。

在 beta 测试期间,我们还设法加入了一些额外的改进。比如极快的 fixture 加载Active Job 丢弃时的自定义错误处理,以及开发环境下的 Active Record 查询的调用点日志记录。轮子永不停歇!

所以我们即将完成。Basecamp 和许多其他公司已经在使用 Rails 5.2 beta 版本进行生产环境的开发了几个月。我们的目标是,根据可能出现的 bug 的严重程度,在二月底之前发布下一个候选版本或最终版本。但既然这是一个候选发布版本,我们将立即将 rails/master 分支迁移到 rails/5-2-stable,从而解放 rails/master 分支,用于 Rails 6.0 的开发。

再次感谢所有继续为 Ruby on Rails 倾注爱与支持的各位!

Rails 5.2 的亮点回顾(来自 beta 版本公告)

在 Rails 中处理文件上传问题已经持续太久了。当然,一直有很多不错的插件可用,但将其集成到框架中已经势在必行。现在我们做到了!

在 Rails 5.2 的新 Active Storage 框架中,我们解决了直接将文件上传到云端的现代方法。开箱即用,支持 Amazon S3、Google Cloud Storage 和 Microsoft Azure Cloud File Storage。

如果您处理图像,可以实时创建变体。如果您处理视频或 PDF,可以实时创建预览。并且无论什么类型,都可以异步分析上传内容以提取元数据。

Active Storage 是由 George Claghorn 和我本人从 Basecamp 3 中提取出来的。因此,该框架不仅已经在生产环境中使用,而且诞生于生产环境。这无疑是一枚“提取设计”的保证印章!

说到提取,Jeremy Daer 已经解决了我们在 Basecamp 使用 Redis 进行通用部分、片段和其他 Rails 缓存工作的长期混杂做法。现在有一个全新的 Redis 缓存存储,它将多年来积累的经验整合到一个统一的单元中,供任何人使用。

这个新的 Redis 缓存存储支持 Redis::Distributed,用于跨 Redises 进行类似 Memcached 的分片。它具有容错性,会将故障视为缓存未命中,而不是通过异常中断请求。它甚至支持分布式的 MGETS,以实现完整的片段集合缓存功能。

配合 密钥回收压缩 这两项默认提供的功能,缓存效率有了巨大的飞跃。对于 Basecamp 来说,这意味着缓存生命周期提高了两个数量级!我们从缓存只能维持一天变成可以维持数月。如果您使用片段缓存和嵌套策略,这两项改进将大大延长您的缓存生命周期。

通过 Aaron Patterson 和 Eileen Uchitelle 的工作,我们还通过 早期提示拥抱了 HTTP/2 的精髓。这意味着我们可以自动指示 Web 服务器尽早发送所需的样式表和 JavaScript 资源。这带来了更快的整页加载速度,谁不想要呢?

在性能方面,Rails 现在默认在 Gemfile 中包含了由我们的朋友 Shopify 开发的 Bootsnap。它通常可以将应用程序启动时间缩短 50% 以上。

Rails 一直走在让 Web 应用程序更安全的the forefront,通过内置的 CSRF 和 XSS 保护引领潮流,在 Rails 5.2 中,我们通过添加一个新的 DSL 进一步增强了这一点,该 DSL 允许您为应用程序配置 内容安全策略。您可以配置一个全局默认策略,然后按资源基础覆盖它,甚至可以使用 lambda 来将每个请求的值注入到标头中,例如多租户应用程序中的帐户子域。

但这并非全是新的光鲜亮点。在 Rails 5.1 中,我们添加了 加密密钥。这些密钥就像旧密钥一样,但,嗯,更秘密,因为,您知道,是加密的!令人困惑?是的。为什么您会想要不那么秘密的密钥?嗯,您不会。

在 Rails 5.2 中,我们纠正了这个混乱,弃用了两种不同类型的密钥,并引入了一个新的共享概念,称为 Credentials。Credentials,例如 AWS 访问密钥和其他形式的登录凭据和密码,是密钥的主要用例,所以为什么不直接称其为“凭据”呢?所以就是凭据!

Credentials 始终是加密的。这意味着将它们提交到版本控制是安全的,只要您不将密钥也提交进去。这带来了原子部署、无需处理大量的环境变量,以及其他将应用程序所需的所有凭据集中在一个安全地方的好处。

此外,我们还公开了 Credentials 的底层 API,以便您可以轻松处理其他加密配置、密钥和文件。

自 Rails 5.1 以来,我们在 Webpacker 方面也取得了长足的进步。因此,Rails 5.2 将与新的 Webpacker 3.0 版本完美搭配。Rails 已通过由 Webpack 运行的预配置构建管道完全拥抱了现代 JavaScript。我们将继续加强这种关系。