Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Konfigurieren Sie ein Silo programmgesteuert mithilfe der UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) Erweiterungsmethode und mehrerer ergänzender Optionsklassen. Optionsklassen folgen Orleans dem Optionsmuster in .NET und können aus Dateien, Umgebungsvariablen oder einem anderen gültigen Konfigurationsanbieter geladen werden.
Es gibt mehrere wichtige Aspekte der Silokonfiguration:
- Clusteringanbieter
- (Optional) Orleans Clusterinformationen
- (Optional) Endpunkte für Silo-zu-Silo- und Client-zu-Silo-Kommunikation
Dieses Beispiel zeigt eine Silokonfiguration, die Clusterinformationen definiert, Azure-Clustering verwendet und Anwendungsteile konfiguriert:
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
Tipp
Bei der Entwicklung für Orleanskönnen Sie aufrufen UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) , um einen lokalen Cluster zu konfigurieren. In Produktionsumgebungen sollten Sie einen Clusteringanbieter verwenden, der für Ihre Bereitstellung geeignet ist.
Clusteringanbieter
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
In der Regel stellen Sie einen Dienst bereit, der auf Orleans einem Cluster von Knoten basiert, entweder auf dedizierter Hardware oder in der Cloud. Für Entwicklung und grundlegende Tests können Sie Orleans in einer Konfiguration mit einem einzigen Knoten bereitstellen. Bei der Bereitstellung in einem Cluster von Knoten wird Orleans intern zur Implementierung von Protokollen verwendet, um die Mitgliedschaft der Orleans Silos im Cluster zu ermitteln und zu verwalten, einschließlich der Erkennung von Knotenfehlern sowie der automatischen Neukonfiguration.
Für eine zuverlässige Clustermitgliedschaftsverwaltung Orleans verwendet Azure Table, SQL Server oder Apache ZooKeeper für die Knotensynchronisierung.
In diesem Beispiel verwenden wir Azure Table als Mitgliedschaftsanbieter.
Orleans Clusterinformationen
Um das Clustering optional zu konfigurieren, verwenden Sie ClusterOptions den Typparameter für die Methode für die ConfigureISiloBuilder Instanz.
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
Hier geben Sie zwei Optionen an:
- Legen Sie folgendes
ClusterIdFest:"my-first-cluster"Dies ist eine eindeutige ID für den Orleans Cluster. Alle Kunden und Silos, die diese ID verwenden, können direkt miteinander kommunizieren. Sie können jedoch eine andereClusterIdfür verschiedene Bereitstellungen verwenden. - Setzen Sie
ServiceIdauf"SampleApp": Dies ist eine eindeutige ID für Ihre Anwendung, die von einigen Anbietern verwendet wird, z. B. Persistenzanbieter. Diese ID sollte stabil bleiben und sich nicht über Bereitstellungen hinweg ändern.
Standardmäßig verwendet Orleans"default" für ServiceId und ClusterId. Diese Werte müssen in den meisten Fällen nicht geändert werden.
ServiceId ist wichtiger und unterscheidet unterschiedliche logische Dienste, sodass sie Back-End-Speichersysteme ohne Störungen teilen können.
ClusterId bestimmt, welche Hosts eine Verbindung mit einem Cluster herstellen.
In jedem Cluster müssen alle Hosts dasselbe ServiceIdverwenden. Mehrere Cluster können jedoch ein ServiceId gemeinsam nutzen. Dies ermöglicht Blau-/Grün-Bereitstellungsszenarien, in denen Sie eine neue Bereitstellung (Cluster) starten, bevor Sie eine andere herunterfahren. Dies ist typisch für Systeme, die in Azure App Service gehostet werden.
Der häufigere Fall ist, dass ServiceId und ClusterId für die Lebensdauer der Anwendung fest bleiben und Sie eine rollierende Bereitstellungsstrategie verwenden. Dies ist typisch für Systeme, die in Kubernetes und Service Fabric gehostet werden.
Endpunkte
Standardmäßig hört Orleans auf allen Schnittstellen am Port 11111 für die Silo-zu-Silo-Kommunikation und am Port 30000 für die Client-zu-Silo-Kommunikation. Um dieses Verhalten außer Kraft zu setzen, rufen Sie ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) auf und übergeben die gewünschten Portnummern.
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
Im vorhergehenden Code:
- Der Silohafen ist auf
17_256. - Der Gatewayport ist auf
34_512.
Ein Orleans Silo verfügt über zwei typische Arten von Endpunktkonfigurationen:
- Silo-zu-Silo-Endpunkte: Wird für die Kommunikation zwischen Silos im selben Cluster verwendet.
- Client-zu-Silo-Endpunkte (oder Gateway-Endpunkte): Wird für die Kommunikation zwischen Clients und Silos im selben Cluster verwendet.
Diese Methode sollte in den meisten Fällen ausreichen, aber Sie können sie bei Bedarf weiter anpassen. Hier ist ein Beispiel für die Verwendung einer externen IP-Adresse mit Portweiterleitung:
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);
})
Intern hört das Silo auf 0.0.0.0:40000 und 0.0.0.0:50000, aber der Wert, der im Mitgliedschaftsanbieter veröffentlicht wird, ist 172.16.0.42:11111 und 172.16.0.42:30000.
Konfigurieren Sie ein Silo programmgesteuert über SiloHostBuilder und mehrere ergänzende Optionsklassen. Optionsklassen folgen Orleans dem Optionsmuster in .NET und können aus Dateien, Umgebungsvariablen oder einem anderen gültigen Konfigurationsanbieter geladen werden.
Es gibt mehrere wichtige Aspekte der Silokonfiguration:
- Orleans Clusterinformationen
- Clusteringanbieter
- Endpunkte für Silo-zu-Silo- und Client-zu-Silo-Kommunikation
- Teile der Anwendung
Dieses Beispiel zeigt eine Silokonfiguration, die Clusterinformationen definiert, Azure-Clustering verwendet und Anwendungsteile konfiguriert:
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();
Lassen Sie uns die in diesem Beispiel verwendeten Schritte aufschlüsseln:
Clusteringanbieter
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
In der Regel stellen Sie einen Dienst bereit, der auf Orleans einem Cluster von Knoten basiert, entweder auf dedizierter Hardware oder in der Cloud. Für Entwicklung und grundlegende Tests können Sie Orleans in einer Konfiguration mit einem einzigen Knoten bereitstellen. Bei der Bereitstellung in einem Cluster von Knoten wird Orleans intern zur Implementierung von Protokollen verwendet, um die Mitgliedschaft der Orleans Silos im Cluster zu ermitteln und zu verwalten, einschließlich der Erkennung von Knotenfehlern sowie der automatischen Neukonfiguration.
Für eine zuverlässige Clustermitgliedschaftsverwaltung Orleans verwendet Azure Table, SQL Server oder Apache ZooKeeper für die Knotensynchronisierung.
In diesem Beispiel verwenden wir Azure Table als Mitgliedschaftsanbieter.
Orleans Clusterinformationen
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
Hier machen wir zwei Dinge:
- Legen Sie folgendes
ClusterIdFest:"my-first-cluster"Dies ist eine eindeutige ID für den Orleans Cluster. Alle Kunden und Silos, die diese ID verwenden, können direkt miteinander kommunizieren. Sie können jedoch eine andereClusterIdfür verschiedene Bereitstellungen verwenden. - Setzen Sie
ServiceIdauf"AspNetSampleApp": Dies ist eine eindeutige ID für Ihre Anwendung, die von einigen Anbietern verwendet wird, z. B. Persistenzanbieter. Diese ID sollte stabil bleiben und sich nicht über Bereitstellungen hinweg ändern.
Standardmäßig verwendet Orleans"default" für ServiceId und ClusterId. Diese Werte müssen in den meisten Fällen nicht geändert werden.
ServiceId ist wichtiger und unterscheidet unterschiedliche logische Dienste, sodass sie Back-End-Speichersysteme ohne Störungen teilen können.
ClusterId bestimmt, welche Hosts eine Verbindung mit einem Cluster herstellen.
In jedem Cluster müssen alle Hosts dasselbe ServiceIdverwenden. Mehrere Cluster können jedoch ein ServiceId gemeinsam nutzen. Dies ermöglicht Blau-/Grün-Bereitstellungsszenarien, in denen Sie eine neue Bereitstellung (Cluster) starten, bevor Sie eine andere herunterfahren. Dies ist typisch für Systeme, die in Azure App Service gehostet werden.
Der häufigere Fall ist, dass ServiceId und ClusterId für die Lebensdauer der Anwendung fest bleiben und Sie eine rollierende Bereitstellungsstrategie verwenden. Dies ist typisch für Systeme, die in Kubernetes und Service Fabric gehostet werden.
Endpunkte
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Ein Orleans Silo verfügt über zwei typische Arten von Endpunktkonfigurationen:
- Silo-zu-Silo-Endpunkte: Wird für die Kommunikation zwischen Silos im selben Cluster verwendet.
- Client-zu-Silo-Endpunkte (oder Gateway): Wird für die Kommunikation zwischen Clients und Silos im selben Cluster verwendet.
Im Beispiel verwenden wir die Hilfsmethode .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000), die den Port für die Silo-zu-Silo-Kommunikation auf 11111 und den Gateway-Port auf 30000 setzt. Diese Methode erkennt, welche Schnittstelle abgehört werden soll.
Diese Methode sollte in den meisten Fällen ausreichen, aber Sie können sie bei Bedarf weiter anpassen. Hier ist ein Beispiel für die Verwendung einer externen IP-Adresse mit Portweiterleitung:
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);
})
Intern hört das Silo auf 0.0.0.0:40000 und 0.0.0.0:50000, aber der Wert, der im Mitgliedschaftsanbieter veröffentlicht wird, ist 172.16.0.42:11111 und 172.16.0.42:30000.
Teile der Anwendung
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
Obwohl dieser Schritt technisch nicht erforderlich ist (falls nicht konfiguriert, Orleans überprüft alle Assemblys im aktuellen Ordner), empfehlen wir Ihnen, sie zu konfigurieren. Dieser Schritt hilft, Orleans Benutzerassemblys und -typen zu laden. Diese Assemblys werden als Anwendungsteile bezeichnet. Orleans ermittelt alle Getreide-, Getreideschnittstellen- und Serialisierer mithilfe von Anwendungsteilen.
Konfigurieren Sie Anwendungsteile mit Hilfe von IApplicationPartManager, verfügbar über die Erweiterungsmethode ConfigureApplicationParts auf IClientBuilder und ISiloHostBuilder. Die ConfigureApplicationParts Methode akzeptiert eine Stellvertretung. Action<IApplicationPartManager>
Die folgenden Erweiterungsmethoden bei IApplicationPartManager unterstützen allgemeine Verwendungen:
- ApplicationPartManagerExtensions.AddApplicationPart: Fügen Sie eine einzelne Assembly mithilfe dieser Erweiterungsmethode hinzu.
-
ApplicationPartManagerExtensions.AddFromAppDomain: Fügt alle derzeit im
AppDomaingeladenen Assemblys hinzu. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory: Lädt und fügt alle Assemblys im aktuellen Basispfad hinzu (siehe AppDomain.BaseDirectory).
Ergänzen Sie Assemblys, die von den oben genannten Methoden hinzugefügt werden, indem Sie die folgenden Erweiterungsmethoden für ihren Rückgabetyp verwenden: IApplicationPartManagerWithAssemblies
- ApplicationPartManagerExtensions.WithReferences: Fügt alle referenzierten Assemblys aus den hinzugefügten Komponenten hinzu. Dadurch werden alle transitiv referenzierten Assemblys sofort geladen. Assemblyladefehler werden ignoriert.
-
ApplicationPartManagerCodeGenExtensions.WithCodeGeneration: Generiert Unterstützungscode für die hinzugefügten Teile und fügt ihn dem Webpart-Manager hinzu. Beachten Sie, dass dies die Installation des
Microsoft.Orleans.OrleansCodeGeneratorPakets erfordert und häufig als Laufzeitcodegenerierung bezeichnet wird.
Für die Typermittlung müssen die bereitgestellten Anwendungsteile bestimmte Attribute enthalten. Das Hinzufügen des Buildzeitcodegenerierungspakets (Microsoft.Orleans.CodeGenerator.MSBuild oder Microsoft.Orleans.OrleansCodeGenerator.Build) zu jedem Projekt, das Grains, Grain Interfaces oder Serializer enthält, ist der empfohlene Ansatz, um sicherzustellen, dass diese Attribute vorhanden sind. Buildzeitcodegenerierung unterstützt nur C#. Für F#, Visual Basic und andere .NET-Sprachen können Sie Code während der Konfiguration über die WithCodeGeneration oben beschriebene Methode generieren. Weitere Informationen zur Codegenerierung finden Sie im entsprechenden Abschnitt.