从结构外部使用 Service Fabric CommunicationClient 和 servicePartitionClient?

using Service Fabric CommunicationClient and servicePartitionClient from outside of fabric?

我希望能够从非架构应用程序或服务调用有状态 HTTP/WebApi 服务。我可以只为有状态服务使用已发布的 url,但想通过解析分区端点来利用故障转移到不同的主服务器。

我首先尝试在桌面控制台应用程序中进行测试,但它无法在 InvokeWithRetryAsync 中执行通信 Lambda 函数。

这是死胡同吗(非结构应用程序无法解析有状态服务)或者是否有另一种方法可以从非结构应用程序解析端点。否则,我可能会将请求包装在 "middleman" 无状态服务(如 Wordcount Webservice)中。

        var result = await servicePartitionClient.InvokeWithRetryAsync(
            client =>
            {
                //never reaches here. 
                Uri serviceAddress = new Uri(client.BaseAddress, "SetConfiguration");

                HttpWebRequest request = WebRequest.CreateHttp(serviceAddress);
                request.Method = "POST";

                //Add the content into the body
                byte[] byteArray = Encoding.UTF8.GetBytes(_datapacket);
                request.ContentType = "application/json";
                request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();


                request.Timeout = (int)client.OperationTimeout.TotalMilliseconds;
                request.ReadWriteTimeout = (int)client.ReadWriteTimeout.TotalMilliseconds;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //for now, just return ok
                return Task.FromResult<string>("ok");

            });

我尝试这个已经有一段时间了,但结果应该是一样的:构建一个无状态服务作为有状态服务的网关。

我 运行 遇到的问题首先是关于连接到集群 - 如果它是一个安全集群,那么您需要加载客户端证书以允许建立安全连接。

解决此问题后,您可能会遇到命名服务会将分区解析为本地地址的问题,而不是可以从集群外部解析的地址。

所以最终结果是我们构建了一个无状态服务,可以作为典型的 REST API 访问,其好处是将分区的抽象移动到集群中的这一层。

是的,运行 在 Service Fabric 集群之外 的非 Service Fabric 应用程序绝对可以 与 Service Fabric 应用程序通信。 Service Fabric 本身没有施加任何限制,因为是您的服务本身打开了通信端点(最终您的服务只是 运行 在 EXE 中进行监听,并且它们可以像您使用的任何 EXE 一样监听地址和端口之前写过)。当您使用通信客户端 API(如 ServicePartitionClient)时,您只是要求命名服务解析服务的地址和端口,然后您可以像往常一样连接到它。

当您的客户端位于 Service Fabric 集群之外时,有两个潜在问题:

  1. 您的客户端是否可以访问集群以便与命名服务对话?如果您的集群受证书保护,您将需要在客户端中使用该证书连接到命名服务。
  2. 您的服务端点在集群外可见吗?通常对于有状态服务,您会从端口范围中分配一个端口。如果您的群集在 Azure 中 运行ning,则此端口范围仅供内部使用,不会通过 Azure 负载均衡器公开。如果您托管自己的集群,您可以将其设置为让客户端通过您的 LB,但您应该考虑您是否真的希望允许客户端这样做。

因此,正如 Darran 所提到的,最简单的解决方案通常是使用无状态服务作为客户端请求的入口点。一旦你成为 "inside" 集群,你就不再有这些问题了。