Конфигурация сервера
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 поддержки распространенных вариантов использования:
- ApplicationPartManagerExtensions.AddApplicationPart Одну сборку можно добавить с помощью этого метода расширения.
- ApplicationPartManagerExtensions.AddFromAppDomain добавляет все сборки, загруженные в данный
AppDomain
момент. - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory загружает и добавляет все сборки в текущем базовом пути (см. раздел AppDomain.BaseDirectory).
Сборки, добавленные приведенными выше методами, можно дополнить следующими методами расширения для их возвращаемого типа: IApplicationPartManagerWithAssemblies
- ApplicationPartManagerExtensions.WithReferences добавляет все ссылки на сборки из добавленных частей. При этом немедленно загружается любая транзитивная ссылка на сборки. Ошибки загрузки сборки игнорируются.
- ApplicationPartManagerCodeGenExtensions.WithCodeGeneration создает код поддержки для добавленных частей и добавляет его в диспетчер частей. Обратите внимание, что для этого требуется
Microsoft.Orleans.OrleansCodeGenerator
установить пакет и обычно называется созданием кода среды выполнения.
Для обнаружения типов требуется, чтобы указанные части приложения включали определенные атрибуты. Добавление пакета создания кода во время сборки (Microsoft.Orleans.CodeGenerator.MSBuild
или Microsoft.Orleans.OrleansCodeGenerator.Build
) в каждый проект, содержащий зерна, интерфейсы зерна или сериализаторы, является рекомендуемым подходом для обеспечения того, чтобы эти атрибуты присутствовали. Создание кода во время сборки поддерживает только C#. Для F#, Visual Basic и других языков .NET код можно создавать во время настройки с помощью описанного WithCodeGeneration выше метода. Дополнительные сведения о создании кода можно найти в соответствующем разделе.