【问题标题】:Web Service vs. Shared LibraryWeb 服务与共享库
【发布时间】:2010-11-21 17:16:55
【问题描述】:

根据我的发现,这个问题已经在 SO 上被问过几次:

When should a web service not be used? Web Service or DLL?

答案有所帮助,但它们都指向了一个特定的场景。我想对此有一个更一般的想法。

什么时候应该考虑 Web 服务而不是共享库 (DLL),反之亦然?

【问题讨论】:

  • 投反对票有什么特别的原因吗?
  • 我希望从其他人那里得到一些有意义的答案/想法。没有任何人评论或回答,我不确定我的回答是否准确?

标签: web-services


【解决方案1】:

我的想法:

Web 服务专为机器互操作和吸引受众而设计 使用 HTTP 作为传输方式很容易。

一个优点是,通过发布服务,您也可以使用 为潜在的广大受众提供服务(通过网络或至少在整个 整个公司)和/或很大程度上超出您的控制/影响/沟通渠道 你不介意或者这是想要的。作为客户,该服务的使用要容易得多 只需要有互联网连接并使用该服务。不像图书馆 可能不会那么容易做到(但可以做到)。该服务的使用在很大程度上是开放的。您正在将它提供给任何认为他们可以使用它并且他们觉得如何使用它的人。

但是,网络服务通常速度较慢,并且依赖于互联网连接。
它通常比代码库更难测试。
可能更难维护。这在很大程度上取决于您的维护和编码实践。

如果需要以上几项功能或至少其中一项,我会考虑使用网络服务 被认为是最重要的,缺点是可以接受的或必要的邪恶。

共享库怎么样?

如果您更多地“控制”环境或想要控制环境怎么办?您知道谁将使用该代码 (接口不是维护的问题),您不必担心互操作。您处于以下情况 您可以轻松实现共享,而无需大量工作/跳跃。

我心目中何时使用的例子:

您的控制中有许多应用程序都托管在同一台或两台将使用该库的服务器上。

不是很好的例子,您有许多应用程序,但都托管在十几台服务器上。 Web Service 可能是更好的选择。

您不确定谁或如何使用您的代码,但知道它对许多人来说很有价值。网络服务。

您正在编写一些仅由一组有限的应用程序使用的东西,也许是一些辅助函数。图书馆。

您正在写一些高度专业化的东西,不适合许多人使用。例如您的业务线的 API 其他人永远不会使用的应用程序。图书馆。

如果所有条件相同,则从共享库开始并将其转变为 Web 服务会更容易,但反之亦然。

还有很多,但这些是我的一些想法......

【讨论】:

  • 不错,尽管您通过限制 HTTP 过于严格。
  • 是的。虽然不是故意的。
  • 那么我对此的想法是否普遍准确......因为似乎没有人对此添加他们的想法?
  • 您能解释一下为什么“从共享库开始并将其转变为 Web 服务会更容易,反之则不然”?特别是,是否有某些设计模式或技术可以更轻松地将共享库转变为 Web 服务?
  • “更容易” - 总体而言,认为构建和启动速度更快。只需构建和部署,无需 Web 服务器。客户端只是引用 DLL 而不是创建代码/基础设施来与服务通信。一般来说,更容易的安全隐患。如果没有权限,不要给DLL。
【解决方案2】:

图书馆优势:

服务优势:

  • 每个人都可以立即透明地获得升级(除非提供版本化 API)
  • 消费者不能反编译代码
  • 可以单独扩展服务硬件
  • 与技术无关。对于共享库,消费者必须使用兼容的技术。
  • 更安全。 UI 层可以调用位于防火墙后面的服务,而不是直接访问数据库。

【讨论】:

    【解决方案3】:

    基于多个来源...

    通用共享库

    1. 应提供一组众所周知的操作来执行常见任务(例如,字符串解析、数值操作、构建器)
    2. 应该封装常见的可重用代码
    3. 对其他库的依赖最少
    4. 提供稳定的接口

    服务

    1. 应提供可重用的应用程序组件
    2. 提供通用业务服务(例如,收益率计算、绩效报告或交易历史服务)
    3. 可用于连接来自不同系统的现有软件或在应用程序之间交换数据

    【讨论】:

      【解决方案4】:

      这里有 5 个选项和使用它们的理由。

      1. 服务

        • 具有持久状态
        • 您需要经常发布更新
        • 解决重大业务问题并拥有相关数据
        • 需要安全性:用户看不到您的代码,用户无法访问您的存储空间
        • 需要像 REST 这样的不可知接口(您可以轻松地为客户端语言自动生成浅 REST 客户端)
        • 需要单独扩展
      2. 图书馆

        • 您只需要一组可重复使用的代码
        • 需要在客户端运行
        • 不能容忍任何停机时间
        • 甚至无法容忍几毫秒的延迟
        • 可能可行的最简单解决方案
        • 需要将代码传送到数据(高吞吐量或 map-reduce)
      3. 首先提供库。然后在需要时提供服务。

        • 敏捷方法,从最简单的解决方案开始,而不是扩展
        • 需求可能会演变并变得更像“服务”案例
      4. 启动本地服务的库。

        • 主机上的许多应用程序需要连接到它并向它发送一些数据
      5. 都没有

        • 即使是图书馆案,你也不能认真地证明其合理性
        • 商业价值值得怀疑

      【讨论】:

        【解决方案5】:

        理想情况下,如果我想要这两个优点,我需要一个可移植的库,它具有不可知的接口粘合、自动更新、混淆(难以反编译)或安全的内部环境。

        可以同时使用网络服务和库来使其变得可行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-06
          • 2012-04-05
          • 2011-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-18
          • 2010-12-19
          相关资源
          最近更新 更多