我正在用C#在Service Fabric之上实现GRPC。 GRPC服务器需要一个ServerPort(负责将ssl凭证绑定到端口)和服务定义(负责将请求映射到方法委托的路径)。我制作了一个Communication Listener,它报告分区和副本ID以及FQDN:port。这使客户端可以正确地确保其与正确的分区/副本进行对话。我在服务清单中声明了一个端点资源,并将端口留空以表示我希望服务结构分配一个随机端口。我在本地开发中遇到的问题(我尚未将其以蓝色的方式推出集群)是因为副本被分配了相同的端口,因此它们似乎消失了。我还应该注意,我告诉侦听器在辅助副本上侦听。

我的问题是:


服务结构如何选择用于托管服务副本的端口?
辅助副本的端口共享问题只是我物理上在同一台计算机上的本地开发问题吗? (我假设真实群集中的副本将放置在不同的故障/升级域中)

最佳答案

Service Fabric保留了一个在群集设置中定义的应用程序端口范围(如果您托管在Azure中,则在Resource Manager模板中定义)。当您像以前一样在Endpoint资源中将端口留空时,SF将从该范围中选择一个尚未分配给计算机上另一服务的端口。

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

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


使用支持端口共享的网络堆栈。在Windows上,您具有Windows HTTP Server API(由HttpListener以及在其之上构建的任何东西(例如Katana)使用)和WCF。
使用exclusive host processes代替,在这种情况下,每个副本都有自己的宿主进程,因此也有自己的唯一端口。进程隔离还具有许多其他好处(例如,如果副本使主机进程崩溃,则它不会关闭其他副本),但以增加计算机资源消耗为代价。

07-28 02:42
查看更多