首页 > 解决方案 > 在服务结构的不同端口上运行的多个红隼无状态服务实例

问题描述

我使用示例默认值在 Visual Studio 2019 中创建了一个无状态服务(创建新项目 -> Service Fabric 应用程序 -> 命名项目和解决方案 -> 无状态 ASP.NET Core 服务)。

运行没有任何更改的天气预报应用程序工作正常,我可以看到该应用程序在 Service Fabric 资源管理器中运行,并看到我的 5 个健康(本地开发)节点和 1 个绿色应用程序。

如果我修改Local.5Node.xml以将 InstanceCount 从 1 更改为 -1

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/SampleApp" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="SampleApp_ASPNETCORE_ENVIRONMENT" Value="Development" />
    <Parameter Name="SampleApp_InstanceCount" Value="-1" />
  </Parameters>
</Application>

我可以看到在单个分区下创建了五个实例,但其中四个被困在“InBuild”中: 在此处输入图像描述

在我在 VS2019 中运行的应用程序中,诊断窗口显示进程不断无法启动:

在此处输入图像描述

经过进一步检查,我发现新实例正试图在同一个端口上启动。

在此处输入图像描述

端口分配如何在具有多个无状态 Web 服务实例的 Service Fabric 中工作?是否需要带有反向代理的网关来发现每个实例?在没有自定义解决方案的情况下,是否可以在 Service Fabric 中自动缩放无状态 Web 服务?

标签: c#azuremicroservicesazure-service-fabricservice-fabric-stateless

解决方案


Kestrel 不支持端口共享,因此一旦一项服务声明了该端口,在同一台机器上运行的其他服务(这里:您的开发机器)就不能。

最简单的解决方法是在开发集群上运行时创建1个服务实例。解决此问题的另一种方法是在本地使用(随机)SF 分配的端口:

完全省略 Endpoint 配置ServiceManifest.xml,并且不要将端点名称传递给KestrelCommunicationListener 构造函数

接下来,使用(例如内置的)反向代理与您的服务进行通信。

更多信息在这里


推荐阅读