3

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

我首先尝试在桌面控制台应用程序中进行测试,但它无法执行 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");

            });
4

2 回答 2

4

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

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

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

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

于 2015-12-02T10:05:00.653 回答
3

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

如果在 Service Fabric 群集之外有客户端,则存在两个潜在问题:

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

因此,正如 Darran 所提到的,最简单的解决方案通常是拥有一个无状态服务作为客户端请求的入口点。一旦您进入集群“内部”,您就不再有这些问题。

于 2015-12-02T21:10:35.303 回答