使用反向代理localhost在Azure Service Fabric中的5节点群集上不起作用

时间:2018-07-06 19:02:52

标签: azure asp.net-web-api load-balancing azure-service-fabric

我在Azure Service Fabric群集中有一个API网关服务,用作我的Service Fabric服务的网关。

这一切在我的机器上以及Azure的1节点群集中都可以正常工作。

但是,当我在5节点群集中运行它时,会出现错误消息

System.Net.Http.HttpRequestException: 
An error occurred while sending the request. ---> 
System.Net.WebException: Unable to connect to the remote server 
System.Net.Sockets.SocketException: 
No connection could be made because the target machine actively refused it 127.0.0.1:19081

我知道19081是默认的反向代理端口。我在任何地方都没有看到有关专门解锁此端口的任何说明,所以我假设它是开放的。

我对127.0.0.1为什么在1节点群集而不是5节点群集中工作感到困惑。

我认为问题可能在于我正在调用的服务并不总是与负载均衡器向其发送请求的API网关位于同一节点上。

我该如何解决?

我的价格服务结构服务具有单个实例,该实例可以在任何节点上。

我不能选择拥有多个价格服务实例。

有关信息,这是我使用的链接:

You Tube Video

我将回过头来看看是否错过了一些东西。

这是我用来获取数据的代码:

var proxyUrl = $"http://My Service Fabric URL:{this._configSettings.ReverseProxyPort}/{url.Replace("fabric:/", "")}/api/{Area}/{method}{parameters}";
            Log.Information($"xUrl: {proxyUrl}");

            var response = await this._httpClient.GetAsync(proxyUrl).ConfigureAwait(false);

            var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                Log.Information($"{this.GetType().Name}: Error Response: {response.StatusCode}");

                return this.StatusCode((int) response.StatusCode);
            }

            Log.Information(this.GetType().Name + ": Called API");

按照下面的建议,我现在有了获取地址的代码:

   var resolver = ServicePartitionResolver.GetDefault();
        var partition = await resolver.ResolveAsync(_serviceContext.ServiceName, ServicePartitionKey.Singleton, CancellationToken.None).ConfigureAwait(false);
        var endpoints = JObject.Parse(partition.GetEndpoint().Address)["Endpoints"];
        var address = endpoints[""].ToString().TrimEnd('/');

        var proxyUrl = $"{address}:{this._configSettings.ReverseProxyPort}/{url.Replace("fabric:/", "")}/api/{Area}/{method}{parameters}";

这给出了http://localhost:8081

这与反向代理端口如何匹配?

欢呼

保罗

1 个答案:

答案 0 :(得分:1)

您会收到此错误,因为侦听此端口的服务已部署在另一个节点上。有两种方法可以实现您的目标:

  1. 使用服务结构集群的全名,例如http://mycluster.eastus.cloudapp.azure.com:19081/
  2. 使用命名服务来解析服务的端点:

解析代码示例:

var resolver = ServicePartitionResolver.GetDefault();
var endpoints = resolver.ResolveAsync(service.ServiceName, ServicePartitionKey.Singleton, CancellationToken.None).Result;