什么是中间件在Ruby on Rails的上下文中引用?

时间:2010-07-09 23:10:40

标签: ruby-on-rails ruby rack-middleware

我经常在Ruby on Rails的上下文中听到“中间件”一词。究竟是什么?你能提供具体的例子吗?

5 个答案:

答案 0 :(得分:33)

中间件与Rack相关,Rack是Web应用程序的标准Ruby API。由于Rails应用程序现在是Rack应用程序,它们适用于两者。

机架中间件是应用程序服务器(Webrick,Thin,Unicorn,Passenger,...)和实际应用程序(如Rails应用程序)之间的所有内容。它是Web应用程序服务器和应用程序本身之间的pipeline

Rack应用程序的输入是一个“环境”,其中包含所有HTTP请求详细信息(以及更多)。输出是HTTP响应。 中间件层就像过滤器,可以修改输入,输出或两者。 Rails使用中间件到implement some of its features(查询缓存,cookie存储,http方法扩展),但你可以添加自己的。

机架中间件是在使用Rack的Web应用程序中重用简单的Web相关行为的有效方式,无论底层框架如何。如果您的应用程序的一部分添加了功能,但不负责HTTP响应,则它可以作为Rack中间件。

您可以实现为Rack middleware的一些示例包括:

  • HTTP缓存(服务器端和客户端)
  • 登录
  • 验证
  • 监控
  • HTTP标头过滤

另见this SO question

答案 1 :(得分:3)

想象一下,您想要创建一个缓存服务。此缓存服务将是应用程序,因此您可以将它与许多应用程序一起使用。您也想支持许多不同的Web服务器。

请注意它在服务器和框架之间的中间位置如何?这是中间件的一个例子。它不是应用程序逻辑,也不是真正的低级网络资源,而是在两者之间提供服务。一些例子是QoS(服务质量),安全性,缓存......

如果您的服务支持流行的(以及一些不那么流行的)服务器(瘦,webrick)的所有 n ,那将是很好的。如果你支持他们,那么更多的人可以使用你的精彩软件。您可以看到,实现这一点将是一个真正的拖累,您需要使用特殊的服务器特定代码支持每个服务器。

现在这只是问题的一半,因为还有许多Web框架。 Rails是500磅的大猩猩,但还有其他框架,例如Merb和Sinatra。在您的缓存服务中支持这些是另外 m 支持的不同内容。现在你支持 n x m 不同的路径。多么拖累。

输入Rack。 Rack位于框架和服务器之间,为您提供了一个接口,用于为您的缓存服务器编写代码。如果服务器和框架支持机架,而且大部分都支持,您的服务只需要支持机架接口,您就可以获得对机架支持的所有框架和服务的支持。 (这有点像乳胶编译到dvi然后将dvi转换为ps,pdf,....)。您不需要从Merb到WEBrick的转换器以及从Sinata到Thin的转换器。如果您的缓存服务支持机架,则您可以避免差异。

有了这个“窄腰”,m-frameworks在应用程序和服务器之间分支到n-servers之前都会聚集在一起你还可以看到它如何提供添加路由,日志记录,静态服务等功能的好地方绕过解释框架的缓慢等等。

答案 2 :(得分:1)

Rails中间件允许您在到达Rails之前捕获请求或响应,并对其进行修改。 (您位于Rack和Rails之间的中间)。例如,您可以使用返回“image / png”mime类型的每个响应,并在将其移动到Rack以进行服务之前为其添加水印。或者你可以过滤掉你不喜欢的请求,因为某些原因(未经授权,没有标题),永远不要让它们碰到铁轨。或者,您可以在将传递请求传递到rails之前为其添加标头。或者您可以从rails获取响应,如果它是“text / html”,您可以在传递到输出之前压缩html(删除空格等)。 (我正在http://github.com/maxim/html_press

进行实验

这些小应用程序很多,并作为“中间件”插入。

答案 3 :(得分:1)

对4岁儿童的解释:

你还记得你小时候玩过的游戏:"Chinese whispers"吗? (没有种族主义意图 - 这实际上是我今天所称的游戏)。你想告诉你的朋友 - 坐在另一端的朋友,这是一条特别的信息。但你不能直接告诉他或她:你必须将你的信息从一个人传递到另一个人,直到它最终到达他或她。

但更常见的是,你不会发现消息的变化发生在链条中,直到达到终点。例如:

  1. 发起人:“你将永远记住这一天,你几乎抓住了杰克斯派洛船长。”
  2. 第1号人物 - 传递:“你将永远记住你几乎抓住杰克斯派洛船长的那一天。”
  3. 第2号人物 - 传递:“你将永远记住你几乎抓住杰克斯派洛船长的那一天。”
  4. 第3个人 - 传递:“你会记得你抓到Jack Sparrow上尉的那一天。”
  5. 第4个人 - 传递:“你会记得Jack Sparrow上尉。”
  6. 收到最终消息:“记住”
  7. 中间件基本上是你们之间的人,消息的发起者,以及收到的最终消息:注意他们如何改变或过滤消息?简而言之,这就是中间件的全部内容。虽然这种神学很紧张,但希望这能为你提供一个理解上述技术答案的依据。

答案 4 :(得分:-1)

查看CodeRack有助于了解一些可能性。现在当你要求你经常在Ruby on Rails的上下文中听到它时,你是否更普遍地问中间件是什么?