Udostępnij za pośrednictwem


Konfiguracja serwera

Skonfiguruj silos w sposób programistyczny za pomocą metody rozszerzenia UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) oraz kilku dodatkowych klas opcji. Klasy opcji w Orleans programie są zgodne ze wzorcem opcji na platformie .NET i mogą być ładowane z plików, zmiennych środowiskowych lub dowolnego innego prawidłowego dostawcy konfiguracji.

Istnieje kilka kluczowych aspektów konfiguracji silosu:

  • Dostawca klastrowania
  • (Opcjonalnie) Orleans informacje o klastrowaniu
  • (Opcjonalnie) Punkty końcowe komunikacji silos-to-silos i klient-silos

W tym przykładzie przedstawiono konfigurację silosu definiującą informacje o klastrze, używając klastrowania platformy Azure i konfigurując części aplikacji:

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

Wskazówka

Podczas tworzenia dla Orleans można wywołać UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String), aby skonfigurować klaster lokalny. W środowiskach produkcyjnych należy użyć dostawcy klastrowania odpowiedniego dla danego wdrożenia.

Dostawca klastrowania

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

Zazwyczaj wdrażasz usługę opartą na Orleans na klastrze węzłów, albo na dedykowanym sprzęcie, albo w chmurze. Na potrzeby programowania i testowania podstawowego można wdrożyć Orleans w konfiguracji z jednym węzłem. Po wdrożeniu w klastrze węzłów Orleans wewnętrznie implementuje protokoły w celu odnajdywania i konserwacji członkostwa Orleans silosów w klastrze, w tym wykrywania awarii węzłów i automatycznej rekonfiguracji.

W celu zapewnienia niezawodnego zarządzania członkostwem Orleans w klastrze do synchronizacji węzłów jest używana usługa Azure Table, SQL Server lub Apache ZooKeeper.

W tym przykładzie jako dostawcy członkostwa używamy tabel Azure.

Orleans informacje o klastrowaniu

Aby opcjonalnie skonfigurować klastrowanie, użyj ClusterOptions jako parametru typu dla Configure metody w wystąpieniu ISiloBuilder .

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

W tym miejscu należy określić dwie opcje:

  • Ustaw ClusterId na wartość "my-first-cluster": To jest unikatowy identyfikator dla klastra Orleans. Wszyscy klienci i silosy używające tego identyfikatora mogą komunikować się bezpośrednio ze sobą. Możesz jednak użyć innego ClusterId rozwiązania dla różnych wdrożeń.
  • Ustaw ServiceId na "SampleApp": To unikalny identyfikator aplikacji używany przez niektórych dostawców, takich jak dostawcy trwałości. Ten identyfikator powinien pozostać stabilny i nie zmieniać się we wszystkich wdrożeniach.

Domyślnie Orleans używa "default" zarówno dla ServiceId jak i ClusterId. Te wartości nie wymagają zmiany w większości przypadków. ServiceId jest bardziej znacząca i rozróżnia różne usługi logiczne, umożliwiając im współużytkowanie systemów magazynowania zaplecza bez zakłóceń. ClusterId określa, które hosty łączą się z klastrem.

W każdym klastrze wszystkie hosty muszą używać tego samego ServiceId. Jednak wiele klastrów może współużytkować klaster ServiceId. Umożliwia to scenariusze wdrażania niebieskiego/zielonego, w których rozpoczynasz nowe wdrożenie (klaster) przed zamknięciem innego. Jest to typowe dla systemów hostowanych w usłudze Azure App Service.

Bardziej typowym przypadkiem jest to, że ServiceId i ClusterId pozostają stałe przez cały okres istnienia aplikacji, i używasz strategii wdrażania stopniowego. Jest to typowe dla systemów hostowanych na platformie Kubernetes i w usłudze Service Fabric.

Punkty końcowe

Domyślnie Orleans nasłuchuje wszystkich interfejsów na porcie 11111 dla komunikacji silos-to-silo i portu 30000 dla komunikacji klient-silos. Aby zastąpić to zachowanie, wywołaj ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) i przekaż numery portów, których chcesz użyć.

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

W poprzednim kodzie:

  • Port silosu ma wartość 17_256.
  • Port bramy jest ustawiony na 34_512.

Silos Orleans ma dwa typowe typy konfiguracji punktu końcowego:

  • Punkty końcowe silosów: używane do komunikacji pomiędzy silosami w obrębie tego samego klastra.
  • Punkty końcowe typu klient-silos (lub brama): używane do komunikacji między klientami i silosami w tym samym klastrze.

Ta metoda powinna być wystarczająca w większości przypadków, ale w razie potrzeby można ją jeszcze bardziej dostosować. Oto przykład użycia zewnętrznego adresu IP z przekazywaniem portów:

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

Wewnętrznie silos nasłuchuje na 0.0.0.0:40000 i 0.0.0.0:50000, ale wartość opublikowana przez dostawcę członkostwa to 172.16.0.42:11111 i 172.16.0.42:30000.

Skonfiguruj silos programowo za pomocą SiloHostBuilder oraz kilku dodatkowych klas opcji. Klasy opcji w Orleans programie są zgodne ze wzorcem opcji na platformie .NET i mogą być ładowane z plików, zmiennych środowiskowych lub dowolnego innego prawidłowego dostawcy konfiguracji.

Istnieje kilka kluczowych aspektów konfiguracji silosu:

  • Orleans informacje o klastrowaniu
  • Dostawca klastrowania
  • Punkty końcowe komunikacji między silosami oraz klientem a silosem
  • Części aplikacji

W tym przykładzie przedstawiono konfigurację silosu definiującą informacje o klastrze, używając klastrowania platformy Azure i konfigurując części aplikacji:

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

Przeanalizujmy kroki użyte w tym przykładzie:

Dostawca klastrowania

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

Zazwyczaj wdrażasz usługę opartą na Orleans na klastrze węzłów, albo na dedykowanym sprzęcie, albo w chmurze. Na potrzeby programowania i testowania podstawowego można wdrożyć Orleans w konfiguracji z jednym węzłem. Po wdrożeniu w klastrze węzłów Orleans wewnętrznie implementuje protokoły w celu odnajdywania i konserwacji członkostwa Orleans silosów w klastrze, w tym wykrywania awarii węzłów i automatycznej rekonfiguracji.

W celu zapewnienia niezawodnego zarządzania członkostwem Orleans w klastrze do synchronizacji węzłów jest używana usługa Azure Table, SQL Server lub Apache ZooKeeper.

W tym przykładzie jako dostawcy członkostwa używamy tabel Azure.

Orleans informacje o klastrowaniu

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

W tym miejscu wykonamy dwie czynności:

  • Ustaw ClusterId na wartość "my-first-cluster": To jest unikatowy identyfikator dla klastra Orleans. Wszyscy klienci i silosy używające tego identyfikatora mogą komunikować się bezpośrednio ze sobą. Możesz jednak użyć innego ClusterId rozwiązania dla różnych wdrożeń.
  • Ustaw ServiceId na "AspNetSampleApp": To unikalny identyfikator aplikacji używany przez niektórych dostawców, takich jak dostawcy trwałości. Ten identyfikator powinien pozostać stabilny i nie zmieniać się we wszystkich wdrożeniach.

Domyślnie Orleans używa "default" zarówno dla ServiceId jak i ClusterId. Te wartości nie wymagają zmiany w większości przypadków. ServiceId jest bardziej znacząca i rozróżnia różne usługi logiczne, umożliwiając im współużytkowanie systemów magazynowania zaplecza bez zakłóceń. ClusterId określa, które hosty łączą się z klastrem.

W każdym klastrze wszystkie hosty muszą używać tego samego ServiceId. Jednak wiele klastrów może współużytkować klaster ServiceId. Umożliwia to scenariusze wdrażania niebieskiego/zielonego, w których rozpoczynasz nowe wdrożenie (klaster) przed zamknięciem innego. Jest to typowe dla systemów hostowanych w usłudze Azure App Service.

Bardziej typowym przypadkiem jest to, że ServiceId i ClusterId pozostają stałe przez cały okres istnienia aplikacji, i używasz strategii wdrażania stopniowego. Jest to typowe dla systemów hostowanych na platformie Kubernetes i w usłudze Service Fabric.

Punkty końcowe

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

Silos Orleans ma dwa typowe typy konfiguracji punktu końcowego:

  • Punkty końcowe silosów: używane do komunikacji pomiędzy silosami w obrębie tego samego klastra.
  • Punkty końcowe typu klient-silos (lub brama): służy do komunikacji między klientami i silosami w tym samym klastrze.

W przykładzie używamy metody pomocniczej .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000), która ustawia port dla komunikacji silosu do silosu na 11111 oraz port bramy na 30000. Ta metoda wykrywa interfejs do nasłuchiwania.

Ta metoda powinna być wystarczająca w większości przypadków, ale w razie potrzeby można ją jeszcze bardziej dostosować. Oto przykład użycia zewnętrznego adresu IP z przekazywaniem portów:

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

Wewnętrznie silos nasłuchuje na 0.0.0.0:40000 i 0.0.0.0:50000, ale wartość opublikowana przez dostawcę członkostwa to 172.16.0.42:11111 i 172.16.0.42:30000.

Części aplikacji

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

Mimo że ten krok nie jest technicznie wymagany (jeśli nie jest skonfigurowany, Orleans skanuje wszystkie zestawy w bieżącym folderze), zachęcamy do jej skonfigurowania. Ten krok ułatwia Orleans ładowanie zestawów i typów użytkowników. Te zestawy są określane jako części aplikacji. Orleans odnajduje wszystkie ziarna, interfejsy ziarna i serializatory za pomocą części aplikacji.

Skonfiguruj części aplikacji przy użyciu IApplicationPartManager, dostępnego za pośrednictwem metody rozszerzenia ConfigureApplicationParts dla IClientBuilder i ISiloHostBuilder. Metoda ConfigureApplicationParts akceptuje delegata , Action<IApplicationPartManager>.

Następujące metody rozszerzenia w IApplicationPartManager obsługują typowe zastosowania:

Uzupełnij zestawy dodane przez powyższe metody przy użyciu następujących metod rozszerzenia dla ich zwracanego typu: IApplicationPartManagerWithAssemblies

  • ApplicationPartManagerExtensions.WithReferences: dodaje wszystkie przywoływane zestawy z dodanych części. Natychmiast ładuje wszelkie przechodnio przywołyzowane zestawy. Błędy ładowania zestawu są ignorowane.
  • ApplicationPartManagerCodeGenExtensions.WithCodeGeneration: generuje kod obsługi dodanych części i dodaje go do menedżera części. Należy pamiętać, że wymaga to zainstalowania Microsoft.Orleans.OrleansCodeGenerator pakietu i jest często określane jako generowanie kodu środowiska uruchomieniowego.

Odnajdywanie typów wymaga, aby podane części aplikacji zawierały określone atrybuty. Dodanie pakietu generowania kodu w czasie kompilacji (Microsoft.Orleans.CodeGenerator.MSBuild lub Microsoft.Orleans.OrleansCodeGenerator.Build) do każdego projektu zawierającego ziarna, interfejsy ziarna lub serializatory jest zalecanym podejściem, aby upewnić się, że te atrybuty są obecne. Generowanie kodu w czasie kompilacji obsługuje tylko język C#. W przypadku języków F#, Visual Basic i innych języków platformy .NET można wygenerować kod w czasie konfiguracji za pomocą metody opisanej WithCodeGeneration powyżej. Więcej informacji dotyczących generowania kodu można znaleźć w odpowiedniej sekcji.