我是Spring-Boot(Cloud)的新手,正在从事一个新项目。
我们的项目架构师已经设计了这个新应用程序,如下所示:
现在,以下是我感到困惑的事情,我不能问他,因为他对我来说太老了:
现在,我不明白的是为什么我们根本需要NodeJS代码?为什么我们不能在用Java编写的微服务中做同样的事情?
曾在类似情况下工作过的人可以阐明我的疑问吗?
最佳答案
我没有您要解决的问题的完整背景,因此下面的回答很笼统,但仍然可能有用:
是的,您将需要单独的API网关服务,该服务可能是Zuul(或其他网关,例如tyk.io)。
这里的主要思想是您可以拥有数百甚至数千个微服务(例如Amazon,Netflix等),并且它们可以分散在不同的机器或数据中心中。强制您的API使用者(在您的情况下为Angular 2)记住每个微服务的所有可能位置真的很愚蠢。最好拥有一个知道其下所有服务的API网关,以便您的客户可以调用您的网关,并可以通过一个地方访问基础服务。在您的系统中也拥有一个将使您的客户与您的服务脱钩,因此可以独立地发展它们。
另一个好处是您可以在一个位置上进行访问控制,日志记录,安全性等。而且,顺便说一句,我认为您在架构中还缺少一件事-它是授权服务器。构建微服务安全性的常用方法是OAuth 2.0。
我认为您可以使用Sidecar,但我从未使用过。我想问题“为什么”与发现服务(您的体系结构中的 Eureka )有关。
您不能直接调用微服务NodeJS-1,因为可能有多个NodeJS-1实例,要调用哪个?此外,您无法确定在任何给定时间点服务是否已关闭或处于事件状态。这就是为什么我们使用Eureka之类的Discovery Services的原因-它们可以处理所有这些。当任何给定的服务启动时,它必须在Eureka中进行注册。因此,如果您已经启动了几个NodeJS-1实例,它们都将在Eureka中注册,并且每当Microservice-1想要调用NodeJS-1服务时,它都会向Eureka询问NodeJS-1的事件实例的位置。然后,服务选择调用哪个。
我只能假设选择NodeJS是因为它在IO操作(包括调用3方服务时可能出现的HTTP请求)的IO操作方面具有出色的性能。我对此没有其他理性的解释。
通常,微服务使您可以用不同的语言编写微服务,这确实很酷,因为每种语言都比其他语言更好地解决了一些问题。另一方面,应谨慎做出此决定并回答以下问题:“我们是否真的需要在堆栈中使用新语言来解决问题X?”。