也许吧。
是的!但与什么相比呢?与本地内部调用相比,绝对会很慢。与其他网络API相比,嗯,并不一定更慢。
不,没有理由为每个模块分配一个端口。有各种方法可以做到这一点。
唯一成功的方法是使用足够粗糙的服务。这些服务必须是大型、黑盒子式的,使得调用它们的费用值得。每次交易都会产生连接成本、数据传输成本和数据编组成本。因此,您希望这些交易尽可能少,并且要让有效载荷尽可能大以获得最佳效益。
您是在实际使用REST架构还是只是通过HTTP来回发送信息?(这些是不同的事情)REST会产生自己的成本,包括嵌入式链接、普遍和常见的数据类型等。
最后,您可能根本不需要这样做。这可能很“酷”,是“好事”,“白板上看起来不错”,但如果您真的不需要它,那就不要做。只需遵循隔离内部服务的良好实践,以便稍后决定执行此类操作时,可以插入必要的粘合层来管理通信等。添加远程分布将增加风险、复杂性并降低性能(扩展≠性能),因此必须有充分的理由才能这样做。
可以说,这是所有最佳实践中最好的一个。
编辑 - 回应评论:
您的意思是我运行一个Web服务器来处理所有传入的请求?但是这样一来,模块就不会成为独立的应用程序,这违背了整个目的。我希望每个模块都能够自己运行。
不,这并不违背初衷。
具体来说:
假设您有三个服务。
一眼看去,这似乎是三个不同的服务,在三台不同的机器上运行,分别在三个不同的Web服务器上。
但事实上,这些服务都可以在同一台机器上运行,甚至可以(将其推向极致)运行完全相同的逻辑。
HTTP允许您映射各种内容。HTTP本身是抽象机制。
作为客户端,您只关心使用的URL和要发送的有效负载。它最终与哪台机器通信,或者它执行的实际代码不是客户端的问题。
在架构层面上,您已经实现了一种抽象和模块化方式。 URL使您能够根据您想要的任何逻辑布局来组织系统。 物理实现与逻辑视图不同。
这三个服务可以在单个机器上运行,由单个进程提供服务。另一方面,它们也可以代表1000台机器。您认为有多少台机器响应“www.google.com”?
您可以轻松地将所有3个服务托管在单个机器上,而不共享任何代码,除了Web服务器本身。这使得将服务从原始机器移动到其他机器变得容易。
主机名是将服务映射到计算机的最简单方法。任何现代Web服务器都可以为任意数量的不同主机提供服务。每个“虚拟主机”可以在该主机名称空间内为任意数量的个别服务端点提供服务。在“主机”级别,如果必要,可以轻松地将代码从一台计算机转移到另一台计算机。
您应该更多地探索现代Web服务器将任意请求指向服务器上实际逻辑的能力。您会发现它们非常灵活。