我们计划基于play框架开发一些微服务。它们将提供rest api,其中许多api将在akka集群/集群分片下使用。我们希望有一个api网关来公开内部服务的api,但我们面临一个大问题: - 每个服务的多个实例将在某个ip和端口下运行。 - api网关如何知道服务实例在哪里运行? - 是否有类似于负载均衡器的东西可以跟踪所有正在运行的服务?哪种解决方案可能填补“API网关”/“负载均衡器”的职位?
你提出的问题与Play框架并没有真正的关联,也没有单一的答案可以解决你的需求。你可以先阅读akka的服务发现,然后根据适合你的选择进行选择。我们正在使用akka-http构建服务,并使用akka-cluster,但使用不相关的技术来公开和运行服务。查看以下内容: Kong 用于API网关 Consul 用于基于DNS的服务发现 Docker Swarm 用于运行带有网格网络的容器以进行负载均衡
您正在寻找以下组件:1. 服务注册表: 此组件的整个目的是跟踪“哪些服务在哪些地址上运行”。这可以是一个简单的数据库,它保留所有运行服务及其实例的条目。通常编排服务负责向服务注册表注册新的服务实例。另一种选择是让实例本身通知服务注册表它们的存在。2. 服务健康检查器: 此组件主要负责对已注册的服务实例进行定期运行时检查,并告诉服务注册表是否有任何不工作的实例。服务注册表实现可以将这些实例标记为“不活动”,直到它们被未来(如果有)的服务健康检查器发现正在工作为止。3. 服务解析: 这是概念性组件,负责使客户端以某种方式访问运行中的服务实例。以上所有组件被称为“服务发现”。在您的情况下,您拥有可以充当服务发现形式的负载均衡器。我认为,除非您需要非常先进的架构,否则负载均衡器不会经常更改,因此您的API网关可以简单地“知道”所有服务的负载均衡器的URL。因此,您不真正需要服务注册层。现在,负载平衡器本质上提供了实例的健康检查和隔离机制。因此,您不需要额外的健康检查层。因此,唯一缺少的部分是向负载平衡器注册实例。这部分您将根据负载均衡器及其所在生态系统来确定。如果您处于AWS生态系统中,并且您的负载均衡器是ELB,则应在这方面解决问题。
根据伊万和萨维什的回答,我们进行了一些研究并发现了Netflix OSS项目。 Eureka可以用作服务定位器,与Zuul api网关集成良好。可悲的是,没有太多关于配置的文档,所以我们进一步寻找...。我们现在最终选择了Kubernetes作为Orchestator。 Kubernetes知道所有正在运行的容器,因此不需要像Eureka这样的外部服务定位器。 Traefik是一个api网关,利用kuberentes api来发现所有正在运行的微服务实例并进行负载均衡。 Akka管理通过kubernetes api查找所有节点,并为我们启动集群。