代码之家  ›  专栏  ›  技术社区  ›  Paul

在azure服务结构中使用不在5节点群集上工作的反向代理本地主机

  •  0
  • Paul  · 技术社区  · 6 年前

    我在azure服务结构集群中有一个api网关服务,我将其用作我的服务结构服务的网关。

    这一切在我的机器上运行良好,在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网关位于同一节点上。

    我怎么能避开这个?

    我的price service fabric服务有一个可以在任何节点上的实例。

    对我来说,拥有多个价格服务实例是不可能的。

    以下是我使用的链接:

    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 回复  |  直到 5 年前
        1
  •  1
  •   Alex Riabov Vikrant    6 年前

    出现此错误是因为侦听此端口的服务部署在另一个节点上。实现目标有两种方法:

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

    解析代码示例:

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