Sdílet prostřednictvím


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 jinou ClusterId .
  • 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 ClusterIdhodnotu . 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_256hodnotu .
  • Port brány je nastavený na 34_512hodnotu .

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 jinou ClusterId .
  • 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 ClusterIdhodnotu . 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í:

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.