3

我正在用 C# 在 Service Fabric 之上实现 GRPC。GRPC 服务器需要一个 ServerPort(负责将 ssl 凭据绑定到端口)和一个服务定义(负责将路径上的请求映射到方法委托)。我创建了一个通信侦听器,它报告分区和副本 ID 以及 FQDN:端口。这允许客户端正确地确保其与正确的分区/副本通信。我在服务 mainifest 中声明了一个 Endpoint 资源,并将端口留空以表示我希望服务结构分配一个随机端口。我在本地开发中的问题(我还没有将它推送到天蓝色的集群中)是副本似乎死了,因为它们被分配了相同的端口。我还应该注意,我是在告诉侦听器侦听辅助副本。

我的问题是:

  1. 服务结构如何选择一个端口来托管服务副本?
  2. 次要副本的端口共享问题是否只是我物理上在同一台机器上的本地开发问题?(我假设真实集群中的副本将放置在不同的故障/升级域中)
4

1 回答 1

1

Service Fabric 保留在群集设置中定义的应用程序端口范围(如果在 Azure 中托管,则在资源管理器模板中)。当您将端点资源中的端口留为空白时,SF 将从该范围中选择一个尚未分配给计算机上其他服务的端口。

需要注意的重要一点是端口分配是按主机进程分配的,默认主机进程模式共享主机进程,相同服务类型的副本可以共享一个主机进程。在这种情况下,同一主机进程中的副本将获得相同的端口。

有几种方法可以解决这个问题:

  1. 使用支持端口共享的网络堆栈。在 Windows 上,您拥有 Windows HTTP Server API(由 HttpListener 和基于它构建的任何东西,例如 Katana)和 WCF。
  2. 改为使用独占主机进程,在这种情况下,每个副本都有自己的主机进程,因此也有自己的唯一端口。进程隔离还有许多其他好处(例如,如果一个副本使主机进程崩溃,它不会随之关闭其他副本),但代价是增加了机器上的资源消耗。
于 2017-06-12T19:23:54.890 回答