使用来自Fabric外部的Service Fabric CommunicationClient和servicePartitionClient?

时间:2015-12-02 08:18:22

标签: azure-service-fabric

我希望能够从非结构应用或服务调用有状态HTTP / WebApi服务。我可以使用已发布的U​​RL来进行有状态服务,但希望通过解析分区端点来利用故障转移到其他主服务器。

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

这是一个死胡同(非结构应用程序无法解析有状态服务)还是有另一种方法可以从非结构应用程序解析端点。否则,我可能会将请求包装在“中间人”无状态服务(如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");

            });

2 个答案:

答案 0 :(得分:4)

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

我遇到的问题首先是连接到群集 - 如果它是一个安全的群集,那么你需要加载客户端证书才能建立安全连接。

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

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

答案 1 :(得分:2)

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

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

  1. 您的客户端是否可以访问群集,以便与命名服务通信?如果您的群集受证书保护,则您需要在客户端使用该证书连接到命名服务。
  2. 您的服务端点在群集外是否可见?通常,对于有状态服务,您将从端口范围分配一个端口。如果您的群集在Azure中运行,则此端口范围仅限内部,不会通过Azure负载均衡器公开。如果您正在托管自己的群集,可以将其设置为允许客户通过您的LB,但您应该考虑是否真的希望允许客户端这样做。
  3. 因此,Darran提到的最简单的解决方案通常是拥有一个无状态服务,作为客户端请求的入口点。一旦你“进入”群集,你就不再有这些问题了。