Service Fabric 如何选择一个端口来托管服务?
How does Service Fabric Choose a Port to Host a Service on?
我正在使用 C# 在 Service Fabric 之上实现 GRPC。 GRPC 服务器需要一个 ServerPort(负责将 ssl 凭证绑定到端口)和一个服务定义(负责将路径上的请求映射到方法委托)。我制作了一个通信侦听器,它报告分区和副本 ID 以及 FQDN:port。这允许客户端正确地确保其与正确的对话 partition/replica。我在服务 mainifest 中声明了一个端点资源并将端口留空以指示我希望服务结构分配一个随机端口。我在本地开发中的问题(我还没有将其推送到 azure 中的集群)是副本似乎死亡,因为它们被分配了相同的端口。我还应该注意,我是在告诉监听器监听辅助副本。
我的问题是:
- Service Fabric 如何选择用于托管服务副本的端口?
- 次要副本的端口共享问题是否只是我在同一台机器上的本地开发的问题? (我假设真实集群中的副本将放置在不同的 fault/upgrade 域中)
Service Fabric 保留一个应用程序端口范围,该范围在您的群集设置中定义(如果您在 Azure 中托管,则在您的资源管理器模板中)。当您像您一样在 Endpoint 资源中将端口留空时,SF 将从该范围中选择一个尚未分配给机器上其他服务的端口。
需要注意的重要一点是端口分配是每个主机进程,默认host process mode是共享 主机进程,其中相同服务类型的副本可以共享一个主机进程。在这种情况下,同一主机进程中的副本将获得相同的端口。
有几种方法可以解决这个问题:
- 使用支持端口共享的网络堆栈。在 Windows 上,您有 Windows HTTP 服务器 API(由 HttpListener 和构建在它之上的任何东西使用,例如 Katana)和 WCF。
- 改用exclusive host processes,在这种情况下,每个副本都有自己的主机进程,因此也有自己唯一的端口。进程隔离还有许多其他好处(例如,如果一个副本使主机进程崩溃,它不会导致其他副本崩溃),代价是增加机器上的资源消耗。
我正在使用 C# 在 Service Fabric 之上实现 GRPC。 GRPC 服务器需要一个 ServerPort(负责将 ssl 凭证绑定到端口)和一个服务定义(负责将路径上的请求映射到方法委托)。我制作了一个通信侦听器,它报告分区和副本 ID 以及 FQDN:port。这允许客户端正确地确保其与正确的对话 partition/replica。我在服务 mainifest 中声明了一个端点资源并将端口留空以指示我希望服务结构分配一个随机端口。我在本地开发中的问题(我还没有将其推送到 azure 中的集群)是副本似乎死亡,因为它们被分配了相同的端口。我还应该注意,我是在告诉监听器监听辅助副本。
我的问题是:
- Service Fabric 如何选择用于托管服务副本的端口?
- 次要副本的端口共享问题是否只是我在同一台机器上的本地开发的问题? (我假设真实集群中的副本将放置在不同的 fault/upgrade 域中)
Service Fabric 保留一个应用程序端口范围,该范围在您的群集设置中定义(如果您在 Azure 中托管,则在您的资源管理器模板中)。当您像您一样在 Endpoint 资源中将端口留空时,SF 将从该范围中选择一个尚未分配给机器上其他服务的端口。
需要注意的重要一点是端口分配是每个主机进程,默认host process mode是共享 主机进程,其中相同服务类型的副本可以共享一个主机进程。在这种情况下,同一主机进程中的副本将获得相同的端口。
有几种方法可以解决这个问题:
- 使用支持端口共享的网络堆栈。在 Windows 上,您有 Windows HTTP 服务器 API(由 HttpListener 和构建在它之上的任何东西使用,例如 Katana)和 WCF。
- 改用exclusive host processes,在这种情况下,每个副本都有自己的主机进程,因此也有自己唯一的端口。进程隔离还有许多其他好处(例如,如果一个副本使主机进程崩溃,它不会导致其他副本崩溃),代价是增加机器上的资源消耗。