连接到 Service Fabric 应用程序终结点

Posted

技术标签:

【中文标题】连接到 Service Fabric 应用程序终结点【英文标题】:Connect to Service Fabric application endpoint 【发布时间】:2018-03-03 19:01:12 【问题描述】:

我在 Azure 上设置了一个 Service Fabric 集群,并且有一个运行着 2 个服务的应用程序。现在我希望能够连接到浏览器中的服务,就像我在 localhost 上运行它时一样。 该应用程序使用 Owin 和 Swagger。这是在 localhost 上运行的样子:running on localhost。当我尝试从 Azure 连接到它时,出现超时错误。我在应用程序中使用端口 20002 和 20001,并且我在设置集群时已经打开了端口(端口 19000、19080、20001 和 20002 在我的集群中打开)。这是我在 Explorer 中的服务:Service in the explorer。集群设置了证书安全性,并且我已将证书添加到浏览器中(我正在使用它连接到资源管理器)。我的 CreateServiceInstanceListeners 代码:

        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    
        return Context.CodePackageActivationContext.GetEndpoints()
            .Where(endpoint => endpoint.Protocol.Equals(EndpointProtocol.Http) || endpoint.Protocol.Equals(EndpointProtocol.Https))
            .Select(endpoint => new ServiceInstanceListener(serviceContext => new OwinCommunicationListener("", new Startup(), serviceContext)));
    

还有我的 OpenAsync 代码:

        public OwinCommunicationListener(string appRoot, IOwinAppBuilder startup, StatelessServiceContext serviceInitializationParameters)
    
        _startup = startup;
        _appRoot = appRoot;
        _parameters = serviceInitializationParameters;
    


    public Task<string> OpenAsync(CancellationToken cancellationToken)
    
        var serviceEndpoint =
            _parameters
            .CodePackageActivationContext
            .GetEndpoint("ServiceEndpoint");

        var port = serviceEndpoint.Port;
        var root =
            String.IsNullOrWhiteSpace(_appRoot)
            ? String.Empty
            : _appRoot.TrimEnd('/') + '/';


        //TODO: Make localhost configable
        _listeningAddress = String.Format(
            CultureInfo.InvariantCulture,
            "http://+:0/1",
            port,
            root
        );
        _serverHandle = WebApp.Start(
            _listeningAddress,
            appBuilder => _startup.Configuration(appBuilder)
        );

        var publishAddress = _listeningAddress.Replace(
            "+",
            FabricRuntime.GetNodeContext().IPAddressOrFQDN
        );

        ServiceEventSource.Current.Message("Listening on 0", publishAddress);
        return Task.FromResult(publishAddress);
    

还有我的 ServiceEndpoint:

    <Endpoints>
  <Endpoint Name="ServiceEndpoint" Port="20002"  />
</Endpoints>

总结一下我的问题:如何使用 swagger 等方式在浏览器中访问我的 Service Fabric 应用程序服务?

【问题讨论】:

将(任何)外部端口转发到负载均衡器上的内部端口 20002 【参考方案1】:

最好的方法是在 19081 端口上使用反向代理。您必须在集群创建状态下启用它。

然后您必须为反向代理设置负载均衡器规则。 Azure 负载均衡器上的服务结构的基本设置没有 TCP 端口 19081 的规则,但是您可以复制 19000 的规则。

之后例如:

您的应用程序名称是 SampleApp 您的服务名称是 SampleService 托管在 20002 端口 您通常在本地获得您的服务 http://localhost:20002/api/values 您的集群的公共 IP 是 51.140.xx.xx

那么现在您可以在 http://51.140.xx.xx:19081/SampleApp/SampleService/api/values(假设你不保护你的反向代理端点)

【讨论】:

以上是关于连接到 Service Fabric 应用程序终结点的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Powershell 或 Visual Studio 连接到受保护的 Azure Service Fabric 群集

从 Windows 上的 C# Service Fabric 应用程序连接到 docker_engine(命名管道)

Azure Devops 无法连接到 Service Fabric 群集

从公司代理服务器后面连接到Service Fabric集群端点

从我的浏览器连接到 Azure Service Fabric 集群中托管的服务时出错

NServiceBus 终结点未在 Azure Service Fabric 本地群集上启动