Использование Consul в качестве поставщика членства
Consul — это распределенная, высокодоступная и высокодоступная платформа обнаружения служб с поддержкой центра обработки данных, которая включает простую регистрацию служб, проверку работоспособности, обнаружение сбоев и хранилище ключей. Он основан на допущении, что каждый узел в центре обработки данных исполняет агент Consul, который действует либо в качестве сервера, либо клиента. Каждый агент взаимодействует через масштабируемый протокол обмена сообщениями.
Существует подробный обзор Consul, включая сравнения с аналогичными решениями здесь.
Consul написан в Go и с открытым исходным кодом; скомпилированные скачиваемые файлы доступны для macOS X, FreeBSD, Linux, Solaris и Windows.
Почему выбираете консула?
Как поставщик членства Orleans, Consul является хорошим выбором, если вам нужно предоставить локальное решение, которое не требует наличия существующей инфраструктуры и совместного ИТ-поставщика. Consul — это легковесный исполняемый файл, не имеющий зависимостей, и поэтому может быть легко встроен в решение для промежуточного слоя. Когда Consul — это ваше решение для обнаружения, проверки и обслуживания микрослужб, имеет смысл полностью интегрироваться с интеграцией Orleans для простоты и удобства работы. Существует также таблица членства в Consul (также известная как "Orleans настраиваемое системное хранилище"), которая полностью интегрируется с системой управления кластерами Orleans.
Настройка Consul
Существует обширная документация, доступная на Consul.io о настройке стабильного кластера Consul, и это не имеет смысла повторять здесь. Для вашего удобства мы включаем это руководство, чтобы вы могли быстро запустить Orleans с отдельным агентом Consul.
Создайте папку для установки Consul в (например, C:\Consul).
Создайте вложенную папку: C:\Consul\Data (Consul не создает этот каталог, если он не существует).
Скачайте и распакуйте Consul.exe в C:\Consul.
Откройте командную строку C:\Consul и выполните следующую команду:
./consul.exe agent -server -bootstrap -data-dir "C:\Consul\Data" -client='0.0.0.0'
В приведенной выше команде:
-
agent
. Указывает Consul запустить агентский процесс, который хостит службы. Без этого параметра процесс Consul пытается использовать RPC для настройки работающего агента. -
-server
. Определяет агент как сервер, а не клиент (Клиент Consul является агентом, который размещает все сервисы и данные, но не имеет права голоса для принятия решений и не может стать лидером кластера). -
-bootstrap
: первый (и только первый!) узел в кластере должен быть инициализирован таким образом, чтобы узел принял на себя роль лидера кластера. -
-data-dir [path]
. Указывает путь, в котором хранятся все данные Consul, включая таблицу членства в кластере. -
-client='0.0.0.0'
: сообщает консулу, на какой IP-адрес нужно открыть службу.
Существует множество других параметров и возможность использования файла конфигурации JSON. Для полного списка параметров см. документацию Consul.
-
Убедитесь, что Consul запущен и готов принимать запросы на членство из Orleans, открыв интерфейс служб в браузере по адресу
http://localhost:8500/v1/catalog/services
. При правильном функционировании в браузере отображается следующий код JSON:{ "consul": [] }
Настройка Orleans
Чтобы настроить Orleans на использование Consul в качестве поставщика членства, проекту silo потребуется сослаться на Microsoft.Orleans.Clustering.Consul пакет NuGet. После этого вы можете настроить поставщика членства в файле Program.cs вашего silo следующим образом:
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseOrleans(silo =>
{
silo.UseConsulSiloClustering(options =>
{
// The address of the Consul server
var address = new Uri("http://localhost:8500");
options.ConfigureConsulClient(address);
});
})
.UseConsoleLifetime();
using IHost host = builder.Build();
host.Run();
Предыдущий код:
- Создает IHostBuilder на основе значений по умолчанию из Host.CreateDefaultBuilder().
- Соединяет вызов к UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>), который настраивает Orleans "silo".
- Принимая во внимание вызовы ISiloBuilder, вызовы UseConsulSiloClustering.
- Настраивает поставщика членства в кластере для использования Consul, при наличии Consul
address
.
Чтобы настроить клиент, используйте тот же пакет NuGet и вызовите метод расширения UseConsulClientClustering.
Клиентский пакет SDK
Если вы хотите использовать Consul для обнаружения служб, клиентские пакеты SDK для большинства популярных языков.
Сведения о реализации
Поставщик таблиц членства использует хранилище ключей и значений Consul функции с операциями Check-And-Set (CAS). Когда запускается каждый Silo, он регистрирует две записи с ключом-значением: одна содержит сведения о Silo, другая фиксирует время, когда Silo в последний раз сообщал, что он работает. Последний относится к записям диагностики "Я жив" и не к пульсам обнаружения сбоев, которые отправляются непосредственно между силосами и не записываются в таблицу. Все записи в таблицу выполняются с помощью CAS, чтобы обеспечить контроль параллелизма, как требует протокол управления кластерами Orleans.
После запуска Silo вы можете просмотреть эти записи в веб-браузере по адресу http://localhost:8500/v1/kv/?keys&pretty
, где отображается приблизительно следующее:
[
"orleans/default/192.168.1.11:11111@43165319",
"orleans/default/192.168.1.11:11111@43165319/iamalive",
"orleans/default/version"
]
Все ключи префиксируются с помощью orleans
, который жестко закодирован в поставщике и предназначен для предотвращения столкновения пространства ключей с другими пользователями Consul. Вы можете использовать любой из этих ключей для получения дополнительных сведений о каждом из этих ключей, добавив их имя ключа (без кавычки) в корневой каталог Consul KV в http://localhost:8500/v1/kv/
. Это дает вам следующий код JSON:
[
{
"LockIndex": 0,
"Key": "orleans/default/192.168.1.11:11111@43165319",
"Flags": 0,
"Value": "[BASE64 UTF8 Encoded String]",
"CreateIndex": 321,
"ModifyIndex": 322
}
]
Декодирование закодированной строки Base64 UTF-8 Value
дает вам фактические данные о членстве Orleans.
http://localhost:8500/v1/KV/orleans/default/[SiloAddress]
{
"Hostname": "[YOUR_MACHINE_NAME]",
"ProxyPort": 30000,
"StartTime": "2023-05-15T14:22:00.004977Z",
"Status": 3,
"SiloName": "Silo_fcad0",
"SuspectingSilos": []
}
http://localhost:8500/v1/KV/orleans/default/[SiloAddress]/IAmAlive
"2023-05-15T14:27:01.1832828Z"
Когда клиенты подключаются, они считывают KV для всех силосов в кластере в одном HTTP GET с помощью http://192.168.1.26:8500/v1/KV/orleans/default/?recurse
URI.
Ограничения
Существует несколько ограничений, которые следует учитывать при использовании Consul в качестве поставщика членства.
Orleans расширенный протокол членства (версия таблицы & ETag)
Consul KV в настоящее время не поддерживает атомарные обновления. Поэтому поставщик членства Orleans consul реализует только базовый протокол членства Orleans, как описано в разделе управления кластерами в Orleans, и не поддерживает протокол расширенного членства. Этот расширенный протокол был введен как дополнительный, но не обязательный, способ проверки подключения Silo и как основа для функциональности, которая пока еще не реализована.
Несколько центров обработки данных
Пары "ключ-значение" в Consul в настоящее время не реплицируются между центрами обработки данных Consul. Существует отдельный проект для этого репликационного процесса, но еще не доказано, что он может поддерживать Orleans.
При запуске в Windows
При запуске Consul в Windows он записывает следующее сообщение:
==> WARNING: Windows is not recommended as a Consul server. Do not use in production.
Это предупреждение отображается из-за отсутствия фокуса на тестировании при запуске в среде Windows, а не из-за каких-либо фактических известных проблем. Прочитайте обсуждение , прежде чем решить, является ли Consul правильным выбором для вас.
Потенциальные будущие улучшения
- Убедитесь, что проект репликации Consul KV может поддерживать кластер Orleans в среде глобальной сети между несколькими центрами обработки данных Consul.
- Реализуйте таблицу напоминаний в Consul.
- Реализуйте протокол расширенного членства. Команда, стоящая за Consul, планирует реализовать атомарные операции, и как только эта функциональность станет доступна, можно будет удалить ограничения в поставщике.