Serverconfiguratie
Een silo wordt programmatisch geconfigureerd met de UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) extensiemethode en verschillende aanvullende optieklassen. Optieklassen volgen Orleans het patroon Opties in .NET en kunnen worden geladen via bestanden, omgevingsvariabelen en elke geldige configuratieprovider.
Er zijn verschillende belangrijke aspecten van siloconfiguratie:
- Clusteringprovider
- (Optioneel) Orleans clusteringinformatie
- (Optioneel) Eindpunten die moeten worden gebruikt voor communicatie tussen silo's en client-naar-silo's
Dit is een voorbeeld van een siloconfiguratie die clustergegevens definieert, gebruikmaakt van Azure-clustering en de toepassingsonderdelen configureert:
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
Tip
Bij het ontwikkelen Orleansvoor, kunt u aanroepen UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) om een lokaal cluster te configureren. In productieomgevingen moet u een clusterprovider gebruiken die geschikt is voor uw implementatie.
Clusteringprovider
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
Normaal gesproken wordt een service die is Orleans gebouwd geïmplementeerd op een cluster met knooppunten, op toegewezen hardware of in de cloud. Voor ontwikkeling en eenvoudige tests Orleans kan worden geïmplementeerd in een configuratie met één knooppunt. Wanneer deze wordt geïmplementeerd in een cluster met knooppunten, Orleans implementeert u intern een set protocollen om lidmaatschap van Orleans silo's in het cluster te detecteren en te onderhouden, waaronder detectie van knooppuntfouten en automatische herconfiguratie.
Voor betrouwbaar beheer van clusterlidmaatschap gebruikt Orleans u Azure Table, SQL Server of Apache ZooKeeper voor de synchronisatie van knooppunten.
In dit voorbeeld wordt Azure Table gebruikt als de lidmaatschapsprovider.
Orleans clusteringinformatie
Als u clustering optioneel wilt configureren, gebruikt ClusterOptions
u deze als de typeparameter voor de Configure methode op het ISiloBuilder
exemplaar.
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
Hier geeft u twee opties op:
- Stel het volgende
ClusterId
"my-first-cluster"
in: dit is een unieke id voor het Orleans cluster. Alle clients en silo's die deze id gebruiken, kunnen rechtstreeks met elkaar communiceren. U kunt er echter voor kiezen om een andereClusterId
te gebruiken voor verschillende implementaties. - Stel het
ServiceId
volgende"SampleApp"
in: dit is een unieke id voor uw toepassing die wordt gebruikt door sommige providers, zoals persistentieproviders. Deze id moet stabiel blijven en niet veranderen tussen implementaties.
Orleans Standaard wordt een waarde gebruikt voor "default"
zowel de ServiceId
als de ClusterId
. Deze waarden hoeven in de meeste gevallen niet te worden gewijzigd. ServiceId
is des te belangrijker van de twee en wordt gebruikt om verschillende logische services van elkaar te onderscheiden, zodat ze back-endopslagsystemen kunnen delen zonder elkaar te verstoren. ClusterId
wordt gebruikt om te bepalen welke hosts verbinding met elkaar maken en een cluster vormen.
Binnen elk cluster moeten alle hosts hetzelfde ServiceId
gebruiken. Meerdere clusters kunnen een echter wel delen ServiceId
. Dit maakt blauw/groen implementatiescenario's mogelijk waarbij een nieuwe implementatie (cluster) wordt gestart voordat een andere implementatie wordt afgesloten. Dit is gebruikelijk voor systemen die worden gehost in Azure-app Service.
Hoe vaker het geval is dat ServiceId
en ClusterId
blijven vaststaan voor de levensduur van de toepassing en dat er een rolling implementatiestrategie wordt gebruikt. Dit is gebruikelijk voor systemen die worden gehost in Kubernetes en Service Fabric.
Eindpunten
Orleans Standaard luistert u op alle interfaces op de poort 11111
voor silo-naar-silo-communicatie en op de poort 30000
voor client-naar-silo-communicatie. Als u dit gedrag wilt negeren, roept ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) u de poortnummers aan die u wilt gebruiken en geeft u deze door.
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
In de voorgaande code:
- De silopoort is ingesteld op
17_256
. - De gatewaypoort is ingesteld op
34_512
.
Een Orleans silo heeft twee typische typen eindpuntconfiguratie:
- Silo-naar-silo-eindpunten worden gebruikt voor communicatie tussen silo's in hetzelfde cluster.
- Client-naar-silo-eindpunten (of gateway) worden gebruikt voor communicatie tussen clients en silo's in hetzelfde cluster.
Deze methode moet in de meeste gevallen voldoende zijn, maar u kunt deze desgewenst verder aanpassen. Hier volgt een voorbeeld van het gebruik van een extern IP-adres met port-forwarding:
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 luistert de silo en 0.0.0.0:40000
0.0.0.0:50000
, maar de waarde die is gepubliceerd in de lidmaatschapsprovider zal en 172.16.0.42:11111
172.16.0.42:30000
.
Een silo wordt programmatisch geconfigureerd via SiloHostBuilder verschillende aanvullende optieklassen. Optieklassen volgen Orleans het patroon Opties in .NET en kunnen worden geladen via bestanden, omgevingsvariabelen en elke geldige configuratieprovider.
Er zijn verschillende belangrijke aspecten van siloconfiguratie:
- Orleans clusteringinformatie
- Clusteringprovider
- Eindpunten die moeten worden gebruikt voor communicatie tussen silo's en client-naar-silo's
- Toepassingsonderdelen
Dit is een voorbeeld van een siloconfiguratie die clustergegevens definieert, gebruikmaakt van Azure-clustering en de toepassingsonderdelen configureert:
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();
Laten we de stappen uitsplitsen die in dit voorbeeld worden gebruikt:
Clusteringprovider
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
Normaal gesproken wordt een service die is Orleans gebouwd geïmplementeerd op een cluster met knooppunten, op toegewezen hardware of in de cloud. Voor ontwikkeling en eenvoudige tests Orleans kan worden geïmplementeerd in een configuratie met één knooppunt. Wanneer deze wordt geïmplementeerd in een cluster met knooppunten, Orleans implementeert u intern een set protocollen om lidmaatschap van Orleans silo's in het cluster te detecteren en te onderhouden, waaronder detectie van knooppuntfouten en automatische herconfiguratie.
Voor betrouwbaar beheer van clusterlidmaatschap gebruikt Orleans u Azure Table, SQL Server of Apache ZooKeeper voor de synchronisatie van knooppunten.
In dit voorbeeld gebruiken we Azure Table als lidmaatschapsprovider.
Orleans clusteringinformatie
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
Hier doen we twee dingen:
- Stel het volgende
ClusterId
"my-first-cluster"
in: dit is een unieke id voor het Orleans cluster. Alle clients en silo's die deze id gebruiken, kunnen rechtstreeks met elkaar communiceren. U kunt er echter voor kiezen om een andereClusterId
te gebruiken voor verschillende implementaties. - Stel het
ServiceId
volgende"AspNetSampleApp"
in: dit is een unieke id voor uw toepassing die wordt gebruikt door sommige providers, zoals persistentieproviders. Deze id moet stabiel blijven en niet veranderen tussen implementaties.
Orleans Standaard wordt een waarde gebruikt voor "default"
zowel de ServiceId
als de ClusterId
. Deze waarden hoeven in de meeste gevallen niet te worden gewijzigd. ServiceId
is des te belangrijker van de twee en wordt gebruikt om verschillende logische services van elkaar te onderscheiden, zodat ze back-endopslagsystemen kunnen delen zonder elkaar te verstoren. ClusterId
wordt gebruikt om te bepalen welke hosts verbinding met elkaar maken en een cluster vormen.
Binnen elk cluster moeten alle hosts hetzelfde ServiceId
gebruiken. Meerdere clusters kunnen een echter wel delen ServiceId
. Dit maakt blauw/groen implementatiescenario's mogelijk waarbij een nieuwe implementatie (cluster) wordt gestart voordat een andere implementatie wordt afgesloten. Dit is gebruikelijk voor systemen die worden gehost in Azure-app Service.
Hoe vaker het geval is dat ServiceId
en ClusterId
blijven vaststaan voor de levensduur van de toepassing en dat er een rolling implementatiestrategie wordt gebruikt. Dit is gebruikelijk voor systemen die worden gehost in Kubernetes en Service Fabric.
Eindpunten
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Een Orleans silo heeft twee typische typen eindpuntconfiguratie:
- Silo-naar-silo-eindpunten, gebruikt voor communicatie tussen silo's in hetzelfde cluster
- Client-naar-silo-eindpunten (of gateway), gebruikt voor communicatie tussen clients en silo's in hetzelfde cluster
In het voorbeeld gebruiken we de helpermethode .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
waarmee de poort die wordt gebruikt voor silo-naar-silo-communicatie 11111
en de poort voor de gateway wordt ingesteld op 30000
.
Met deze methode wordt gedetecteerd naar welke interface moet worden geluisterd.
Deze methode moet in de meeste gevallen voldoende zijn, maar u kunt deze desgewenst verder aanpassen. Hier volgt een voorbeeld van het gebruik van een extern IP-adres met port-forwarding:
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 luistert de silo en 0.0.0.0:40000
0.0.0.0:50000
, maar de waarde die is gepubliceerd in de lidmaatschapsprovider zal en 172.16.0.42:11111
172.16.0.42:30000
.
Toepassingsonderdelen
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
Hoewel deze stap technisch niet vereist is (indien niet geconfigureerd, Orleans worden alle assembly's in de huidige map gescand), wordt ontwikkelaars aangeraden dit te configureren. Met deze stap kunt Orleans u gebruikersassembly's en -typen laden. Deze assembly's worden toepassingsonderdelen genoemd. Alle korrels, graaninterfaces en serializers worden gedetecteerd met behulp van toepassingsonderdelen.
Toepassingsonderdelen worden geconfigureerd met behulp van IApplicationPartManager, die kan worden geopend met behulp van de ConfigureApplicationParts
extensiemethode op IClientBuilder en ISiloHostBuilder. De ConfigureApplicationParts
methode accepteert een gemachtigde, Action<IApplicationPartManager>
.
De volgende uitbreidingsmethoden voor IApplicationPartManager veelvoorkomend gebruik van ondersteuning:
- ApplicationPartManagerExtensions.AddApplicationPart een enkele assembly kan worden toegevoegd met behulp van deze extensiemethode.
- ApplicationPartManagerExtensions.AddFromAppDomain voegt alle assembly's toe die momenteel zijn geladen in de
AppDomain
. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory laadt en voegt alle assembly's toe in het huidige basispad (zie AppDomain.BaseDirectory).
Assembly's die door de bovenstaande methoden worden toegevoegd, kunnen worden aangevuld met behulp van de volgende uitbreidingsmethoden op hun retourtype: IApplicationPartManagerWithAssemblies
- ApplicationPartManagerExtensions.WithReferences voegt alle assembly's waarnaar wordt verwezen uit de toegevoegde onderdelen toe. Hiermee laadt u onmiddellijk eventuele transitieve assembly's waarnaar wordt verwezen. Fouten bij het laden van assembly's worden genegeerd.
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration genereert ondersteuningscode voor de toegevoegde onderdelen en voegt deze toe aan de onderdeelbeheerder. Houd er rekening mee dat hiervoor het
Microsoft.Orleans.OrleansCodeGenerator
pakket moet worden geïnstalleerd en ook wel runtimecodegeneratie wordt genoemd.
Voor typedetectie is vereist dat de opgegeven toepassingsonderdelen specifieke kenmerken bevatten. Het compileren van het codegeneratiepakket (Microsoft.Orleans.CodeGenerator.MSBuild
of Microsoft.Orleans.OrleansCodeGenerator.Build
) toevoegen aan elk project met Grains, Grain Interfaces of Serializers is de aanbevolen methode om ervoor te zorgen dat deze kenmerken aanwezig zijn. Het genereren van build-timecode ondersteunt alleen C#. Voor F#, Visual Basic en andere .NET-talen kan code worden gegenereerd tijdens de configuratie via de WithCodeGeneration hierboven beschreven methode. Meer informatie over het genereren van code vindt u in de bijbehorende sectie.