Поделиться через


Конфигурация сервера

Silo настраивается программным способом UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>) с помощью метода расширения и нескольких дополнительных классов параметров. Классы параметров в Orleans шаблоне "Параметры" в .NET и могут загружаться с помощью файлов, переменных среды и любого допустимого поставщика конфигурации.

Существует несколько ключевых аспектов конфигурации silo:

  • Поставщик кластеризации
  • (Необязательно) Orleans сведения кластеризация
  • (Необязательно) Конечные точки, используемые для обмена данными silo-to-silo и client-to-silo

Это пример конфигурации silo, которая определяет сведения о кластере, использует Azure кластеризация и настраивает части приложения:

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

Совет

При разработке Orleansможно вызвать UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) локальный кластер. В рабочих средах следует использовать поставщик кластеризация, подходящий для развертывания.

Поставщик кластеризации

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

Как правило, служба, созданная на Orleans основе, развертывается в кластере узлов либо на выделенном оборудовании, либо в облаке. Для разработки и базового тестирования Orleans можно развернуть в конфигурации с одним узлом. При развертывании в кластере узлов Orleans внутренне реализует набор протоколов для обнаружения и поддержания членства Orleans силосов в кластере, включая обнаружение сбоев узлов и автоматическую перенастройку.

Для надежного управления членством Orleans в кластере используется таблица Azure, SQL Server или Apache ZooKeeper для синхронизации узлов.

В этом примере используется таблица Azure в качестве поставщика членства.

Orleansсведения кластеризация

Чтобы при необходимости настроить кластеризация, используйте ClusterOptions в качестве параметра типа для Configure метода в экземпляреISiloBuilder.

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

Ниже приведены два варианта:

  • ClusterId "my-first-cluster"Задайте для параметра значение : это уникальный идентификатор для Orleans кластера. Все клиенты и силосы, использующие этот идентификатор, смогут напрямую взаимодействовать друг с другом. Вы можете использовать другой ClusterId вариант для разных развертываний, однако.
  • ServiceId "SampleApp"Задайте значение : это уникальный идентификатор приложения, который будет использоваться некоторыми поставщиками, такими как поставщики сохраняемости. Этот идентификатор должен оставаться стабильным и не изменяться во всех развертываниях.

По умолчанию Orleans будет использоваться значение как для, ServiceId так "default" и ClusterIdдля . В большинстве случаев эти значения не нужно изменять. ServiceId является более значительным из двух и используется для разных логических служб друг от друга, чтобы они могли совместно использовать серверные системы хранения, не вмешиваясь друг в друга. ClusterId используется для определения того, какие узлы будут подключаться друг к другу и формировать кластер.

В каждом кластере все узлы должны использовать одинаковые ServiceId. Однако несколько кластеров могут совместно использовать ServiceIdнесколько кластеров. Это позволяет выполнять синие и зеленые сценарии развертывания, в которых запускается новое развертывание (кластер), прежде чем завершить работу другого. Это обычно для систем, размещенных в службе приложение Azure.

Более распространенным случаем является то, что ServiceId и ClusterId остается фиксированным в течение всего времени существования приложения и используется стратегия последовательного развертывания. Это обычно для систем, размещенных в Kubernetes и Service Fabric.

Конечные точки

По умолчанию Orleans будет прослушивать все интерфейсы через порт 11111 для обмена данными silo-to-silo и через порт 30000 для обмена данными между клиентами. Чтобы переопределить это поведение, вызовите ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) и передайте номера портов, которые вы хотите использовать.

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

В предыдущем коде:

  • Для порта silo задано 17_256значение .
  • Для порта шлюза задано значение 34_512.

В Orleans silo есть два типичных типа конфигурации конечной точки:

  • Конечные точки Silo to-silo используются для обмена данными между силосами в одном кластере.
  • Конечные точки silo (или шлюза) клиента используются для обмена данными между клиентами и силосами в одном кластере.

Этот метод должен быть достаточно в большинстве случаев, но при необходимости его можно настроить дальше. Ниже приведен пример использования внешнего IP-адреса с некоторыми перенаправлениями портов:

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

Внутри системы silo будет прослушивать 0.0.0.0:40000 и 0.0.0.0:50000, но значение, опубликованное в поставщике членства, будет 172.16.0.42:11111 и 172.16.0.42:30000.

Silo настраивается программным способом с помощью SiloHostBuilder нескольких дополнительных классов параметров. Классы параметров в Orleans шаблоне "Параметры" в .NET и могут загружаться с помощью файлов, переменных среды и любого допустимого поставщика конфигурации.

Существует несколько ключевых аспектов конфигурации silo:

  • Orleansсведения кластеризация
  • Поставщик кластеризации
  • Конечные точки, используемые для обмена данными silo-to-silo и client-to-silo
  • Части приложения

Это пример конфигурации silo, которая определяет сведения о кластере, использует Azure кластеризация и настраивает части приложения:

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

Рассмотрим шаги, используемые в этом примере:

Поставщик кластеризации

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

Как правило, служба, созданная на Orleans основе, развертывается в кластере узлов либо на выделенном оборудовании, либо в облаке. Для разработки и базового тестирования Orleans можно развернуть в конфигурации с одним узлом. При развертывании в кластере узлов Orleans внутренне реализует набор протоколов для обнаружения и поддержания членства Orleans силосов в кластере, включая обнаружение сбоев узлов и автоматическую перенастройку.

Для надежного управления членством Orleans в кластере используется таблица Azure, SQL Server или Apache ZooKeeper для синхронизации узлов.

В этом примере мы используем таблицу Azure в качестве поставщика членства.

Orleansсведения кластеризация

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

Здесь мы делаем два действия:

  • ClusterId "my-first-cluster"Задайте для параметра значение : это уникальный идентификатор для Orleans кластера. Все клиенты и силосы, использующие этот идентификатор, смогут напрямую взаимодействовать друг с другом. Вы можете использовать другой ClusterId вариант для разных развертываний, однако.
  • ServiceId "AspNetSampleApp"Задайте значение : это уникальный идентификатор приложения, который будет использоваться некоторыми поставщиками, такими как поставщики сохраняемости. Этот идентификатор должен оставаться стабильным и не изменяться во всех развертываниях.

По умолчанию Orleans будет использоваться значение как для, ServiceId так "default" и ClusterIdдля . В большинстве случаев эти значения не нужно изменять. ServiceId является более значительным из двух и используется для разных логических служб друг от друга, чтобы они могли совместно использовать серверные системы хранения, не вмешиваясь друг в друга. ClusterId используется для определения того, какие узлы будут подключаться друг к другу и формировать кластер.

В каждом кластере все узлы должны использовать одинаковые ServiceId. Однако несколько кластеров могут совместно использовать ServiceIdнесколько кластеров. Это позволяет выполнять синие и зеленые сценарии развертывания, в которых запускается новое развертывание (кластер), прежде чем завершить работу другого. Это обычно для систем, размещенных в службе приложение Azure.

Более распространенным случаем является то, что ServiceId и ClusterId остается фиксированным в течение всего времени существования приложения и используется стратегия последовательного развертывания. Это обычно для систем, размещенных в Kubernetes и Service Fabric.

Конечные точки

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

В Orleans silo есть два типичных типа конфигурации конечной точки:

  • Конечные точки Silo to-silo, используемые для обмена данными между силосами в одном кластере
  • Конечные точки типа "клиент — сеть" (или шлюз), используемые для обмена данными между клиентами и узлами в одном кластере.

В примере мы используем вспомогательный метод .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000) , который задает порт, используемый для обмена данными 11111 silo-to-silo и порта для шлюза 30000. Этот метод обнаружит, какой интерфейс будет прослушиваться.

Этот метод должен быть достаточно в большинстве случаев, но при необходимости его можно настроить дальше. Ниже приведен пример использования внешнего IP-адреса с некоторыми перенаправлениями портов:

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

Внутри системы silo будет прослушивать 0.0.0.0:40000 и 0.0.0.0:50000, но значение, опубликованное в поставщике членства, будет 172.16.0.42:11111 и 172.16.0.42:30000.

Части приложения

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

Хотя этот шаг не является технически обязательным (если он не настроен, Orleans сканирует все сборки в текущей папке), разработчикам рекомендуется настроить это. Этот шаг поможет Orleans загрузить пользовательские сборки и типы. Эти сборки называются частями приложения. Все зерна, интерфейсы зерна и сериализаторы обнаруживаются с помощью частей приложения.

Части приложения настраиваются с IApplicationPartManagerпомощью , к которым можно получить доступ с помощью ConfigureApplicationParts метода IClientBuilder расширения и ISiloHostBuilder. Метод ConfigureApplicationParts принимает делегат. Action<IApplicationPartManager>

Следующие методы расширения для IApplicationPartManager поддержки распространенных вариантов использования:

Сборки, добавленные приведенными выше методами, можно дополнить следующими методами расширения для их возвращаемого типа: IApplicationPartManagerWithAssemblies

  • ApplicationPartManagerExtensions.WithReferences добавляет все ссылки на сборки из добавленных частей. При этом немедленно загружается любая транзитивная ссылка на сборки. Ошибки загрузки сборки игнорируются.
  • ApplicationPartManagerCodeGenExtensions.WithCodeGeneration создает код поддержки для добавленных частей и добавляет его в диспетчер частей. Обратите внимание, что для этого требуется Microsoft.Orleans.OrleansCodeGenerator установить пакет и обычно называется созданием кода среды выполнения.

Для обнаружения типов требуется, чтобы указанные части приложения включали определенные атрибуты. Добавление пакета создания кода во время сборки (Microsoft.Orleans.CodeGenerator.MSBuild или Microsoft.Orleans.OrleansCodeGenerator.Build) в каждый проект, содержащий зерна, интерфейсы зерна или сериализаторы, является рекомендуемым подходом для обеспечения того, чтобы эти атрибуты присутствовали. Создание кода во время сборки поддерживает только C#. Для F#, Visual Basic и других языков .NET код можно создавать во время настройки с помощью описанного WithCodeGeneration выше метода. Дополнительные сведения о создании кода можно найти в соответствующем разделе.