Dela via


Serverkonfiguration

En silo konfigureras programmatiskt med 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 via filer, miljövariabler och valfri giltig konfigurationsprovider.

Det finns flera viktiga aspekter av silokonfigurationen:

  • Klusterprovider
  • (Valfritt) Orleans klustringsinformation
  • (Valfritt) Slutpunkter som ska användas för silo-till-silo- och klient-till-silo-kommunikation

Det här är ett exempel på en silokonfiguration som definierar klusterinformation, använder Azure-klustring och konfigurerar programdelarna:

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

Dricks

När du utvecklar för kan du anropa UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) för Orleansatt konfigurera ett lokalt kluster. I produktionsmiljöer bör du använda en klustringsprovider som är lämplig för distributionen.

Klusterprovider

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

Vanligtvis distribueras 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 Orleans kan distribueras i en konfiguration med en nod. När det distribueras till ett kluster med noder Orleans implementerar internt en uppsättning protokoll för att identifiera och underhålla medlemskap Orleans för silor i klustret, inklusive identifiering av nodfel och automatisk omkonfiguration.

För tillförlitlig hantering av klustermedlemskap Orleans använder du Azure Table, SQL Server eller Apache ZooKeeper för synkronisering av noder.

I det här exemplet används 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:

  • ClusterId Ange till "my-first-cluster": detta är ett unikt ID för Orleans klustret. Alla klienter och silor som använder det här ID:t kommer att kunna kommunicera direkt med varandra. Du kan dock välja att använda en annan ClusterId för olika distributioner.
  • ServiceId Ange till "SampleApp": detta är ett unikt ID för ditt program som kommer att användas av vissa leverantörer, till exempel beständighetsproviders. Det här ID:t bör vara stabilt och inte ändras mellan distributioner.

Som standard Orleans använder du värdet "default" för för både ServiceId och ClusterId. Dessa värden behöver inte ändras i de flesta fall. ServiceId är den viktigaste av de två och används för att skilja olika logiska tjänster från varandra så att de kan dela serverdelslagringssystem utan att störa varandra. ClusterId används för att avgöra vilka värdar som ska ansluta till varandra och bilda 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 en ny distribution (kluster) startas innan en annan stängs av. Detta är typiskt för system som finns i Azure App Service.

Det vanligaste är att ServiceId och ClusterId förblir fast under programmets livslängd och att en löpande distributionsstrategi används. 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 på 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.
  • Slutpunkter från klient till silo (eller gateway) används för kommunikation mellan klienter och silor i samma kluster.

Den här metoden bör vara tillräcklig i de flesta fall, men du kan anpassa den ytterligare om du behöver. Här är ett exempel på hur du använder en extern IP-adress med viss 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 blir 172.16.0.42:11111 och 172.16.0.42:30000.

En silo konfigureras programmatiskt via SiloHostBuilder och flera kompletterande alternativklasser. Alternativklasser i Orleans följer mönstret Alternativ i .NET och kan läsas in via filer, miljövariabler och valfri giltig konfigurationsprovider.

Det finns flera viktiga aspekter av silokonfigurationen:

  • Orleans klustringsinformation
  • Klusterprovider
  • Slutpunkter som ska användas för silo-till-silo- och klient-till-silo-kommunikation
  • Programdelar

Det här är ett exempel på en silokonfiguration som definierar klusterinformation, använder Azure-klustring och konfigurerar programdelarna:

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 gå vidare med de steg som används i det här exemplet:

Klusterprovider

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

Vanligtvis distribueras 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 Orleans kan distribueras i en konfiguration med en nod. När det distribueras till ett kluster med noder Orleans implementerar internt en uppsättning protokoll för att identifiera och underhålla medlemskap Orleans för silor i klustret, inklusive identifiering av nodfel och automatisk omkonfiguration.

För tillförlitlig hantering av klustermedlemskap Orleans använder du Azure Table, SQL Server eller Apache ZooKeeper för synkronisering av noder.

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:

  • ClusterId Ange till "my-first-cluster": detta är ett unikt ID för Orleans klustret. Alla klienter och silor som använder det här ID:t kommer att kunna kommunicera direkt med varandra. Du kan dock välja att använda en annan ClusterId för olika distributioner.
  • ServiceId Ange till "AspNetSampleApp": detta är ett unikt ID för ditt program som kommer att användas av vissa leverantörer, till exempel beständighetsproviders. Det här ID:t bör vara stabilt och inte ändras mellan distributioner.

Som standard Orleans använder du värdet "default" för för både ServiceId och ClusterId. Dessa värden behöver inte ändras i de flesta fall. ServiceId är den viktigaste av de två och används för att skilja olika logiska tjänster från varandra så att de kan dela serverdelslagringssystem utan att störa varandra. ClusterId används för att avgöra vilka värdar som ska ansluta till varandra och bilda 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 en ny distribution (kluster) startas innan en annan stängs av. Detta är typiskt för system som finns i Azure App Service.

Det vanligaste är att ServiceId och ClusterId förblir fast under programmets livslängd och att en löpande distributionsstrategi används. 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 som används för kommunikation mellan silor i samma kluster
  • Klient-till-silo-slutpunkter (eller gateway) som 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 som används för silo-till-silo-kommunikation till 11111 och porten för gatewayen till 30000. Den här metoden identifierar vilket gränssnitt du ska lyssna på.

Den här metoden bör vara tillräcklig i de flesta fall, men du kan anpassa den ytterligare om du behöver. Här är ett exempel på hur du använder en extern IP-adress med viss 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 blir 172.16.0.42:11111 och 172.16.0.42:30000.

Programdelar

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), uppmanas utvecklare att konfigurera detta. Det här steget hjälper Orleans dig att läsa in användarsammansättningar och typer. Dessa sammansättningar kallas programdelar. Alla korn, korngränssnitt och serialiserare identifieras med hjälp av programdelar.

Programdelar konfigureras med , IApplicationPartManagersom kan nås med hjälp av ConfigureApplicationParts tilläggsmetoden på IClientBuilder och ISiloHostBuilder. Metoden ConfigureApplicationParts accepterar ett ombud, Action<IApplicationPartManager>.

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

Sammansättningar som läggs till med ovanstående metoder kan kompletteras med hjälp av följande tilläggsmetoder för deras returtyp: IApplicationPartManagerWithAssemblies

Typidentifiering kräver att de angivna programdelarna innehåller specifika attribut. Att lägga till versionskodgenereringspaketet (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 kod genereras under konfigurationstiden via metoden WithCodeGeneration som beskrivs ovan. Mer information om kodgenerering finns i motsvarande avsnitt.