2017-06-12 20 views
3

我正在C#中的服務結構之上實現GRPC。 GRPC服務器需要一個ServerPort(負責將ssl憑證綁定到端口)和一個服務定義(負責將路徑上的請求映射到方法委託)。我製作了一個Communication Listener,它將報告分區和副本ID以及FQDN:端口。這允許客戶端正確地確保與正確的分區/副本對話。我在service mainifest中聲明瞭一個端點資源,並將端口留空以表明我希望服務結構分配一個隨機端口。我在本地開發中遇到的問題(我還沒有將它推送到天藍色的羣集中),因爲它們被分配了相同的端口,所以副本似乎死掉了。我還應該注意到,我正在告訴聽衆傾聽輔助副本。服務結構如何選擇端口來承載服務?

我的問題是:

  1. 如何服務織物選擇一個端口在託管服務副本?
  2. 對於輔助複製的端口共享問題,是否只是本地開發中的一個問題,我在同一臺機器上? (我會假設,在一個真正的集羣中的副本將被放置在不同的故障/升級域)

回答

1

服務織物保留其在集羣設置中定義的應用程序的端口範圍(在資源管理器中的模板,如果你將在Azure中託管)。當您將端口留在端點資源中時,SF會從該範圍中選擇尚未分配給機器上其他服務的端口。

但需要注意的重要一點是,端口分配爲每宿主進程,默認host process mode共享宿主進程,其中相同的服務類型的副本可以共享一臺主機的過程。在這種情況下,同一主機進程中的副本將獲得相同的端口。

有幾種方法可以解決這個問題:

  1. 使用支持端口共享一個網絡協議棧。在Windows上,您擁有Windows HTTP Server API(由HttpListener和其上的任何內容構建,如Katana)和WCF。
  2. 改爲使用exclusive host processes,在這種情況下,每個副本都有自己的主機進程,因此也有自己的唯一端口。進程隔離還具有許多其他好處(例如,如果副本使主機進程崩潰,則不會降低其他副本),但要以增加機器上的資源消耗爲代價。
+0

此外,服務遠程構建HTTP.SYS?如果不是如何解決這個問題? –