Azure service fabric 使用Azure服务结构部署的微服务的API网关/代理模式

Azure service fabric 使用Azure服务结构部署的微服务的API网关/代理模式,azure-service-fabric,Azure Service Fabric,在观看了Azure Service Fabric的构建会议视频后,我开始想象这如何适合我们当前基于微服务的体系结构。然而,有一件事我并不完全确定如何解决——API网关/代理 考虑一个不那么琐碎的微服务体系结构,在该体系结构中,在Azure服务结构中运行了N个服务,这些服务暴露了REST端点。在许多情况下,您希望将这些碎片化的API端点打包到一个供消费者使用的单一入口API中,以避免它们直接连接到服务结构实例。Azure Service Fabric解决方案似乎在各个方面都非常完整,我有点想知道,

在观看了Azure Service Fabric的构建会议视频后,我开始想象这如何适合我们当前基于微服务的体系结构。然而,有一件事我并不完全确定如何解决——API网关/代理

考虑一个不那么琐碎的微服务体系结构,在该体系结构中,在Azure服务结构中运行了N个服务,这些服务暴露了REST端点。在许多情况下,您希望将这些碎片化的API端点打包到一个供消费者使用的单一入口API中,以避免它们直接连接到服务结构实例。Azure Service Fabric解决方案似乎在各个方面都非常完整,我有点想知道,当我没有找到一种方法在构建会谈中提到的功能范围内简单地解决这个问题时,我是否错过了一些明显的东西


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

Azure Service Fabric可以轻松实现此场景的标准体系结构:网关服务作为客户端连接到的前端,以及所有与前端网关通信的N个后端服务。作为服务结构的一部分,有一些通信API堆栈可供使用,这使得从客户机到服务以及在服务本身内进行通信变得容易。ServiceFabric提供的通信API堆栈隐藏了发现、连接和重试连接的详细信息,以便您能够专注于实际的信息交换。当使用服务结构通信API时,服务不必实现将其名称和端点注册到特定路由服务的机制,创建服务本身的常规步骤除外。通信API接受服务URI和分区键,并自动解析和连接到正确的服务实例。根据您使用的是可靠的参与者还是可靠的服务,或者HTTP或WCF等协议,或者服务编写语言的选择,提供了一个很好的起点,帮助您决定哪些通信API最适合您的特定情况。在本文的末尾,您将找到指向不同通信API的更详细文章和教程的链接。有关Web API服务中通信的教程,请参阅。

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

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

  • 收到请求
  • 使用NS查找可以接受请求的服务
  • 将请求转发给it,并将响应返回给用户
  • 如果服务不再存在,404

  • 一般来说,我们不想对服务之间的通信方式进行任何规定,但我们正在考虑将HTTP作为一个完整的内置解决方案来解决这个问题

    当服务启动时,它向结构命名服务注册其端点。然后,使用Fabric客户端API,您可以向Fabric请求与已注册服务名称关联的已注册端点

    是的,正如您描述的情况,您将拥有一个网关,该网关将接受传入的URI进行连接,然后使用该路径信息作为服务名称查找,然后在传入请求和实际内部端点位置之间创建代理连接


    看起来团队发布了一个示例,展示了如何做到这一点:

    我想知道,与其在N+服务中公开Rest,不如在服务结构中的任何地方都使用默认的comm堆栈(或者尽可能在内部保持简单)。仅在织物的边缘入口点处露出支架。使用std无状态web 2.x api包装服务和参与者的结构代理,和/或使用结构服务以相同方式公开rest。在前向Rest服务中根据需要聚合API。我还不确定是否需要为命名重定向增加聚合器的额外开销(也许我没有想到)。然后,它似乎只是一个使用所需名称空间(即façade模式)组织(和保护)rest端点的练习

    我们也为此实现了HTTP网关服务。为了确保任何内部协议都可以有一个HTTP网关,我们使用ASP.NET5中间件为基于HTTP的内部服务(如ASP.NETWebAPI)实现了网关。它使用
    ServicePartitionClient<StatelessServiceType ServiceTypeName="WebServiceType">
      <Extensions>
          <Extension Name="Traefik">
            <Labels xmlns="http://schemas.microsoft.com/2015/03/fabact-no-schema">
              <Label Key="traefik.frontend.rule.example">PathPrefixStrip: /a/path/to/service</Label>
              <Label Key="traefik.enable">true</Label>
              <Label Key="traefik.frontend.passHostHeader">true</Label>
            </Labels>
          </Extension>
      </Extensions>
    </StatelessServiceType>