WebSocket 的 API 网关

2023-12-28

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

  1. 分析并识别来自某些IP的异常请求
  2. 配额和速率限制
  3. 统计数据
  4. 免费或商业
  5. 性能稳定

我的WebSocket的子协议是WAMP,所以恐怕没有现有的产品可以完成这项工作。

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

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

这个办法听起来可行。但代理似乎不支持重用上游连接monitor.

假设从 proxy 到客户端建立了 10K 个连接,那么 proxy 也建立了 10K 个连接作为上游到monitor应用程序?这是不可接受的。

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

有没有什么代理或产品可以满足这个要求,这样我就只需要开发更少的东西?


(长话短说……抱歉!)
我正在开展一个与 G-WAN 非常相似的项目。最初,我编写了 API servlet,它运行得很好,但没有充分利用 G-WAN 功能。在 G-WAN 支持的一些指导下,我开始探索处理程序的使用;我将 API servlet 移植到处理程序中的 URL 重写例程(API 查询返回的绝大多数内容是静态/预渲染内容)。我现在正在开发一个 404 处理程序例程来捕获我们尚未预渲染内容的情况,将它们转换为按需渲染请求并动态构建响应。

从客户端来看,这一切看起来都是动态的。但是,通过对静态路径进行 URL 重写并允许 G-WAN 调度我们的按需案例,它减少了我们必须编写的代码量,并利用了 G-WAN 中的一些高度优化的功能。我提到这些细节是作为吉尔所说的“打破模式”的一个例子。最初,我们的方法看起来很像我们如何使用 nginx 进行实现(除了不需要像 fcgi 这样的网关)。尽管一旦我们精简到要求并扔掉了很多假设关于如何构建 Web 服务。

如果您计划使用 C++ 进行开发,请注意一点。从 G-WAN 到外部库的链接是“C”而不是“C++”。他们这样做是出于性能和内存占用的原因(不错的选择),但当我开始用 C++ 编写一些库例程时,我并没有完全考虑到这一点,我打算从我的 G-WAN servlet 和处理程序中引用这些例程,除了从各种 C++ 应用程序中引用。它不是一个令人惊叹的东西——有大量的“C”库可以很好地与 C++ 应用程序配合使用。但从 servlet 通过 G-WAN 的“C”链接引用动态 C++ 类库 (.so) 会很麻烦。 (我的简单解决方法是将我的“共享”C++ 代码移至 .h 文件中,然后将它们包含到我的 G-WAN 处理程序和 servlet 以及我的 C++ 应用程序中。虽然不干净,但很方便。)

从 G-WAN 的角度来看,您有 5 个具体观点:

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

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

  3. Ditto.

  4. 是的。 :) 取决于您想要的支持级别。如果您完全依赖 SO 和其他社区支持,则免费。我们选择了廉价的支持订阅,并且得到的回应远远超出了我们的预期。

  5. 哦耶!我们在最初几天就确认了这一点。

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

欲了解更多信息:

  • G-WAN 协议处理程序 http://gwan.com/developers#tab3
  • G-WAN 用户手册 http://gwan.com/archives/gwan_linux.pdf(从第34页左右开始)
  • 处理程序状态 http://gwan.com/api#handlers
  • 从 servlet、处理程序调用库函数 http://gwan.com/faq#call_libraries
  • 并查看 G-WAN 安装包的 handlers 文件夹中的示例。

祝你好运!
Ken

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket 的 API 网关 的相关文章

随机推荐

  • Netbeans 中的删除线是什么意思?

    在 Netbeans 中用 strikethrough 编写的内容意味着什么 例如getObject在下面的例子中 版本 Netbeans 6 8 该方法已被弃用 即被更新的方法取代 您可能应该使用它 换句话说 为了某些向后兼容性 您调用的
  • 重试地理定位请求而不刷新浏览器

    我对 Geolocation api 有一个具体问题 这是我的场景 用户登陆的页面 在 Chrome Android 中 禁用了 GPS 位置 页面上有一个按钮 按钮的onClick触发Geolocation getCurrentPosit
  • Rails 3 迁移:(非主键)列上自动增量?

    我正在寻找一种方法来创建一个像自动 id 列那样自动递增的列 我可能可以在模型中以某种方式处理这个问题 但这看起来很笨拙 我还没有在 Rails 3 中找到任何可以处理这个问题的东西 有没有可用的宝石可以处理这个问题 我很惊讶它还不是一个选
  • SCIPY - 构建约束而不单独列出每个变量

    我正在使用 SCIPY 来优化使用远期价格的存储设施 交易期限为 1 年 根据每月价差 例如 3 月 21 日与 5 月 20 日价差 是否足够高以覆盖可变运营成本 可以从该设施注入和提取天然气 附图代表了问题 这里的值是任意的 与代码中的
  • 基于原型继承的语言中的类使用

    The 以下回答这个问题 https stackoverflow com questions 186244 what does it mean that javascript is a prototype based language很好地
  • 分解字符串并为带有分隔符前面文本的数组设置键?

    有没有办法接受这样的输入 testing one two three setting more testing 并得到这样的东西 array testing one two three array setting more testing
  • 为什么 `map.has()` 不充当类型保护

    我遇到了以下问题 在我的应用程序中 我有一个Map其中一组 lambda 函数与一些函数配对Roles 每个 lambda 需要一个secondParameter并返回一个settings object enum Role ROLE 1 r
  • unity:游戏对象不可见?

    我组合了两个可以显示透明度和截止 Alpha 的着色器 它工作得很好 只有两个小问题 1 在某些特定的摄像机角度下 对象的截止区域是可见的 仅当具有相同着色器的另一个对象位于该对象后面时 2 如果我淡出一个对象 它会变得黑色而不透明 我是着
  • 具有加密/密码保护的 SQLite

    我刚刚学习使用 SQLite 我很好奇这是否可能 数据库文件加密 密码保护数据库的打开 附言 我知道有这个 SQLite Encryption Extension SEE 但根据文档 SEE 是许可软件 和 SEE 永久源代码许可证的成本为
  • IE11间歇性不加载页面

    我们的许多用户报告说 他们在使用 IE11 访问我们的网站时遇到空白页面 有时他们甚至没有得到空白页面 浏览器只是停留在最后访问的页面上 这些用户可以毫无问题地访问其他域 例如 google com 对于出现故障的浏览器 如果这些用户在 I
  • Woocommerce 结账页面内部服务器错误

    我在 woocommerce 的结帐页面中遇到 500 内部服务器错误 虽然订购简单的产品 但它工作正常 但是当与可预订产品一起使用时 预订订单将保存在管理面板中 邮件也会发送 但订单收据不会显示在结帐页面中 在此 wc ajax chec
  • 根据 MA​​TLAB 中的数据值使用标记填充颜色

    我正在使用 matlab 绘制三个数据系列 例如 0 4545 0 7676 10 0 3232 0 5432 20 假设这是一个 100 x 3 矩阵 我们称其为A 也是根据A 1 排序的 第三列是一个附加数字 范围从1到100 我正在使
  • Jacoco:查找外部测试的代码覆盖率

    我最近在 eclipse 中使用 EclEmma 插件来查找应用程序中 JUnit 的代码覆盖率 效果非常好 在下一步中 我希望能够找到从外部调用我们的应用程序的端到端测试 功能测试的代码覆盖率 它们驻留在单独的服务器上 基本上 我们将应用
  • 如何检测HTML5视频是否暂停缓冲?

    我正在尝试测试视频是否断断续续 我注意到pause当视频暂停缓冲时 不会触发事件 检测视频是否已暂停缓冲的最佳方法是什么 我通过检查玩家的进度来做到这一点x毫秒 例如50 如果玩家的进步没有达到预期 那么我们就会进行缓冲 这是相当可靠的 因
  • 在 MySQL 中使用 LIMIT 根据列值限制结果 (PHP/MySQL)

    我多次搜索这个问题的答案 在 SO 和其他地方 但没有找到真正符合我需求的答案 如果有 我提前道歉 我有一个使用 PHP 的查询 它从数据库 WordPress 返回一个数组 基本上我想做的是查看列的值 然后根据该值进行 LIMIT 这是为
  • Python - 成功使用 Cookie

    当我尝试使用 facebook cookie 在 facebook 上打开登录帐户时 import urllib2 urllib cookielib jar cookielib CookieJar cookie urllib2 HTTPCo
  • PHP array_rand 返回唯一键吗?

    如果我打电话array rand array 100 它是否可以避免多次选择相同的键 是的 在one调用的返回集应该是唯一的
  • 将日期组件(整数)转换为字符串

    我的代码采用 NSDate 并读取年 月和日 然后将它们串在一起作为一个整数 接下来我想将这个 Int 转换为 String 以便可以将其插入 URL String 但没有成功 let calendarUnits NSCalendarUni
  • 如何将 CKEditor 集成到 Asp.net MVC 中

    Saw 这个帖子 http www codeproject com KB aspnet fckeditor aspx在 FCKEditor 的 CodeProject 上 有人可以解释一下新版本的情况吗 实际上这很容易做到 首先从官网下载最
  • WebSocket 的 API 网关

    我的 websocket 应用程序需要一个 API 网关 分析并识别来自某些IP的异常请求 配额和速率限制 统计数据 免费或商业 性能稳定 我的WebSocket的子协议是WAMP 所以恐怕没有现有的产品可以完成这项工作 我打算开发一个并假