如何为现有本地集群配置和启用 Azure Service Fabric 反向代理?

How to configure and enable Azure Service Fabric Reverse Proxy for an existing on-premises cluster?

Azure Service Fabric 反向代理在本地集群中可用吗?如果是这样,我如何为现有集群启用它?

描述了 Service Fabric 反向代理 here。它允许集群外部的客户端通过带有特殊 URL 的名称访问应用程序服务,而无需知道服务实例 运行 所在的确切 host:port(这可能会更改因为服务会自动四处移动)。

默认情况下,Service Fabric 反向代理似乎没有为我的具有两个无状态服务实例的本地集群启用。我尝试使用 documented 端口 19008,但无法使用推荐的 URI 语法访问该服务。

也就是说,这有效:

http://fqdn:20001/api/odata/v1/$metadata

但这不是:

http://fqdn:19008/MyApp/MyService/api/odata/v1/$metadata

在用于设置本地集群的 ClusterConfig JSON 的 NodeTypes 部分,有一个 属性 "httpGatewayEndpointPort": "19080",但该端口没有似乎作为反向代理工作(它是 Service Fabric Explorer Web 应用端点)。我猜测所需的配置是以某种方式在集群配置 JSON 中指定的。 referenced article 中有说明如何在云中而非本地配置反向代理。

我正在寻找有关如何在本地多机集群或开发集群中设置 Service Fabric 反向代理的说明。

我认为它与 HttpApplicationGatewayEndpoint 属性 有关,另请参阅我在 https://github.com/Azure/service-fabric-issues/issues/5 上的问题 但这对我不起作用..

另请注意

<Section Name="ApplicationGateway/Http">
            <Parameter Name="IsEnabled" Value="true" />
</Section>

对我来说是真的。

编辑:

我注意到在我的 Windows-Only 安装中,HttpApplicationGatewayListenAddress 在 FabricHostSettings.xml

中的值为 0
<Parameter Name="HttpGatewayListenAddress" Value="19080" />
<Parameter Name="HttpGatewayProtocol" Value="http" />
<Parameter Name="HttpApplicationGatewayListenAddress" Value="0" />
<Parameter Name="HttpApplicationGatewayProtocol" Value="" />

是的,反向代理在本地可用。

要使其适用于现有集群,必须在集群配置中配置和启用它 XML,然后必须部署新配置,如下所述。

对于新集群,请在创建集群之前在集群配置 JSON 中进行设置,如@Scott Weldon 所述。

@Senj 提供了线索(谢谢!),让我找到了答案。我最近将我的开发箱上的 Service Fabric 位更新为 5.1.163.9590。当我查看 C:\SfDevCluster\Data\FabricHostSettings.xml 时,我注意到以下内容:

 <Section Name="FabricNode">
    ...
    <Parameter Name="NodeVersion" Value="5.1.163.9590:1.0:0" />
    ...
    <Parameter Name="HttpApplicationGatewayListenAddress" Value="19081" />
    <Parameter Name="HttpApplicationGatewayProtocol" Value="http" />
    ...
  </Section>

有意思!随着开发集群启动,我浏览到:

http://localhost:19081/MyApp/MyService/api/odata/v1/$metadata

瞧!我的 API 返回了预期的数据。所以@Senj 是正确的,它与 HttpApplicationGateway 设置有关。我猜测在最新的 SDK 版本中,它是默认预配置和启用的。 (让我失望的是所有文档都提到端口 19008,但实际配置的端口是 19081!)

为了让反向代理在 'real' 多机 (VM) 集群上工作,我做了以下操作(注意:我不认为升级集群代码包是必要的,但是因为集群升级我的镜像库里什么都没有,集群升级过程需要代码包,我用的是最新版):

  1. 复制现有集群清单(从 Service Fabric Explorer 中的清单选项卡),粘贴到新的 XML 文件中,增加版本号并修改如下:

在 NodeType 端点部分,添加:

<NodeTypes>
    <NodeType Name="NodeType0">
      <Endpoints>
        <HttpApplicationGatewayEndpoint Port="19081" Protocol="http" />
        ...
      </Endpoints>
    </NodeType>
</NodeTypes>

并在 <FabricSettings> 下添加以下部分:

<Section Name="ApplicationGateway/Http">
  <Parameter Name="IsEnabled" Value="true" />
</Section>
  1. 使用 Service Fabric PowerShell 命令:

    • 将新的集群配置(之前复制的 manifest.xml)复制到 fabric 镜像存储
    • 注册新的集群配置
    • 将 Service Fabric Runtime 集群代码包(here - see the release notes 可用于 link 到 MSI)复制到映像存储
    • 注册集群代码包
    • 开始并完成集群升级(我使用的是不受监控的手动模式,一次只做一个虚拟机,每个节点完成后需要手动 Resume 命令)

集群升级完成后,我可以使用反向代理端点和 appname/servicename URL 语法查询我的服务 API:

http://fqdn:19081/MyApp/MyService/api/odata/v1/$metadata

我在独立安装程序版本 (5.1.156) 中启用了此功能,方法是将以下行添加到 nodeTypes 元素下的 JSON 配置文件(我使用 ClusterConfig.Unsecure.MultiMachine.json 但我假设任何 JSON 文件都可以工作):

"httpApplicationGatewayEndpointPort": "19081"

所以最后的 nodeTypes 看起来像这样:

"nodeTypes": [
    {
        "name": "NodeType0",
        "clientConnectionEndpointPort": "19000",
        "clusterConnectionEndpoint": "19001",
        "httpGatewayEndpointPort": "19080",
        "httpApplicationGatewayEndpointPort": "19081",
        "applicationPorts": {
            "startPort": "20001",
            "endPort": "20031"
        },
        "ephemeralPorts": {
            "startPort": "20032",
            "endPort": "20062"
        },
        "isPrimary": true
    }
]