【问题标题】:using Service Fabric CommunicationClient and servicePartitionClient from outside of fabric?从结构外部使用 Service Fabric CommunicationClient 和 servicePartitionClient?
【发布时间】:2016-03-06 09:40:49
【问题描述】:

我希望能够从非结构应用或服务调用有状态 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");

            });

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您也为我节省了安全问题。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我无法理解为什么无法连接。这是一个本地集群,因此 Azure 不应该成为阻碍。症状是当我在单步调试器中调用 InvokeWithRetryAsync 时,匿名函数中的断点没有被命中。对 InvokeWithRetryAsync 的调用未返回。我在无状态服务中使用了完全相同的代码,它工作正常。这可能是很多不同的问题,但通常根据您和 Darren 的建议将有状态的 svc 包装在无状态的 svc 中。谢谢!
    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2021-09-14
    • 2019-02-15
    • 2019-05-12
    • 2017-09-10
    • 2018-07-22
    相关资源
    最近更新 更多