Dela via


Serverkonfiguration

Konfigurera en silo programmatiskt med hjälp av UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) tilläggsmetoden och flera kompletterande alternativklasser. Alternativklasser i Orleans följer mönstret Alternativ i .NET och kan läsas in från filer, miljövariabler eller någon annan giltig konfigurationsprovider.

Det finns flera viktiga aspekter av silokonfigurationen:

  • Klusterprovider
  • (Valfritt) Orleans klustringsinformation
  • (Valfritt) Slutpunkter för silo-till-silo- och klient-till-silo-kommunikation

Det här exemplet visar en silokonfiguration som definierar klusterinformation, använder Azure-kluster och konfigurerar programdelar:

using IHost host = Host.CreateDefaultBuilder(args)
    .UseOrleans(builder =>
    {
        builder.UseAzureStorageClustering(
            options => options.ConfigureTableServiceClient(connectionString));
    })
    .UseConsoleLifetime()
    .Build();

Tips/Råd

När du utvecklar för Orleans, kan du anropa UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) för att konfigurera ett lokalt kluster. I produktionsmiljöer bör du använda en klustringstjänst som är lämplig för din distribution.

Klusterprovider

siloBuilder.UseAzureStorageClustering(
    options => options.ConfigureTableServiceClient(connectionString))

Vanligtvis distribuerar du en tjänst som bygger på Orleans ett kluster med noder, antingen på dedikerad maskinvara eller i molnet. För utveckling och grundläggande testning kan du distribuera Orleans i en konfiguration med en nod. När det distribueras till ett kluster med noder Orleans implementerar det internt protokoll för att identifiera och underhålla medlemskap i silor i klustret, inklusive identifiering av Orleans nodfel och automatisk omkonfiguration.

För tillförlitlig klustermedlemskapshantering Orleans använder du Azure Table, SQL Server eller Apache ZooKeeper för nodsynkronisering.

I det här exemplet använder vi Azure Table som medlemskapsprovider.

Orleans klustringsinformation

Om du vill konfigurera klustring kan du använda ClusterOptions som typparameter för Configure metoden på instansen ISiloBuilder .

siloBuilder.Configure<ClusterOptions>(options =>
{
    options.ClusterId = "my-first-cluster";
    options.ServiceId = "SampleApp";
})

Här anger du två alternativ:

  • Ställ in ClusterId till "my-first-cluster": Detta är ett unikt ID för klustret Orleans. Alla klienter och silor som använder det här ID:t kan kommunicera direkt med varandra. Du kan dock välja att använda en annan ClusterId för olika distributioner.
  • Ställ in ServiceId till "SampleApp": Detta är ett unikt ID för din applikation som används av vissa leverantörer, till exempel lagringsleverantörer. Det här ID:t bör vara stabilt och inte ändras mellan distributioner.

Som standard Orleans används "default" för både ServiceId och ClusterId. Dessa värden behöver inte ändras i de flesta fall. ServiceId är viktigare och särskiljer olika logiska tjänster, vilket gör att de kan dela serverdelslagringssystem utan störningar. ClusterId avgör vilka värdar som ansluter till ett kluster.

I varje kluster måste alla värdar använda samma ServiceId. Flera kluster kan dock dela en ServiceId. Detta möjliggör blå/gröna distributionsscenarier där du startar en ny distribution (kluster) innan du stänger av en annan. Detta är typiskt för system som finns i Azure App Service.

Det vanligare är att ServiceId och ClusterId förblir fast för programmets livslängd, och du använder en löpande distributionsstrategi. Detta är typiskt för system som finns i Kubernetes och Service Fabric.

Slutpunkter

Som standard Orleans lyssnar på alla gränssnitt på porten 11111 för silo-till-silo-kommunikation och port 30000 för kommunikation från klient till silo. Om du vill åsidosätta det här beteendet anropar ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) och skickar du de portnummer som du vill använda.

siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)

I koden ovan:

  • Siloporten är inställd på 17_256.
  • Gatewayporten är inställd på 34_512.

En Orleans silo har två typiska typer av slutpunktskonfiguration:

  • Silo-till-silo-slutpunkter: Används för kommunikation mellan silor i samma kluster.
  • Klient-till-silo (eller gateway) slutpunkter: Används för att möjliggöra kommunikation mellan klienter och silor inom samma kluster.

Den här metoden bör räcka i de flesta fall, men du kan anpassa den ytterligare om det behövs. Här är ett exempel på hur du använder en extern IP-adress med portvidarebefordring:

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);
})

Internt lyssnar silon på 0.0.0.0:40000 och 0.0.0.0:50000, men värdet som publiceras i medlemskapsprovidern är 172.16.0.42:11111 och 172.16.0.42:30000.

Konfigurera en silo programmatiskt via SiloHostBuilder och flera kompletterande alternativklasser. Alternativklasser i Orleans följer mönstret Alternativ i .NET och kan läsas in från filer, miljövariabler eller någon annan giltig konfigurationsprovider.

Det finns flera viktiga aspekter av silokonfigurationen:

  • Orleans klustringsinformation
  • Klusterprovider
  • Slutpunkter för silo-till-silo- och klient-till-silo-kommunikation
  • Applikationsdelar

Det här exemplet visar en silokonfiguration som definierar klusterinformation, använder Azure-kluster och konfigurerar programdelar:

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();

Nu ska vi dela upp de steg som används i det här exemplet:

Klusterprovider

siloBuilder.UseAzureStorageClustering(
    options => options.ConnectionString = connectionString)

Vanligtvis distribuerar du en tjänst som bygger på Orleans ett kluster med noder, antingen på dedikerad maskinvara eller i molnet. För utveckling och grundläggande testning kan du distribuera Orleans i en konfiguration med en nod. När det distribueras till ett kluster med noder Orleans implementerar det internt protokoll för att identifiera och underhålla medlemskap i silor i klustret, inklusive identifiering av Orleans nodfel och automatisk omkonfiguration.

För tillförlitlig klustermedlemskapshantering Orleans använder du Azure Table, SQL Server eller Apache ZooKeeper för nodsynkronisering.

I det här exemplet använder vi Azure Table som medlemskapsprovider.

Orleans klustringsinformation

.Configure<ClusterOptions>(options =>
{
    options.ClusterId = "my-first-cluster";
    options.ServiceId = "AspNetSampleApp";
})

Här gör vi två saker:

  • Ställ in ClusterId till "my-first-cluster": Detta är ett unikt ID för klustret Orleans. Alla klienter och silor som använder det här ID:t kan kommunicera direkt med varandra. Du kan dock välja att använda en annan ClusterId för olika distributioner.
  • Ställ in ServiceId till "AspNetSampleApp": Detta är ett unikt ID för din applikation som används av vissa leverantörer, till exempel lagringsleverantörer. Det här ID:t bör vara stabilt och inte ändras mellan distributioner.

Som standard Orleans används "default" för både ServiceId och ClusterId. Dessa värden behöver inte ändras i de flesta fall. ServiceId är viktigare och särskiljer olika logiska tjänster, vilket gör att de kan dela serverdelslagringssystem utan störningar. ClusterId avgör vilka värdar som ansluter till ett kluster.

I varje kluster måste alla värdar använda samma ServiceId. Flera kluster kan dock dela en ServiceId. Detta möjliggör blå/gröna distributionsscenarier där du startar en ny distribution (kluster) innan du stänger av en annan. Detta är typiskt för system som finns i Azure App Service.

Det vanligare är att ServiceId och ClusterId förblir fast för programmets livslängd, och du använder en löpande distributionsstrategi. Detta är typiskt för system som finns i Kubernetes och Service Fabric.

Slutpunkter

siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)

En Orleans silo har två typiska typer av slutpunktskonfiguration:

  • Silo-till-silo-slutpunkter: Används för kommunikation mellan silor i samma kluster.
  • Klient-till-silo-slutpunkter (eller gateway): Används för kommunikation mellan klienter och silor i samma kluster.

I exemplet använder vi hjälpmetoden .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000), som anger porten för silo-till-silo-kommunikation till 11111 och gatewayporten till 30000. Den här metoden identifierar vilket gränssnitt som ska lyssnas på.

Den här metoden bör räcka i de flesta fall, men du kan anpassa den ytterligare om det behövs. Här är ett exempel på hur du använder en extern IP-adress med portvidarebefordring:

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);
})

Internt lyssnar silon på 0.0.0.0:40000 och 0.0.0.0:50000, men värdet som publiceras i medlemskapsprovidern är 172.16.0.42:11111 och 172.16.0.42:30000.

Applikationsdelar

siloBuilder.ConfigureApplicationParts(
    parts => parts.AddApplicationPart(
        typeof(ValueGrain).Assembly)
        .WithReferences())

Även om det här steget inte är tekniskt obligatoriskt (om det inte är konfigurerat, Orleans genomsöker alla sammansättningar i den aktuella mappen), rekommenderar vi att du konfigurerar det. Det här steget hjälper Orleans att läsa in användarsammanställningar och typer. Dessa sammansättningar kallas programdelar. Orleans identifierar alla korn, korngränssnitt och serialiserare med hjälp av programdelar.

Konfigurera applikationsdelar med IApplicationPartManager, tillgängliga via förlängningsmetoden ConfigureApplicationPartsIClientBuilder och ISiloHostBuilder. Metoden ConfigureApplicationParts accepterar ett ombud, Action<IApplicationPartManager>.

Följande tilläggsmetoder för IApplicationPartManager stödjer vanliga användningsområden:

Tilläggssammansättningar som läggs till med ovanstående metoder använder följande utökande metoder på sin returtyp: IApplicationPartManagerWithAssemblies

Typidentifiering kräver att de angivna programdelarna innehåller specifika attribut. Att lägga till byggtidkodgenereringspaketet (Microsoft.Orleans.CodeGenerator.MSBuild eller Microsoft.Orleans.OrleansCodeGenerator.Build) i varje projekt som innehåller Grains, Grain Interfaces eller Serializers är den rekommenderade metoden för att säkerställa att dessa attribut finns. Generering av byggtidskod stöder endast C#. För F#-, Visual Basic- och andra .NET-språk kan du generera kod under konfigurationstiden via metoden WithCodeGeneration som beskrivs ovan. Mer information om kodgenerering finns i motsvarande avsnitt.