6

这是一个普遍的“可用的技术”问题。

我的公司提供了一个带有 RESTful API 的 Web 应用程序。但是,它对我的​​需求来说太慢了,而且一些结果的格式很尴尬。

在此处输入图像描述

我想用代理/适配器服务器包装他们的 RESTful 服务器,所以当你连接到代理时,你会得到 RESTful API,我希望真正的 API 提供。

在此处输入图像描述

所以它需要做几件事:

  • 通过大多数请求
  • 缓存一些请求
  • 在原始服务器上执行一些额外请求以检测请求是否可缓存

在此处输入图像描述

例如:记录中的字段请求: GET /records/id/field 可能很慢,但有一个指纹请求 GET /records/id/fingerprint 总是很快。如果存在指纹的 GET /records/1/field2 缓存feedbeef,那么我需要feed beef在提供缓存版本之前检查原始服务器是否仍然具有指纹。

  • 修复一些响应的标题 - 例如内容类型,基于路径
  • 对一些大型内容进行流处理,例如

获取/记录/id/附件/1234

在此处输入图像描述

以文本格式返回一个 100Mb 的日志文件

从文件中删除空字符可以选择重新编码日志以过滤掉不相关的行,从而减少客户端缓存过滤版本以供以后请求的负载。


虽然我可以修改客户端来实现这个功能,但是这样的代码不能被其他客户端(不同的语言)重用,并且使客户端逻辑复杂化。


我查看了 clojure/ring 是否可以做到这一点,虽然有一个不错的小代理中间件,但据我所知,它不能处理流媒体内容 - 整个 100Mb 都必须下载。而且它还不包括任何缓存逻辑。


我看了一下 squid 是否可以做到这一点,但我对这项技术并不熟悉,而且它似乎主要关心的是传递请求而不是动态修改它们。


我正在寻找可以找到正确技术来实现这一点的提示。如果学习一门新语言能让我获得一种非常简单的方法,那么我主要是语言不可知论者。

4

3 回答 3

1

我相信你应该选择一个更容易实现自定义业务逻辑的平台。以下 Web 应用程序框架提供与 REST API 的轻松连接,并允许您创建可用作 REST 代理的 Web 应用程序:

我对 Play 比较熟悉,我知道它提供了缓存实用程序,您会发现它很有用,并且还可以通过许多插件进行扩展。

如果你熟悉 Scala,你也可以看看Finagle。它是 Twitter 的基础架构团队构建的一个框架,用于提供与协议无关的连接。REST 到 REST 代理可能有点过头了,但它提供了您可能会觉得有用的抽象。

您还可以查看一些 3rd 方服务,例如Apitools,它允许以编程方式(在 lua 中)创建代理。Apirise是一项类似的服务(我是该服务的联合创始人),旨在通过用户友好的 UI 提供类似的功能。

于 2014-04-25T11:38:28.863 回答
1

Beeceptor完全符合您的要求。它插入您的网络应用程序和原始 API 之间以路由请求。

  • 对于缓存一些响应的用例,您可以创建一个规则。这样它就不会到达原始端点。
  • 可以模拟对原始 API 的请求,您可以检查响应
  • 您可以模拟延迟。

(注:这是一个无耻的插件,我是 Beeceptor 的作者,认为它应该对你和其他开发者有所帮助。)

于 2017-11-17T02:58:56.027 回答
0

https://github.com/nodejitsu/node-http-proxy看起来很有用 - 虽然我还不知道它是否可以流式处理进行转码。

于 2013-07-03T17:57:50.553 回答