伺服器組態
定址接收器會使用 UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) 擴充方法和數個補充選項類別,以程式設計方式進行設定。 Orleans 中的選項類別遵循 .NET 中的選項模式,並可透過檔案、環境變數及任何有效的設定提供者載入。
定址接收器設定有數個主要層面:
- 叢集提供者
- (選擇性) Orleans 叢集資訊
- (選擇性) 要針對定址接收器對定址接收器和用戶端對定址接收器通訊使用的端點
以下範例是定義叢集資訊、使用 Azure 叢集,以及設定應用程式組件的定址接收器組態:
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
提示
針對 Orleans 進行開發時,您可以呼叫 UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) 來設定本機叢集。 在實際執行環境中,您應該使用適合您部署的叢集提供者。
叢集提供者
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
不論是在專用硬體或雲端中,建置在 Orleans 上的服務通常會部署在節點的叢集上。 針對開發和基本測試,Orleans 可以部署在單一節點組態中。 部署到節點的叢集時,Orleans 會在內部實作一組通訊協定,以探索及維護叢集中的 Orleans 定址接收器成員資格,包括偵測節點失敗和自動重新設定。
如需可靠管理叢集成員資格,Orleans 會使用 Azure 資料表、SQL Server 或 Apache ZooKeeper 來進行節點同步處理。
在此範例中,會使用 Azure 資料表做為成員資格提供者。
Orleans 叢集資訊
若要選擇性地設定叢集,請在 ISiloBuilder
執行個體上針對 Configure 方法,使用 ClusterOptions
做為型別參數。
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
您可以在這裡指定兩個選項:
- 將
ClusterId
設定為"my-first-cluster"
:這是 Orleans 叢集的唯一識別碼。 使用此識別碼的所有用戶端和定址接收器都能夠直接互相進行通訊。 不過,您可以針對不同的部署選擇使用不同的ClusterId
。 - 將
ServiceId
設定為"SampleApp"
:這是應用程式的唯一識別碼,可供某些提供者使用,例如持續性提供者。 此識別碼應該保持穩定,不會在部署之間變更。
根據預設,Orleans 會針對 ServiceId
和 ClusterId
使用 "default"
的值。 在大部分情況下,並不需要變更這些值。 ServiceId
是兩者中較重要者,用來區分彼此之間不同的邏輯服務,使其可以共用後端儲存系統,而不會互相干擾。 ClusterId
可用來判斷哪些主機會彼此連線,並形成叢集。
在每個叢集內,所有主機都必須使用相同的 ServiceId
。 不過,多個叢集可以共用 ServiceId
。 這可啟用藍色/綠色部署案例,其中新的部署 (叢集) 會在另一個部署關閉之前啟動。 這適用於裝載在 Azure App Service 中的系統。
最常見的情況是 ServiceId
和 ClusterId
在應用程式存留期會維持固定狀態,並且會使用輪流部署策略。 這適用於裝載在 Kubernetes 和 Service Fabric 中的系統。
端點
根據預設,Orleans 會接聽 11111
連接埠 (針對定址接收器對定址接收器通訊) 上的所有介面,以及接聽 30000
連接埠 (針對用戶端對定址接收器通訊) 上的所有介面。 若要覆寫此行為,請呼叫 ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) 並傳入您想要使用的連接埠號碼。
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
在上述程式碼中:
- 定址接收器連接埠會設定為
17_256
。 - 閘道連接埠會設定為
34_512
。
Orleans 定址接收器有兩種典型的端點組態類型:
- 定址接收器對定址接收器端點可用於相同叢集中定址接收器之間的通訊。
- 用戶端對定址接收器 (或閘道) 端點會用於相同叢集中用戶端與定址接收器之間的通訊。
在大部分情況下,這個方法應該就已足夠,但如有需要,您可以進一步自訂此方法。 以下是如何搭配某些連接埠轉送來使用外部 IP 位址的範例:
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11_111;
// Port to use for the gateway
options.GatewayPort = 30_000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40_000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50_000);
})
在內部,定址接收器會接聽 0.0.0.0:40000
和 0.0.0.0:50000
,但在成員資格提供者中發佈的值將會是 172.16.0.42:11111
和 172.16.0.42:30000
。
定址接收器是透過 SiloHostBuilder 和數個補充選項類別,以程式設計方式進行設定。 Orleans 中的選項類別遵循 .NET 中的選項模式,並可透過檔案、環境變數及任何有效的設定提供者載入。
定址接收器設定有數個主要層面:
- Orleans 叢集資訊
- 叢集提供者
- 要針對定址接收器對定址接收器和用戶端對定址接收器通訊使用的端點
- 應用程式組件
以下範例是定義叢集資訊、使用 Azure 叢集,以及設定應用程式組件的定址接收器組態:
var silo = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder
.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.ConfigureApplicationParts(
parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences())
})
.UseConsoleLifetime()
.Build();
讓我們細分此範例中使用的步驟:
叢集提供者
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
不論是在專用硬體或雲端中,建置在 Orleans 上的服務通常會部署在節點的叢集上。 針對開發和基本測試,Orleans 可以部署在單一節點組態中。 部署到節點的叢集時,Orleans 會在內部實作一組通訊協定,以探索及維護叢集中的 Orleans 定址接收器成員資格,包括偵測節點失敗和自動重新設定。
如需可靠管理叢集成員資格,Orleans 會使用 Azure 資料表、SQL Server 或 Apache ZooKeeper 來進行節點同步處理。
在此範例中,我們要使用 Azure 資料表做為成員資格提供者。
Orleans 叢集資訊
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
我們會在這裡執行兩件事:
- 將
ClusterId
設定為"my-first-cluster"
:這是 Orleans 叢集的唯一識別碼。 使用此識別碼的所有用戶端和定址接收器都能夠直接互相進行通訊。 不過,您可以針對不同的部署選擇使用不同的ClusterId
。 - 將
ServiceId
設定為"AspNetSampleApp"
:這是應用程式的唯一識別碼,可供某些提供者使用,例如持續性提供者。 此識別碼應該保持穩定,不會在部署之間變更。
根據預設,Orleans 會針對 ServiceId
和 ClusterId
使用 "default"
的值。 在大部分情況下,並不需要變更這些值。 ServiceId
是兩者中較重要者,用來區分彼此之間不同的邏輯服務,使其可以共用後端儲存系統,而不會互相干擾。 ClusterId
可用來判斷哪些主機會彼此連線,並形成叢集。
在每個叢集內,所有主機都必須使用相同的 ServiceId
。 不過,多個叢集可以共用 ServiceId
。 這可啟用藍色/綠色部署案例,其中新的部署 (叢集) 會在另一個部署關閉之前啟動。 這適用於裝載在 Azure App Service 中的系統。
最常見的情況是 ServiceId
和 ClusterId
在應用程式存留期會維持固定狀態,並且會使用輪流部署策略。 這適用於裝載在 Kubernetes 和 Service Fabric 中的系統。
端點
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Orleans 定址接收器有兩種典型的端點組態類型:
- 定址接收器對定址接收器端點可用於相同叢集中定址接收器之間的通訊
- 用戶端對定址接收器端點 (或閘道) 會用於相同叢集中用戶端與定址接收器之間的通訊
在此範例中,我們會使用協助程式方法 .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
,將用於定址接收器對定址的連接埠設定為 11111
,並將閘道的連接埠設定為 30000
。
這個方法會偵測要接聽的介面。
在大部分情況下,這個方法應該就已足夠,但如有需要,您可以進一步自訂此方法。 以下是如何搭配某些連接埠轉送來使用外部 IP 位址的範例:
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11111;
// Port to use for the gateway
options.GatewayPort = 30000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);
})
在內部,定址接收器會接聽 0.0.0.0:40000
和 0.0.0.0:50000
,但在成員資格提供者中發佈的值將會是 172.16.0.42:11111
和 172.16.0.42:30000
。
應用程式組件
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
雖然在技術上不需要此步驟 (如果未設定,則 Orleans 會掃描目前資料夾中的所有組件),但建議開發人員進行這項設定。 此步驟有助於 Orleans 載入使用者組件和類型。 這些組件稱為應用程式組件。 所有粒紋、粒紋介面和序列化程式都會使用應用程式組件來進行探索。
應用程式組件是使用 IApplicationPartManager 來進行設定,您可以使用 IClientBuilder 和 ISiloHostBuilder 上的 ConfigureApplicationParts
擴充方法來進行存取。 ConfigureApplicationParts
方法可接受委派 Action<IApplicationPartManager>
。
下列 IApplicationPartManager 支援常見用途的擴充方法:
- ApplicationPartManagerExtensions.AddApplicationPart,可以使用這個擴充方法來新增單一元件。
- ApplicationPartManagerExtensions.AddFromAppDomain 會新增目前在
AppDomain
中載入的所有組件。 - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory 會載入並新增目前基底路徑中的所有組件 (請參閱 AppDomain.BaseDirectory)。
上述方法所新增的組件可以其傳回型別使用下列擴充方法來進行補充:IApplicationPartManagerWithAssemblies
- ApplicationPartManagerExtensions.WithReferences 會從新增的組件新增所有參考組件。 這會立即載入任何可轉移參考的組件。 組件載入錯誤會予以忽略。
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration 會產生新增組件的支援程式碼,並將其新增至組件管理員。 請注意,這需要
Microsoft.Orleans.OrleansCodeGenerator
封裝才能進行安裝,且通常稱為執行階段程式碼產生。
類型探索需要所提供的應用程式組件包含特定屬性。 將建置時間程式碼產生套件 (Microsoft.Orleans.CodeGenerator.MSBuild
或 Microsoft.Orleans.OrleansCodeGenerator.Build
) 新增至包含「粒紋」、「粒紋介面」或「序列化程式」的每個專案,是確保這些屬性存在的建議方法。 建置時間程式碼產生僅支援 C#。 針對 F#、Visual Basic 和其他 .NET 語言,可以在設定期間透過上述的 WithCodeGeneration 方法來產生程式碼。 如需關於程式碼產生的詳細資訊,請參閱對應的區段。