Delen via


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 andere ClusterId 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 ServiceIdgebruiken. 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 andere ClusterId 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 ServiceIdgebruiken. 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:

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.