为什么使用服务(REST / SOAP)而不是库?


22

假设您正在考虑将应用程序分解为服务。是否有充分的理由采用SOA方法,而不是仅仅创建一个可以由需要它的应用程序加载的库API。


6
嗨,内特,请阅读Stevey的Google Platforms Rant,它提供了有关平台(服务)与产品(库)问题的深刻见解
yannis,2011年

Answers:


11

两者之间的差异可能很小。例如,在.NET世界中,您可能拥有一个对于最终用户而言感觉像是单片的应用程序,该应用程序可以在同一台机器上运行,但是在内部却被分解为一堆WCF服务。您可能还拥有一些体系结构,在这些体系结构中,库之间没有牢固地链接(插件/插件),并且在彼此通信时仅遵循协议。

如果我们避免谈论这些中间情况,而只处理强链接的API库与单独的REST服务,那么您可能需要考虑以下几点:

  1. 在同一台计算机上调用库API。服务可以在任何地方托管,并且可以在任何地方调用。如果出于性能/可伸缩性/安全性的原因而考虑将应用程序托管在多台计算机上,则可能需要使用服务。

  2. 当部署在多台计算机上的应用程序使用一项服务时,情况也类似。例如,如果您要为一家银行做一个应用程序来进行一些财务计算,则一种方法是将整个大型应用程序部署到每个台式机上,并被迫每次都对每个客户进行大型更新。另一种方法是将计算部分托管在服务器上,并且仅将轻量级应用程序部署到桌面,该应用程序只有一个UI和对这些服务器的大量调用。

  3. 如果您托管的是REST服务,那么任何人都可以使用它:Mac用户,使用Linux的人等。如果您已经使用Visual Studio创建了C#库,并以DLL的形式分发了它,那么请不要理会用户(客户?)没有Windows的人。


9

服务的另一个优点是,当您更新服务时,它将立即部署到该服务的所有使用者。因此,如果您修复了错误或性能问题,那么只要更新的服务投入使用,每个人都可以从中受益,而不必分发人们可能会选择忽略的更新。


是的,但这也可能是不利的。当您更改多个应用程序所依赖的服务时,您可能会意外中断其中一个或多个应用程序的功能。这并不是要吓anyone任何人离开服务,只是要知道您需要确保服务的所有使用者在您更改服务时仍能正常工作。更好的做法是,一旦部署了旧服务方法,就将其保留下来,并在需要更改实现时创建新方法。
Lews Therin

8

图书馆优势:

服务优势:

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

“本地代码”在这里并没有真正意义:a)服务也可以使用“本地代码”,并且b)即时编译通常提供与本地代码相同的性能。
sleske 2014年

点了。当我说“本地代码”时,我指的是库是一个“进行中”的调用。没有服务层开销(例如,如果进行Web API调用,则为HTTP)
Cory House

是的,呼叫开销确实应该更低。我随意编辑您的答案,以“降低呼叫开销”代替“本地代码”的提及。如果您不同意,请随时重新编辑:-)。
sleske 2014年

我想补充的是交易的用法。与共享库相比,跨服务边界进行事务处理通常要困难得多。
c_mart

2

SOA方法允许分别托管和维护各种服务。除了代码之外,部署特定服务可能还需要大量特殊配置(密码,端口,证书等)。消费REST服务具有有限的复杂性,可以清晰地记录下来并易于理解。它也更安全,因为它意味着您无需向客户端授予对数据库或其他资源的访问权限。


1

如果SOA服务发生更改,则必须重新开发,重新测试和重新部署该SOA服务。使用该服务的所有应用程序都可以继续这样做。对DLL中的库进行更改将意味着必须重新开发该库的所有使用者以引用该DLL,都必须重新测试它们,并且都必须重新部署它们。还有可能无法正确发生这种危险,并且不同的应用程序将具有不同版本的DLL。有时这可能不是问题-也许每个系统都应具有部署时提供的库版本(您可能已更新了日志记录系统以具有有用的新功能-您真的需要用它来更新每个系统吗?)在这种情况下,一个库就可以了。但是说您有一个计算税率的服务,那么税法就会改变。您并不需要更新每个系统以包含此更改,最好在一个地方进行。在这种情况下,服务是更好的选择。


0

有几个好的答案,但我想在给定的答案中添加更多内容:

当您想以尽可能少的开销与事物进行交互时,API库方法非常有用。结果是API与使用它的应用程序之间存在更高的耦合。有时,这对于应用程序来说是可以的,甚至是必要的,但是,如果您的系统非常分散,或者您认为互操作性是一个大问题,则可能需要进一步提高抽象层次并使用其他通信方式。尤其是,如果您想拥有一个分布式系统,则SOAP是SOA的下一步,但是由于单元之间必须彼此了解,所以您仍然会受到单元之间的依赖。REST通过允许机器以统一的方式学习有关其他服务上的内容的知识,将其提升到一个新的水平。

对于您而言,如果您的应用程序未分发,那么我看不出有任何理由将您的应用程序转换为SOA。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.