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 annanClusterId
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 annanClusterId
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:
- ApplicationPartManagerExtensions.AddApplicationPart en enskild sammansättning kan läggas till med hjälp av den här tilläggsmetoden.
- ApplicationPartManagerExtensions.AddFromAppDomain lägger till alla sammansättningar som för närvarande läses in i
AppDomain
. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory läser in och lägger till alla sammansättningar i den aktuella bassökvägen (se AppDomain.BaseDirectory).
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
- ApplicationPartManagerExtensions.WithReferences lägger till alla refererade sammansättningar från de tillagda delarna. Detta läser omedelbart in alla transitivt refererade sammansättningar. Sammansättningsinläsningsfel ignoreras.
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration genererar stödkod för de tillagda delarna och lägger till den i delhanteraren. Observera att detta kräver
Microsoft.Orleans.OrleansCodeGenerator
att paketet installeras och ofta kallas körningskodgenerering.
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.