玩微服务 - api 网关和服务发现

Play Microservices - api gateway and service discovery

我们打算开发一些基于play框架的微服务。他们将提供休息 apis 并且他们中的很多人将在引擎盖下使用 akka cluster/cluster-sharding。

我们希望有一个 api 网关来公开我们内部服务的 api,但我们面临一个大问题:
- 每个服务的多个实例将在某些 ip 和端口下 运行。
- api 网关如何知道服务实例在哪里 运行?
- 是否有类似负载均衡器的东西可以跟踪所有 运行 服务?

哪些解决方案可能填补 "API Gateway"/"Load Balancer" 的位置?

你问的问题与游戏框架无关。并且没有单一的答案可以解决您的问题。

您可以先阅读 akka Service Discovery,然后再根据自己的喜好做出选择。

我们正在使用 akka-http 构建服务并使用 akka-cluster 但使用不相关的技术来公开和 运行 服务。

退房

您正在寻找以下组件,

  1. Service Registry:这个组件的全部意义在于跟踪 "what service are running on what addresses"。这可以像一个简单的数据库一样简单,该数据库保留所有 运行 服务及其实例的条目。通常,编排服务负责向 Service Registry 注册新的服务实例。其他选择可以是让实例自己通知服务注册表它们的存在。

  2. Service Health Checker:该组件主要负责对已注册的服务实例进行定期运行时检查,并在其中任何一个不工作时通知服务注册中心.然后,服务注册表实现可以将这些实例标记为 "inactive",直到它们被服务健康检查器发现在未来工作(如果有的话)。

  3. 服务解析:这是负责使客户端能够以某种方式访问​​ 运行 服务实例的概念组件。

以上所有组件称为 Service Discovery

在你的例子中,你有 load-balancers 可以充当 ServiceDiscovery 的一种形式。

我认为 load-balancers 不会随时间发生太大变化,除非您需要非常先进的架构,因此您的 API 网关可以简单地 "know" url 到所有服务的负载均衡器。所以,你并不真的需要服务注册表层。

现在,您的负载均衡器本身就为实例提供了健康检查和隔离机制。所以,你不需要额外的健康检查层。

因此,唯一缺少的部分是向负载均衡器注册您的实例。这部分你必须根据你的负载均衡器是什么以及它们所处的生态系统来弄清楚。

如果您生活在 AWS 生态系统中并且您的负载均衡器是 ELB,那么您应该在这方面解决问题。

根据 Ivan 和 Sarvesh 的回答,我们进行了一些研究并发现了 netflix OSS 项目。 Eureka can be used as service locator that integrates well with the Zuul api 网关。遗憾的是,关于配置的文档不多,所以我们进一步查看...

我们现在终于选择了 Kubernetes 作为 Orchestator。

  • Kubernetes 了解所有 运行 容器,因此不需要像 Eureka 这样的外部服务定位器。
  • Traefik 是一个 api 网关,它利用 kuberentes api 发现所有 运行 微服务实例并进行负载平衡
  • Akka management 通过 kubernetes api 找到所有节点并为我们引导集群。