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


Использование 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.

  1. Создайте папку для установки Consul в (например, C:\Consul).

  2. Создайте вложенную папку: C:\Consul\Data (Consul не создает этот каталог, если он не существует).

  3. Скачайте и распакуйте Consul.exe в C:\Consul.

  4. Откройте командную строку 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.

  5. Убедитесь, что 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();

Предыдущий код:

Чтобы настроить клиент, используйте тот же пакет 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/?recurseURI.

Ограничения

Существует несколько ограничений, которые следует учитывать при использовании 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 правильным выбором для вас.

Потенциальные будущие улучшения

  1. Убедитесь, что проект репликации Consul KV может поддерживать кластер Orleans в среде глобальной сети между несколькими центрами обработки данных Consul.
  2. Реализуйте таблицу напоминаний в Consul.
  3. Реализуйте протокол расширенного членства. Команда, стоящая за Consul, планирует реализовать атомарные операции, и как только эта функциональность станет доступна, можно будет удалить ограничения в поставщике.