服务结构中不同端口上的多个 kestrel 无状态服务实例 运行

Multiple kestrel stateless service instances running on different ports in service fabric

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

运行 没有更改的天气预报应用程序工作正常,我可以在 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 应用程序中,诊断程序 window 显示进程不断启动失败:

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

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

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

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

Omit the Endpoint configuration in ServiceManifest.xml entirely, and don't pass an endpoint name to the KestrelCommunicationListener constructor

接下来,使用(例如 built-in)反向代理与您的服务通信。

更多信息here