【问题标题】:Restful communication between local applications is a good idea?本地应用程序之间的安静通信是一个好主意吗?
【发布时间】:2010-10-23 04:57:19
【问题描述】:

我想知道让本地应用程序(在同一服务器中)完全通过 Restful API 相互通信是否是个好主意?

我知道这并不罕见,因为我们已经有像 CouchDB 这样使用 HTTP REST 进行通信的应用程序,即使是本地应用程序也是如此。

但我想通过创建类似于更大应用程序的模块的应用程序将其提升到更高的水平,该模块也可以是另一个应用程序的模块,依此类推。换句话说,会有很多本地应用程序/模块与 Restful API 进行通信。

通过这种方式,这些应用程序/模块可以使用任何语言,并且可以通过服务器之间的线路进行通信。

但我有一些问题:

  • 这是个好主意吗?
  • 它们之间的数据传输会不会很慢?
  • 如果我这样做,那么每个应用程序/模块都必须是 HTTP 服务器,对吗?因此,如果我的应用程序使用 100 个应用程序/模块,那么每一个都必须是本地 HTTP Web 服务器,每个服务器都运行在不同的端口(http://localhost:81、http://localhost:82http://localhost:83 等)上,对吗?
  • 我应该知道哪些最佳实践/陷阱?

【问题讨论】:

    标签: javascript python ruby rest node.js


    【解决方案1】:
    • 这是个好主意吗?

    当然,也许。

    • 将数据 他们之间的传输很慢?

    是的!但相比于什么?与本地的内部调用相比,绝对是——它会很冰冷。与其他一些网络API相比,嗯,不一定慢。

    • 如果我 这样做,然后每个应用程序/模块 必须是 HTTP 服务器吗?因此,如果 我的应用程序使用 100 我必须拥有的应用程序/模块 100 台本地 HTTP Web 服务器 使用不同的端口运行每个 (http://localhost:81, http://localhost:82, http://localhost:83 等等)?

    不,没有理由为每个模块分配一个端口。有各种方法可以做到这一点。

    • 任何 我应该的最佳实践/陷阱 知道吗?

    成功的唯一方法是您所谈论的服务足够粗糙。这些必须是大而黑的服务类型,使调用它们的费用值得。您将在每笔交易中产生连接成本、数据传输成本和数据封送成本。因此,您希望这些事务尽可能少见,并且您希望有效负载尽可能大以获得最大收益。

    您说的是实际使用 REST 架构还是只是通过 HTTP 来回发送内容? (这些是不同的东西)REST 会产生自己的成本,包括嵌入式链接、无处不在和常见的数据类型等。

    最后,您可能根本不需要这样做。它可能是“有点酷”、“很高兴拥有”、“在白板上看起来不错”,但如果真的不需要它,那就不要这样做。只需遵循隔离内部服务的良好实践,以便以后决定执行此类操作,只需插入管理通信等所需的粘合层即可。添加远程分发将增加风险、复杂性和降低性能,(扩展!= performance) 所以应该有充分的理由去做。

    可以说,这是所有方法中的“最佳实践”。

    编辑——对评论的回应:

    所以你的意思是我运行一个网络服务器 处理所有传入的请求?但是之后 模块不会是独立的 应用程序,它打败了整个 目的。我想要每一个 模块能够自行运行。

    不,它不会破坏目的。

    这是交易。

    假设您有 3 个服务。

    乍一看,公平地说,这是三种不同的服务,在 3 台不同的机器上,在 3 台不同的 Web 服务器上运行。

    但事实是,这些都可以在同一台机器上、同一台网络服务器上运行,甚至可以(将其发挥到极致)运行完全相同的逻辑。

    HTTP 允许您映射各种事物。 HTTP 本身就是一种抽象机制。

    作为客户端,您只关心要使用的 URL 和要发送的有效负载。它最终与哪台机器通信,或者它执行的实际代码不是客户端问题。

    在架构级别,您已经实现了一种抽象和模块化的方式。 URL 让您组织您的系统是您想要的任何逻辑布局。 PHYSICAL 实现不同于逻辑视图。

    这 3 个服务可以在由单个进程提供服务的单个机器上运行。另一方面,它们可以代表 1000 台机器。您认为有多少台机器会响应“www.google.com”?

    您可以在一台机器上轻松托管所有 3 项服务,而无需共享任何代码,只需保存 Web 服务器本身。轻松将服务从其原始机器移动到其他机器。

    主机名是将服务映射到机器的最简单方法。任何现代 Web 服务器都可以为任意数量的不同主机提供服务。每个“虚拟主机”可以在该主机的名称空间内为任意数量的单独服务端点提供服务。在“主机”级别,如果必须,将代码从一台机器重新定位到另一台机器是微不足道的。

    您应该探索更多现代 Web 服务器的功能,以将任意请求定向到服务器上的实际逻辑。您会发现它们非常灵活。

    【讨论】:

    • “不,没有理由为每个模块分配一个端口。有各种方法可以做到这一点。”能否详细说明。如果每个模块/应用程序都是本地 Web 服务器,如何在不运行在不同端口上的情况下使用它们?
    • 正如其他人所提到的,不要在单独的 Web 服务器上运行它们。单个 Web 服务器可以处理任意数量的应用程序。它实际上都是基于服务器资源的。考虑一堆 CGI 脚本,它们都组织在一个目录树中。考虑一个 Java Web 应用服务器,每个 WAR 都单独部署,但每个 WAR 都有来自同一主机 url 的自己的上下文。甚至可以考虑虚拟主机,一个托管 100 台不同主机的 Web 服务器,它们都共享相同的 IP 和端口。这些都是在单个服务器上部署多个应用程序的所有技术。
    • 所以你的意思是我运行一个网络服务器来处理所有传入的请求?但是这些模块将不是独立的应用程序,这违背了整个目的。我希望每个模块都能够独立运行。
    【解决方案2】:

    这是个好主意吗?

    是的。它一直都在做。例如,这就是所有数据库服务器的工作方式。 Linux 充满了通过 TCP/IP 进行通信的客户端/服务器应用程序。

    它们之间的数据传输会不会很慢?

    没有。 TCP/IP 使用localhost 作为快捷方式来节省实际的网络 I/O。

    HTTP 协议不是专用连接的最佳选择,但它简单且支持良好。

    如果我这样做,那么每个应用程序/模块都必须是 HTTP 服务器,对吗?

    不一定。有些模块可以是客户端,但没有服务器。

    因此,如果我的应用程序使用 100 个应用程序/模块,那么每个应用程序/模块都必须是本地 HTTP Web 服务器,每个服务器都运行在不同的端口上(http://localhost:81、http://localhost:82http://localhost:83 等等) 对吧?

    是的。这就是它的工作方式。

    任何我应该知道的最佳实践/陷阱?

    不要“硬编码”端口号。

    不要使用“特权”端口号(低于 1024)。

    使用 WSGI 库,你会很高兴将所有模块变成 WSGI 应用程序。然后,您可以使用一个简单的 2 行 HTTP 服务器来包装您的模块。

    阅读本文。 http://docs.python.org/library/wsgiref.html#examples

    【讨论】:

      【解决方案3】:

      关于使用 restful 解决方案进行应用程序集成,我认为这是一个好主意,并在另一个问题上表达了类似的观点。

      【讨论】:

        【解决方案4】:

        坦率地说,我认为 100 个应用程序不需要 100 个服务器,也许只需在同一台服务器上使用 100 个端口。

        此外,RESTful 接口将使您能够灵活地扩展服务器并启用负载平衡,如果您希望有扩展至巨大的潜力。

        【讨论】:

        • 实际上我的意思是 100 个本地 Web 服务器(不是 100 个物理 Web 服务器)。我将对其进行编辑以使其更加明确。所以你说这是个好主意,即使我的目标是模块化级别,而不是全栈应用程序?
        • @weng:抱歉,我仍然不太明白为什么要使用 100 个 Web 服务器来为 100 个 Web 应用程序提供服务。我相信大多数网络应用程序(如果不是全部)都可以部署到同一台服务器上并且可以很好地协作,只要它们不会在侦听端口上发生冲突。
        • @weng:此外,RESTful Web 服务依赖 url 模式来匹配您正在调用的应用程序。因此,多个应用程序可以在同一个 Web 服务器上运行,共享默认的 80 端口。
        • 现在我明白为什么我的问题令人困惑了。所以我试着更准确。我所说的 100 个 Web 服务器实际上是指 100 个属于 Web 服务器的应用程序,而不是 100 个为 100 个应用程序提供信息的 Web 服务器。我已经编辑了我的帖子以使其更清晰。
        • 如果多个应用程序在同一个端口上运行,我不必在这些应用程序前面有一个路由器。但是如果我这样设置,那么每个应用程序都不会是 Web 服务器,因此它们将无法使用 restful 通信。而且,这使得应用程序无法被它自己使用。
        【解决方案5】:

        不 - 如果您没有充分的理由,这不是一个好主意。将应用程序的代码分层是一个好主意,以便在以后需要时可以“休息”它。 (或任何认为必要的性能改进。)“基于服务器的层”增加的部署复杂性是不这样做的一个很好的理由。我建议:

        • 使用良好、干净的代码编写结构良好的应用程序。
        • 使用预期的生产负载对其进行测试
        • 如果需要 - 重构为服务器层 - 但是.....

        更好的方法是对整个应用程序进行负载平衡。如果您在应用服务器中执行诸如 rails 之类的没有状态的操作,那么并行运行多个实例应该没有问题。

        如果您正在寻找复杂性 - 请忽略我的回答。 :-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-17
          • 1970-01-01
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          相关资源
          最近更新 更多