如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?
Posted
技术标签:
【中文标题】如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?【英文标题】:How to configure and enable Azure Service Fabric Reverse Proxy for an existing on-premises cluster? 【发布时间】:2016-12-17 06:54:26 【问题描述】:Azure Service Fabric 反向代理是否在本地集群中可用?如果是这样,如何为现有集群启用它?
Service Fabric 反向代理描述为here。它允许集群外部的客户端使用特殊的 URL 按名称访问应用程序服务,而无需知道服务实例正在运行的确切主机:端口(可能会随着服务的自动移动而改变)。
默认情况下,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”,但该端口似乎不能用作反向代理(它是服务Fabric Explorer Web 应用程序端点)。我猜想在集群配置 JSON 中以某种方式指定了所需的配置。 referenced article 中有说明如何在云端配置反向代理,而不是在本地配置。
我正在寻找有关如何在本地多机集群或开发集群中设置 Service Fabric 反向代理的说明。
【问题讨论】:
【参考方案1】:我认为这与 HttpApplicationGatewayEndpoint 属性有关,另请参阅我在https://github.com/Azure/service-fabric-issues/issues/5 上的问题 但这对我不起作用..
还要注意
<Section Name="ApplicationGateway/Http">
<Parameter Name="IsEnabled" Value="true" />
</Section>
对我来说是真的。
编辑:
我注意到在我的仅限 Windows 的安装中,HttpApplicationGatewayListenAddress 在 FabricHostSettings.xml 中的值为 0
<Parameter Name="HttpGatewayListenAddress" Value="19080" />
<Parameter Name="HttpGatewayProtocol" Value="http" />
<Parameter Name="HttpApplicationGatewayListenAddress" Value="0" />
<Parameter Name="HttpApplicationGatewayProtocol" Value="" />
【讨论】:
感谢您提供此线索。我在 5.1.156.9590 上运行的本地仅 Windows SF 集群中看到相同的值。【参考方案2】:是的,反向代理在本地可用。
要使其适用于现有集群,必须在集群配置 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!)
为了让反向代理在“真正的”多机 (VM) 集群上工作,我做了以下操作(注意:我不认为升级集群代码包是必要的,但因为我没有我的镜像仓库用于集群升级,集群升级过程需要代码包,我用的是最新版本):
-
复制现有群集清单(从 Service Fabric Explorer 的清单选项卡中),粘贴到新的 XML 文件中,增加版本号并进行如下修改:
在 NodeType Endpoints 部分添加:
<NodeTypes>
<NodeType Name="NodeType0">
<Endpoints>
<HttpApplicationGatewayEndpoint Port="19081" Protocol="http" />
...
</Endpoints>
</NodeType>
</NodeTypes>
在<FabricSettings>
下,添加以下部分:
<Section Name="ApplicationGateway/Http">
<Parameter Name="IsEnabled" Value="true" />
</Section>
使用 Service Fabric PowerShell 命令:
将新的集群配置(之前复制的 manifest.xml)复制到结构映像存储中 注册新的集群配置 将 Service Fabric 运行时群集代码包(here 可用 - 请参阅 release notes 以获取 MSI 的链接)到映像存储区 注册集群代码包 启动并完成集群升级(我使用了不受监控的手动模式,一次只做一个虚拟机,每个节点完成后需要手动恢复命令)集群升级完成后,我可以使用反向代理端点和 appname/servicename URL 语法查询我的服务 API:
http://fqdn:19081/MyApp/MyService/api/odata/v1/$metadata
【讨论】:
适用于我使用 OWIN 托管的无状态服务,但不适用于 Asp.Net Core。你使用什么类型的编程模型? 我们还使用由 OWIN/Katana 和在 .NET 4.6 上运行的 WebAPI 托管的无状态服务。 (Microsoft.AspNet.WebApi.* 版本 5.2.3)还没有尝试过 .NET Core。 @CyberMonk 在 SF 中使用 Windows 容器时,这似乎不起作用。有办法吗?我正在尝试将一个简单的 IIS 应用程序放在 Windows 容器中并发布公开的端口,但我似乎无法通过 19081(这是我的配置 XML 中的内容)到达它。 我按照上述步骤升级集群以添加 RP 支持:Connect-ServiceFabricCluster -ConnectionEndpoint mycluster:19000 ; Copy-ServiceFabricClusterPackage -ClusterManifestPath UpgradeClusterConfig.XML -Config -ImageStoreConnectionString "fabric:ImageStore" ; Register-ServiceFabricClusterPackage -ClusterManifestPath UpgradeClusterConfig.XML -Config ; Start-ServiceFabricClusterUpgrade -ClusterManifestVersion 5 -Config -UnmonitoredAuto
;部署到 1 或 2 台服务器,然后回滚。
详细错误是:详细:System.Fabric.FabricTransientException:操作已取消。 ---> System.Runtime.InteropServices.COMException: System.Fabric.Interop.NativeClient.IFabricClusterManagementClient7.EndGetFabricUpgradeProgress(IFabricAsyncOperationContext context) 在 System.Fabric.FabricClient.ClusterManagementClient 的操作中止(来自 HRESULT 的异常:0x80004004 (E_ABORT))。 GetFabricUpgradeProgressEndWrapper(IFabricAsyncOperationContext 上下文)【参考方案3】:
我在独立安装程序版本 (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
]
【讨论】:
这是在创建新集群时启用反向代理的正确方法。所选答案与在现有集群中启用反向代理有关。我会调整问题以反映这一点。 此参数在 GA (5.3.204) 版本中已重命名为:“reverseProxyEndpointPort”。以上是关于如何为现有的本地集群配置和启用 Azure Service Fabric 反向代理?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Azure 上的 Node.js Api 应用启用 BLOB 日志记录?