使用Azure Service Fabric部署的微服务的API网关/代理模式

Tro*_*eim 32 azure-service-fabric

在观看了Azure Service Fabric的BUILD会议视频后,我想象一下这对于我们当前基于微服务的架构是否合适.有一件事我不太确定我将如何解决,但是 - API网关/代理.

考虑一个不那么简单的微服务架构,其中您在Azure Service Fabric中运行N个服务,从而暴露REST端点.在许多情况下,您希望将这些分散的API端点打包到单条目API中供消费者使用,以避免它们直接连接到服务结构实例.Azure Service Fabric解决方案在各方面都看起来如此完整,我有点想知道当我在BUILD会谈期间提到的功能中没有看到一种简单解决这个问题的方法时我是否错过了一些明显的东西.

像Vulcan这样的服务旨在通过让服务在etcd中注册他们想要路由到它们的路径来解决这个问题.我猜测解决这个问题的一种方法可能是创建一个单独的有状态Web服务,其他服务可以自己注册,提供服务名称和路由到它们的路径.然后,有状态Web服务可以根据其状态将流量路由到正确的实例.但是,这似乎并不完全理想,例如删除应用程序时删除路由,以及通常使状态与群集中部署的服务保持同步.有没有人对此提出任何想法,或者有任何想法如何在Azure Service Fabric中解决这个问题?

Vac*_*cek 25

您需要执行此操作的服务注册/可发现性实际上已存在.有一个称为命名服务的有状态系统服务,它基本上是服务实例的注册商和他们正在监听的端点.因此,当您启动服务(无状态或有状态)并在其上打开一些侦听器时,地址将在命名服务中注册.

现在,您需要填写的部分是用户与之交互的"网关".这不必是有状态的,因为命名服务管理有状态部分.但是你必须提出一个适合你的寻址方案,然后它会将请求转发到正确的地方.基本上是这样的:

  1. 收到请求.
  2. 使用NS查找可以接收请求的服务.
  3. 将请求转发给它并将响应转发给用户.
  4. 如果该服务不再存在,404.

一般而言,我们不喜欢决定您的服务如何相互通信,但我们正在考虑如何将HTTP作为一个完整的内置解决方案来解决这个问题.

  • 你知道了,[FabricClient](https://msdn.microsoft.com/en-us/library/azure/system.fabric.fabricclient_members.aspx)是你与系统通信的网关.使用ServiceManager属性进行服务解析.ServiceProxy是一种内置机制,用于在服务之间轻松通信(基本上为您提供服务之间的强类型RPC).是的,它在内部使用FabricClient来解决服务问题! (2认同)

Chr*_*iss 19

我们也为此目的实现了HTTP网关服务.为了确保我们可以为任何内部协议提供一个HTTP网关,我们使用ASP.NET 5中间件为基于HTTP的内部服务(如ASP.NET WebAPI)实现了网关.它通过使用ServicePartitionClient和来自的一些重试逻辑将来自eg/service的请求路由到诸如fabric:/ myapp/myservice之类的内部Service Fabric地址CommunicationClientFactoryBase.

我们开源这个中间件你可以在这里找到它:https: //github.com/c3-ls/ServiceFabric-HttpServiceGateway

在项目的维基中还有一些文档.


dtr*_*ana 13

此功能是为http端点构建的,从Service Fabric 5.0版开始.该文档可在https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reverseproxy/上找到.

  • 在大多数情况下,只要您了解使用它的后果,通过反向代理进行通信就足够了.群集中公开HTTP端点的任何服务都可以从外部客户端进行寻址.您的DevOps团队很可能会发现这是不可接受的. (2认同)