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

Azure service fabric 从结构外部使用Service Fabric CommunicationClient和servicePartitionClient?,azure-service-fabric,Azure Service Fabric,我希望能够从非结构应用程序或服务调用有状态HTTP/WebApi服务。我可以只为有状态服务使用已发布的URL,但希望通过解析分区端点来利用故障切换到其他主服务器的优势 我首先尝试在桌面控制台应用程序中进行测试,但它无法执行InvokeWithRetryAsync中的communications Lambda函数 这是一个死胡同(非结构应用程序无法解析有状态服务)还是有其他方法从非结构应用程序解析端点。否则,我可能会将请求包装在“中间人”无状态服务(如WordCountWebService)中 v

我希望能够从非结构应用程序或服务调用有状态HTTP/WebApi服务。我可以只为有状态服务使用已发布的URL,但希望通过解析分区端点来利用故障切换到其他主服务器的优势

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

这是一个死胡同(非结构应用程序无法解析有状态服务)还是有其他方法从非结构应用程序解析端点。否则,我可能会将请求包装在“中间人”无状态服务(如WordCountWebService)中

var result=await servicePartitionClient.InvokeWithRetryAsync(
客户=>
{
//永远也到不了这里。
Uri serviceAddress=新Uri(client.BaseAddress,“SetConfiguration”);
HttpWebRequest request=WebRequest.CreateHttp(serviceAddress);
request.Method=“POST”;
//将内容添加到正文中
byte[]byteArray=Encoding.UTF8.GetBytes(\u数据包);
request.ContentType=“application/json”;
request.ContentLength=byteArray.Length;
Stream dataStream=request.GetRequestStream();
写入(byteArray,0,byteArray.Length);
dataStream.Close();
request.Timeout=(int)client.OperationTimeout.totalmillizes;
request.ReadWriteTimeout=(int)client.ReadWriteTimeout.totalmillizes;
HttpWebResponse=(HttpWebResponse)request.GetResponse();
//现在,就回来好吗
返回Task.FromResult(“确定”);
});

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

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

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


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

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

当您的客户端位于服务结构群集之外时,有两个潜在问题:

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

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

    谢谢您也为我节省了安全漏洞。我无法解释为什么无法连接。这是一个本地集群,所以Azure不应该妨碍它。症状是在单步调试器中调用InvokeWithRetryAsync时,匿名函数中的断点未被命中。调用InvokeWithRetryAsync未返回。我在一个无状态服务中使用了完全相同的代码,它工作正常。这可能是一大堆不同的问题,但根据您和Darren关于将有状态svc封装在无状态svc中的建议,这通常是有争议的。谢谢
            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");
    
                });