一个服务可以在其代码中调用另一个服务吗?

Des*_*PRG 5 architecture service soa web-services

以下是与 SOA 相关的演示幻灯片中提到的一点,它使我对服务编排和服务编排的概念感到困惑。为了启用服务编排,Web 服务不应该能够调用另一个 Web 服务吗?

SOA builds applications out of software services. Services comprise intrinsically
unassociated, loosely coupled units of functionality that have no calls to
each other embedded in them.
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 6

理论上,服务可以执行完成其工作所需的任何操作。因此,似乎没有充分的理由禁止使用第二个服务来完成您的工作。为什么要重新发明轮子?

在实践中,问题更为复杂。如果您开始调用自己的网络服务器上的其他服务,那么您最终将导致其资源匮乏。充其量,“真正的”客户将不得不等待更长的时间才能得到答案,而您的 Web 服务服务器会自行运行。

另一个问题是递归循环:服务 A 调用 B 调用 C 调用 A 调用 B ...您明白了。一项服务中的一个小变化可能会在没有人注意到的情况下引入这样的循环,并且它可能会在那里停留很长时间,直到突然杀死您的服务器。

这就是为什么您应该在服务器内部的层次结构中构建微服务(即低于 Web 服务层 - 这不会暴露给客户端)。这些微服务可以以自上而下的方式相互使用(以避免循环)。然后进行单元测试以确保它们表现正常。

最后,这种重用非常缓慢。每个 HTTP 请求都需要大量资源来创建、发送、解析和处理。直接调用内部方法可以快 10 - 10000 倍。

这些是单个服务器公开的服务不应通过“公共客户端 API”相互重用的主要原因。

注意:有些 Web 服务可以使用现有服务构建新服务。IFTTT - “If This then That”就是这样的野兽。