WebSocket的API网关

时间:2015-05-28 01:53:10

标签: nginx proxy haproxy g-wan 3scale

我的websocket应用程序需要一个API网关。

  1. 分析并识别来自某些IP的异常请求
  2. 配额和速率限制
  3. 统计
  4. 免费或商业
  5. 稳定的表现
  6. 我的WebSocket的子协议是WAMP,所以我担心没有现成的产品可以完成这项工作。

    我打算开发一个,并假设它将以这种方式工作:

    enter image description here

    • 我的客户端应用程序和我的websocket服务器之间安装了代理(NGINX或HAProxy)
    • 代理将请求/响应复制到另一个应用,我称之为monitor
    • monitor应用分析流量并控制代理以限制/阻止某些IP。
    • monitor应用程序并行运行,如果它已关闭,则不会影响我的应用程序和代理。

    这种方法听起来很可行。但代理似乎不支持重用上游连接到monitor

    假设从代理到客户端建立了10K连接,那么代理还建立了10K连接作为monitor app的上游连接?这是不可接受的。

    我希望在代理和monitor之间只建立一个或多个连接来发送重复的请求/响应。当然,代理会通知monitor每个请求/响应的真实源/目标。

    是否有任何代理或产品满足此要求,以便我只需要减少开发?

2 个答案:

答案 0 :(得分:0)

G-WAN protocol handler将允许您通过单个连接(或每个工作线程的连接以实现更高的可伸缩性)实现 Multiplex 请求的此类代理。

这就是G-WAN变得简单:打破模具以创建定制解决方案。

答案 1 :(得分:0)

(TL; DR ......对不起!)
我正在开展一个与G-WAN非常相似的项目。最初,我编写了API servlet,它运行良好并没有充分利用G-WAN功能。通过G-WAN支持的一些指示,我开始探索处理程序的使用;我将API servlet移植到处理程序中的URL重写例程(为API查询返回的绝大部分内容是静态/预呈现内容)。我现在正致力于404处理程序例程,以捕捉我们尚未预先呈现内容的情况,将它们转换为按需渲染请求并动态构建响应。 / p>

从客户端来看,它看起来都非常动态。但是通过对静态路径进行URL重写并允许G-WAN分发我们的按需案例,它减少了我们必须编写的代码量,并利用了G-WAN中的一些高度优化的功能。我提到这些细节是吉尔所说的打破模式的一个例子。"最初我们的方法看起来很像我们如何使用nginx进行实现(除了不需要像fcgi这样的网关)。虽然一旦我们剥离了要求并抛弃了关于​​如何构建Web服务的许多假设,这已经有了相当大的改进。

如果您计划使用C ++进行开发,请注意一点。从G-WAN到外部图书馆的联系是" C"而不是" C ++"。他们做了这个性能和内存占用的原因(很好的选择),但当我开始用C ++编写一些库例程时,我还没有想到这一点,我打算从我的G-WAN servlet和处理程序中引用它们从各种C ++应用程序引用。这不是一个表明 - 很多" C"那里的库可以很好地与C ++应用程序一起工作。但是通过" C"引用动态C ++类库(.so)会很麻烦。从servlet通过G-WAN进行链接。 (我的简单修复是将我的共享" C ++代码移动到.h文件中,并将它们包含在我的G-WAN处理程序和servlet中,以及我的C ++应用程序中。不干净,但是权宜之计。)

从G-WAN的角度来看你的5个具体要点:

  1. 根据您对"分析"的定义和"不寻常"这可以在协议处理程序中使用C / C ++轻松完成,也可以使用外部库。如果阻塞是个问题,有多种方法可以实现异步,或者只是单独的进程,或者只是非阻塞I / O.

  2. 也可以通过处理程序轻松管理。

  3. 同上。

  4. 是。 :)取决于你想要的支持水平。如果您完全依赖SO和其他社区支持,则免费。我们选择了便宜的支持订阅,而且回复远远超出了我们的预期。

  5. 哦,是的!我们在最初几天证实了这一点。

  6. 哦,最后一件事:一旦你花了一两个小时编写一些G-WAN servlet,你可能很难回到其他网络/应用程序/服务机制。使用servlet,我只需从编辑器中保存更改并在浏览器窗口中点击刷新以查看新结果(尝试使用fcgi实现!)。我在我的服务器上运行了多个G-WAN实例(配置了不同的IP地址和端口号),所以在一台机器上,我有多个阶段的开发代码库,还有一个生产服务器。对于开发,我在终端会话中运行G-WAN(而不是作为守护进程),并且可以在我的servlet和处理程序代码中使用printf(...)来查看后端发生的情况与发生的情况我的浏览器窗口。

    欲了解更多信息:

    祝你好运!