微服务:在Spring API网关下无需服务发现

3

我对这个问题非常困扰。我们想要将遗留应用迁移到微服务应用(Spring-boot、Java 8)。

根据架构师的建议,我们不需要服务发现,API网关足以实现服务发现和路由。

请注意,当前部署在本地服务器上,我们将拥有固定数量的节点,并且F5/负载均衡器将能够将请求路由到API网关,然后再转发到微服务。

使用Spring Cloud API Gateway而没有服务发现,我们是否能够生存下去?


1
好的,你没有提到需要服务发现来解决任何问题,所以你的架构师可能是正确的。你为什么认为你可能需要它呢?不过,一个好的架构会确保你可以改变主意而不会有严重后果,所以这个决定并不重要。在软件架构方面,做出正确的决定远不如让决策变得不重要。 - Matt Timmermans
@MattTimmermans,我们希望微服务之间能够进行内部通信。因此,如果我们没有服务发现,我们将不得不通过 API 网关进行调用,这会稍微耗费一些时间。 - Mohammad Javed
3个回答

3
短暂的答案是是的,您可以使用Spring Cloud API网关而无需服务发现。但这确实取决于您的应用程序的规模处理的流量量
您可以启动迁移到微服务而不需要服务发现。对于内部服务之间的通信,只需使用真正的硬编码IP地址和端口即可。
关于API网关执行服务发现。我可能错了,但您将无法通过Api网关进行通信,因为它也不知道目标位置(服务位置也必须硬编码)。
一旦您开始感到需要扩展,则无法避免使用服务注册表工具。如果您开始考虑要选择哪个,我建议使用HashiCorp Consul
无论如何,最有可能的是,您最终都必须向基础架构中注入服务发现机制。您可以从一开始就做,或者在新架构对您有利并且有扩展计划时稍后处理。
如果您计划迁移到云端,可以提前考虑使用 Kubernetes 作为基础设施。它为您提供了开箱即用的服务发现机制。

@Stephan Tsybulki,感谢您详细的回答。看起来为了避免硬编码URL,我们需要开始考虑使用Consul。如果您认为这个问题相关,请给它点赞... - Mohammad Javed

1
如果没有Service-Registry-backed DiscoveryClient,您可以配置 spring.cloud.discovery.client.simple.instances.userservice[0].uri=http://s11:8080
您可以将此userservice托管在kubernetes集群上。有关更多详细信息,请参阅以下文档 https://cloud.spring.io/spring-cloud-commons/2.2.x/reference/html/
同样,为了使服务之间进行通信,假设userservice想要通过ribbon进行通信,则可以轻松地进行配置。
passwordservice.ribbon.listOfServers:${PASSWORDSERIVCE}:http://localhost:8081

我认为这个结构没有问题。

1
Kubernetes是一个很好的平台,如果您可以选择它的话。
它可以处理从服务发现到部署等各个方面的部分。
您只需要制作一个云就绪的Docker镜像(最好),并将其部署到Kubernetes上,Kubernetes会根据您的配置映射一个内部端点到它上面,并注册您的服务(如果我以spring-cloud和eureka服务器的术语来说)。

目前我们正在进行单体应用重构。我们只使用非常基本的项目来开始,暂时没有计划使用 Kubernetes。但是我们肯定会考虑这个选项。如果您认为这个问题相关,请点赞! - Mohammad Javed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接