Konfigurace serveru
Silo se konfiguruje programově pomocí UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) rozšiřující metody a několika doplňkových tříd možností. Třídy možností se řídí Orleans vzorem Možnosti v .NET a lze je načíst prostřednictvím souborů, proměnných prostředí a libovolného platného zprostředkovatele konfigurace.
Konfigurace sila má několik klíčových aspektů:
- Poskytovatel clusteringu
- (Volitelné) Orleans informace o clusteringu
- (Volitelné) Koncové body, které se mají použít pro komunikaci mezi silo-to-silo a klient-silo
Toto je příklad konfigurace sila, která definuje informace o clusteru, používá clustering Azure a konfiguruje části aplikace:
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
Tip
Při vývoji pro Orleansmůžete volat UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) konfiguraci místního clusteru. V produkčních prostředích byste měli použít poskytovatele clusteringu, který je vhodný pro vaše nasazení.
Poskytovatel clusteringu
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
Obvykle je služba postavená Orleans na clusteru uzlů, a to buď na vyhrazeném hardwaru, nebo v cloudu. Pro účely vývoje a základního testování Orleans je možné nasadit v konfiguraci s jedním uzlem. Při nasazení do clusteru uzlů Orleans interně implementuje sadu protokolů pro zjišťování a udržování členství Orleans sil v clusteru, včetně detekce selhání uzlů a automatické rekonfigurace.
Pro spolehlivou správu členství Orleans v clusteru používá azure Table, SQL Server nebo Apache ZooKeeper k synchronizaci uzlů.
V této ukázce se použije azure Table jako poskytovatel členství.
Orleans informace o clusteringu
Pokud chcete volitelně nakonfigurovat clustering, použijte ClusterOptions
jako parametr typu pro metodu Configure v ISiloBuilder
instanci.
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
Tady zadáte dvě možnosti:
ClusterId
Nastavte na"my-first-cluster"
: jedná se o jedinečné ID clusteruOrleans. Všichni klienti a sila, kteří používají toto ID, budou moct vzájemně komunikovat přímo. Pro různá nasazení se ale můžete rozhodnout použít jinouClusterId
.ServiceId
Nastavte hodnotu"SampleApp"
: toto je jedinečné ID vaší aplikace, které budou používat někteří poskytovatelé, například zprostředkovatelé trvalosti. Toto ID by mělo zůstat stabilní a nemělo by se měnit napříč nasazeními.
Ve výchozím nastavení Orleans použije hodnotu "default"
pro ServiceId
obě hodnoty a ClusterId
hodnotu . Tyto hodnoty není nutné ve většině případů měnit. ServiceId
je čím dál důležitější, a používá se k odlišení různých logických služeb, aby mohly sdílet back-endové systémy úložiště, aniž by se vzájemně zasahovaly. ClusterId
slouží k určení, kteří hostitelé se k sobě připojí, a vytvoří cluster.
V každém clusteru musí všichni hostitelé používat stejné ServiceId
. Několik clusterů ale může sdílet.ServiceId
To umožňuje scénáře modrého/zeleného nasazení, kdy se před vypnutím jiného nasazení spustí nové nasazení (cluster). To je typické pro systémy hostované ve službě Aplikace Azure Service.
Častějším případem je, že ServiceId
a ClusterId
zůstane pevně nastavená po celou dobu životnosti aplikace a použije se strategie postupného nasazení. To je typické pro systémy hostované v Kubernetes a Service Fabric.
Koncové body
Ve výchozím nastavení Orleans bude naslouchat všem rozhraním na portu 11111
pro komunikaci silo-to-silo a na portu 30000
pro komunikaci mezi klientem-silo. Pokud chcete toto chování přepsat, zavolejte ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) a předejte čísla portů, která chcete použít.
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
V předchozím kódu:
- Port sila je nastaven na
17_256
hodnotu . - Port brány je nastavený na
34_512
hodnotu .
Silo Orleans má dva typické typy konfigurace koncového bodu:
- Koncové body Silo-to-silo se používají ke komunikaci mezi sily ve stejném clusteru.
- Koncové body typu klient-silo (nebo brána) se používají ke komunikaci mezi klienty a silami ve stejném clusteru.
Tato metoda by měla být ve většině případů dostatečná, ale pokud ji potřebujete, můžete ji dále přizpůsobit. Tady je příklad použití externí IP adresy s některými přesměrováními portů:
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ě, silo bude poslouchat 0.0.0.0:40000
a 0.0.0.0:50000
, ale hodnota publikovaná ve zprostředkovateli členství bude 172.16.0.42:11111
a 172.16.0.42:30000
.
Silo se konfiguruje programově prostřednictvím SiloHostBuilder několika doplňkových tříd možností. Třídy možností se řídí Orleans vzorem Možnosti v .NET a lze je načíst prostřednictvím souborů, proměnných prostředí a libovolného platného zprostředkovatele konfigurace.
Konfigurace sila má několik klíčových aspektů:
- Orleans informace o clusteringu
- Poskytovatel clusteringu
- Koncové body, které se mají použít pro komunikaci mezi silo-to-silo a klient-silo
- Části aplikace
Toto je příklad konfigurace sila, která definuje informace o clusteru, používá clustering Azure a konfiguruje části aplikace:
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();
Pojďme si rozčlenět kroky použité v této ukázce:
Poskytovatel clusteringu
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
Obvykle je služba postavená Orleans na clusteru uzlů, a to buď na vyhrazeném hardwaru, nebo v cloudu. Pro účely vývoje a základního testování Orleans je možné nasadit v konfiguraci s jedním uzlem. Při nasazení do clusteru uzlů Orleans interně implementuje sadu protokolů pro zjišťování a udržování členství Orleans sil v clusteru, včetně detekce selhání uzlů a automatické rekonfigurace.
Pro spolehlivou správu členství Orleans v clusteru používá azure Table, SQL Server nebo Apache ZooKeeper k synchronizaci uzlů.
V této ukázce jako poskytovatele členství používáme tabulku Azure.
Orleans informace o clusteringu
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
Tady děláme dvě věci:
ClusterId
Nastavte na"my-first-cluster"
: jedná se o jedinečné ID clusteruOrleans. Všichni klienti a sila, kteří používají toto ID, budou moct vzájemně komunikovat přímo. Pro různá nasazení se ale můžete rozhodnout použít jinouClusterId
.ServiceId
Nastavte hodnotu"AspNetSampleApp"
: toto je jedinečné ID vaší aplikace, které budou používat někteří poskytovatelé, například zprostředkovatelé trvalosti. Toto ID by mělo zůstat stabilní a nemělo by se měnit napříč nasazeními.
Ve výchozím nastavení Orleans použije hodnotu "default"
pro ServiceId
obě hodnoty a ClusterId
hodnotu . Tyto hodnoty není nutné ve většině případů měnit. ServiceId
je čím dál důležitější, a používá se k odlišení různých logických služeb, aby mohly sdílet back-endové systémy úložiště, aniž by se vzájemně zasahovaly. ClusterId
slouží k určení, kteří hostitelé se k sobě připojí, a vytvoří cluster.
V každém clusteru musí všichni hostitelé používat stejné ServiceId
. Několik clusterů ale může sdílet.ServiceId
To umožňuje scénáře modrého/zeleného nasazení, kdy se před vypnutím jiného nasazení spustí nové nasazení (cluster). To je typické pro systémy hostované ve službě Aplikace Azure Service.
Častějším případem je, že ServiceId
a ClusterId
zůstane pevně nastavená po celou dobu životnosti aplikace a použije se strategie postupného nasazení. To je typické pro systémy hostované v Kubernetes a Service Fabric.
Koncové body
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Silo Orleans má dva typické typy konfigurace koncového bodu:
- Koncové body Silo-to-silo používané pro komunikaci mezi sily ve stejném clusteru
- Koncové body mezi klienty (nebo bránou) používané ke komunikaci mezi klienty a silami ve stejném clusteru
V ukázce používáme pomocnou metodu .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
, která nastaví port používaný pro komunikaci 11111
mezi silem a portem brány na 30000
.
Tato metoda zjistí, jaké rozhraní se má naslouchat.
Tato metoda by měla být ve většině případů dostatečná, ale pokud ji potřebujete, můžete ji dále přizpůsobit. Tady je příklad použití externí IP adresy s některými přesměrováními portů:
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ě, silo bude poslouchat 0.0.0.0:40000
a 0.0.0.0:50000
, ale hodnota publikovaná ve zprostředkovateli členství bude 172.16.0.42:11111
a 172.16.0.42:30000
.
Části aplikace
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
I když tento krok není technicky nutný (pokud není nakonfigurovaný, Orleans zkontroluje všechna sestavení v aktuální složce), vývojáři jsou vyzváni, aby to nakonfigurovali. Tento krok vám pomůže Orleans načíst uživatelská sestavení a typy. Tato sestavení se označují jako části aplikace. Všechny zrna, rozhraní zrn a serializátory jsou zjištěny pomocí aplikačních částí.
Části aplikace se konfigurují pomocí IApplicationPartManager, které lze získat přístup pomocí ConfigureApplicationParts
metody rozšíření a IClientBuilder ISiloHostBuilder. Metoda ConfigureApplicationParts
přijímá delegáta , Action<IApplicationPartManager>
.
Následující metody rozšíření pro IApplicationPartManager podporu běžných použití:
- ApplicationPartManagerExtensions.AddApplicationPart Pomocí této metody rozšíření lze přidat jedno sestavení.
- ApplicationPartManagerExtensions.AddFromAppDomain přidá všechna sestavení, která jsou aktuálně načtena v souboru
AppDomain
. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory načte a přidá všechna sestavení v aktuální základní cestě (viz AppDomain.BaseDirectory).
Sestavení přidaná výše uvedenými metodami lze doplnit pomocí následujících rozšiřujících metod jejich návratového typu: IApplicationPartManagerWithAssemblies
- ApplicationPartManagerExtensions.WithReferences přidá všechna odkazovaná sestavení z přidaných částí. Tím se okamžitě načte jakákoli přechodně odkazovaná sestavení. Chyby načítání sestavení se ignorují.
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration vygeneruje kód podpory pro přidané části a přidá ho do správce částí. Mějte na paměti, že to vyžaduje
Microsoft.Orleans.OrleansCodeGenerator
instalaci balíčku a běžně se označuje jako generování kódu modulu runtime.
Zjišťování typů vyžaduje, aby zadané části aplikace zahrnovaly konkrétní atributy. Přidání balíčku pro generování kódu sestavení (Microsoft.Orleans.CodeGenerator.MSBuild
nebo Microsoft.Orleans.OrleansCodeGenerator.Build
) do každého projektu obsahujícího zrna, rozhraní zrn nebo serializátory je doporučený postup pro zajištění, že jsou tyto atributy přítomny. Generování kódu v době sestavení podporuje pouze jazyk C#. V jazyce F#, Visual Basic a dalších jazycích .NET lze kód vygenerovat během doby konfigurace pomocí WithCodeGeneration výše popsané metody. Další informace týkající se generování kódu najdete v příslušné části.