Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ć innegoClusterId
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ć innegoClusterId
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:
- ApplicationPartManagerExtensions.AddApplicationPart: Dodaj pojedynczy zestaw przy użyciu tej metody rozszerzenia.
-
ApplicationPartManagerExtensions.AddFromAppDomain: dodaje wszystkie zestawy aktualnie załadowane w
AppDomain
. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory: Ładuje i dodaje wszystkie zestawy w bieżącej ścieżce podstawowej (zobacz AppDomain.BaseDirectory).
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.