Горячая перезагрузка конфигурации в Dotnet

Мы строим электрическую платежную систему в микросервисной архитектуре.

Встречайте множество проблем, таких как обеспечение согласованности данных, управление прото-файлом gRpc и т. д.

После нескольких статей я проиллюстрирую больше проблем, с которыми мы столкнулись, и наши решения.

Эта статья проиллюстрирует, с какими проблемами управления конфигурацией мы столкнулись, и наше решение.

Какая польза от этого центра?

  1. Список служб — запишите все имена служб и фактические отношения сопоставления IP-адресов.
  2. Сопоставление кода ошибки — когда нижестоящие службы добавляют новый код ошибки, вам необходимо сопоставить его со своим служебным сообщением.
  3. Разрешающий список, запрещающий список — для некоторых функций мы размещаем код в производственной среде, но официально его не выпускаем; нам нужен какой-то конкретный человек, чтобы проверить их.

Вы не хотите проходить процесс выпуска версии, если вы меняете содержимое списка разрешений или уровень журнала.

Проблемы

В нашей кодовой базе существует много одинаковых конфигураций.

Например, домены сторонних серверов, брокеры сообщений, строки подключения к базе данных и т. д.

Нам нужно копировать почти один и тот же конфиг всякий раз, когда мы создаем новый сервис.

И когда одна и та же конфигурация изменяется, например, сервер добавляет новые узлы или ACL, все службы, которые использовали конфигурацию, должны быть обновлены.

Измените конфигурацию, необходимую для повторного развертывания точки доступа.

Разворачиваем наше приложение на Docker; файл appsettings.json и другие конфигурации копируются в контейнер при создании образа.

Если мы хотим изменить содержимое конфига, нам обычно нужно пересобрать образ и заново развернуть приложение на машине.

Например, в начале подключения системы к сети мы обычно устанавливаем уровень логирования на Trace. Чтобы избежать случайных происшествий, у нас недостаточно данных журнала для отслеживания проблем.

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

Поверьте, это так раздражает.

Решение

После выяснения наших проблем нам нужно решение.

Требование содержит сокращение появившихся повторяющихся конфигов, перезагрузку конфига без развертывания AP, контроль версий и управление полномочиями.

На следующем рисунке показана вся архитектура центра управления облегченной конфигурацией.

Вот некоторые компоненты, которые мы использовали.

Git: контроль версий, управление правами доступа и сохранение нашей конфигурации.

git2consul: при изменении конфигурации обновите конфигурацию в хранилище Consul KV.

Консул: сохраните нашу конфигурацию, которую может прочитать следующий пакет Dotnet.

Пакет Dotnet: опрос Consul и перезагрузка конфигурации в нашем приложении

Архитектура обеспечивает контроль версий, управление полномочиями и перезагрузку конфигурации в приложении без перестроения или повторного развертывания.

Список служб — запишите все имена служб и фактические отношения сопоставления IP-адресов.

Решением по уменьшению той же конфигурации является список услуг.

Создайте файл JSON с именем service_list.json.

Его структура похожа на следующий файл JSON.

service_list.json

{
  "alpha_service": [
    "10.0.0.1",
    "10.0.0.2",
    "10.0.0.3"
  ],
  "delta_service": [
    "10.0.0.4",
    "10.0.0.5",
    "10.0.0.6"
  ]
}

И поместите его в свой центр управления конфигурацией.

Единственная выгода уменьшает тот же конфиг?

В следующей статье я покажу вам, как мы используем список сервисов для балансировки нагрузки gRpc на стороне клиента.

Внедрение облегченного центра управления конфигурацией

1. Настройте свое приложение

1–1 Добавляет пакет Consul

Мы используем следующий пакет для чтения конфигурации из Consul и перезагрузки нашей конфигурации в приложении.



dotnet add package Winton.Extensions.Configuration.Consul --version 3.2.0

1–2 Настройте сервер Consul

Настройка Consul в любом месте вашего IConfigurationBuilder.

Следующий пример кода находится в Program.cs

Если вы используете Dotnet 5 или предыдущую версию, вы можете использовать конфигурацию Consul в следующем коде.

2. Запустите git2consul

Мы используем git2consul для синхронизации нашей конфигурации с git на Consul.



2–1 Запустите git2consul в Docker

docker run -d -p {git webhook por} --name git2consul cimpress/git2consul --enpoint {consul endpoint} --port {consul port} --token {consul acl token}

2–2 Настройте свой git2consul

git2consul поддерживает два способа получения уведомлений об обновлении конфигурации.

Один вебхук, а другой опрос.

Прочтите следующий документ, чтобы установить тип контроля версий.



// webhook
{
  "version": "1.0",
  "repos" : [{
    "name" : "sample_configuration",
    "url" : "{your git url}",
    "support_tags" : true,
    "branches" : ["{your branch}"],
    "hooks": [{
      "type" : "stash",
      "port" : "5050",
      "url" : "/gitpoke"
    }]
  }]
}
// polling
{
  "version": "1.0",
  "repos" : [{
    "name" : "sample_configuration",
    "url" : "{your git url}",
    "support_tags" : true,
    "branches" : ["{your branch}"],
    "hooks": [
    {
      "type" : "polling",
      "interval" : "1"
    }]
  }]
}

Используй это!

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

Какие проблемы мы встречаем?

Q1: Предположим, у меня есть a.json и b.json, два файла JSON; когда я фиксирую файл a.json, и он работает, это влияет на службы чтения файла b.json?

A1: Нет, это влияет только на сервисы чтения измененного файла.

Q2: Какой класс изменений приведет к изменению конфигурации?

A2: Любое другое место вызовет изменение, даже пробел.

Q3: Если в моем измененном файле JSON есть синтаксическая ошибка JSON, что произойдет?

A3:

Если ваше приложение запустится, ничего не произойдет, и кеш конфигурации в вашем приложении не изменится.

Если вы запустите новое приложение, приложение выдаст исключение.

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

Заключение

Почему мы используем это решение?

Многие существующие решения находятся в облаке, например Azure и GCP.

Но закон нашей страны не разрешает развертывание какой-либо системы в облаке.

Поэтому нам нужно сделать локальное решение.

На рынке есть и другие многофункциональные решения.

Мы разрабатываем облегченную версию решения.

Для нас достаточно функций lite версии.

Я надеюсь, что это решение может решить ваши проблемы.