Реализация графического анализа Nacos Configuration Center

Алибаба

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

Полный текст содержит в общей сложности 2582 слова, а расчетное время чтения составляет 12 минут.

Что такое Накос

NacosЭто проект с открытым исходным кодом, инициированный Али по адресу:GitHub.com/alibaba/вывезти….NacosВ основном он предоставляет две услуги: одна — центр конфигурации, который поддерживает регистрацию конфигурации, распространение изменений, иерархическое управление и т. д., что означает, что элементы конфигурации внутри службы могут динамически обновляться без простоя; другая — служба именования, обеспечивающая функции регистрации и обнаружения служб, обычно используемые вRPCобрамленныйClientа такжеServerСредний выступает в качестве среды, а также имеет такие функции, как мониторинг работоспособности и балансировка нагрузки.

Эта статья посвященаNacosПервая часть функции — это реализация центра конфигурации. Сначала опишите, какие компоненты обычно требуются для центра конфигурации, а затем объединитеNacos 1.1.4исходный код, чтобы изучить, как эти проекты отражены в исходном коде.

Архитектура центра конфигурации

Сам центр конфигурации не сложен, при условии, что вы сначалаCAPВопрос об обмене оставлен в стороне. Самая основная функция центра конфигурации — хранить пару ключ-значение, а пользователь публикует конфигурацию (configKey), то клиент получает этот элемент конфигурации (configValue); расширенная функция заключается в информировании клиента об изменении для обновления старого значения при изменении элемента конфигурации.

На приведенной ниже схеме архитектуры кратко описана общая архитектура центра конфигурации.Пользователи могут публиковать конфигурации через платформу управления.HTTPВызов регистрирует конфигурацию на сервере, и сервер сохраняет ее вMySQLи другие механизмы постоянного хранения; пользователи передают клиентуSDKПолучите доступ к конфигурации сервера и создайтеHTTPДлительный опрос отслеживает изменения элемента конфигурации, в то же время, чтобы снизить нагрузку на сервер и обеспечить аварийное восстановление, снимок будет сохранен в локальном файле после того, как элемент конфигурации будет передан клиенту, а SDK сначала прочитайте содержимое файла.

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

undefined

Пример использования Nacos

Упомянутый ниже исходный код основан на версии Nacos 1.1.4.

Официальный пример кода

Сначала посмотрите официальную документацию дляNacosизAPIИспользуемый пример кода, первый шаг — передать конфигурацию, создать новыйConfigServiceНа втором этапе вы можете получить конфигурацию и зарегистрировать прослушиватель конфигурации через соответствующий интерфейс. Использование очень простое и понятное, поэтому я не буду вдаваться в подробности.

try {
    // 传递配置
	String serverAddr = "{serverAddr}";
	String dataId = "{dataId}";
	String group = "{group}";
	Properties properties = new Properties();
	properties.put("serverAddr", serverAddr);
    
    // 新建 configService
	ConfigService configService = NacosFactory.createConfigService(properties);
	String content = configService.getConfig(dataId, group, 5000);
	System.out.println(content);
    
    // 注册监听器
    configService.addListener(dataId, group, new Listener() {
	@Override
	public void receiveConfigInfo(String configInfo) {
		System.out.println("recieve1:" + configInfo);
	}
	@Override
	public Executor getExecutor() {
		return null;
	}
});
} catch (NacosException e) {
    // TODO 
    -generated catch block
    e.printStackTrace();
}

Интерпретация свойств

serverAddrПередается список адресов сервера центра конфигурации, который имеет внутреннее имяServerListManagerКласс преобразуется в список адресов для управления, иHTTPПри вызове уцелевшие машины будут отобраны и сращены вURLПосле завершения вызова, когда адрес выдает исключение при выполнении вызова, у клиента будут некоторые меры обработки, такие как переключение следующего выбранного узла и т. д. Стоит отметить, что это жесткое кодирование обычно не делается на практике, его можно настроить вZookeeperИли в центре обнаружения регистрации, он динамически подтягивается при запуске.

Иерархический дизайн элементов конфигурации

NacosЧиновник дал такой дизайн:

undefined

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

undefined

Парсинг клиента Nacos

получить конфигурацию

Основной способ получить конфигурациюNacosConfigServiceКатегорияgetConfigInnerметод, обычно этот метод напрямую получает значение конфигурации из локального файла, если локальный файл не существует или содержимое пустое, то передатьHTTP GETМетод извлекает конфигурацию с удаленного устройства и сохраняет ее в локальном моментальном снимке.

undefined

когда прошелHTTPПри получении удаленной конфигурацииNacosПредусмотрены две стратегии прерывателя цепи: одна — период тайм-аута, а другая — максимальное количество повторных попыток, по умолчанию три попытки.

зарегистрировать слушателя

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

iconfig.addListener(dataId, group, ml);
iconfig.getConfigAndSignListener(dataId, group, 1000, ml);

NacosСлушатели могут быть зарегистрированы указанными выше способами, и все их внутренние реализации вызываютClientWorkerКатегорияaddCacheDataIfAbsent. вCacheDataЭто экземпляр, который поддерживает элемент конфигурации и всех слушателей, зарегистрированных под ним.Я думал, что это имя было нелегко получить и было нелегко понять.

всеCacheDataхранятся вClientWorkerАтомы в классеcacheMapСреди них, его внутренние основные члены:

undefined

в,contentэто содержимое конфигурации,MD5Значение — это ключ, используемый для определения того, изменилась ли конфигурация. Также внутри поддерживается массив из нескольких слушателей. Когда происходит изменение, эти слушатели вызываются по очереди.

Настроить долгий опрос

ClientWorkerРабота по настройке длинного опроса выполняется через два пула потоков под ним, один однопоточныйexecutor, каждый10msСогласно каждому3000Элемент конфигурации — это пакет, который необходимо выбрать для опроса.cacheDataнапример, заверните его вLongPollingTaskОтправить во второй пул потоковexecutorServiceиметь дело с.

undefined

Длинная задача опроса в основном делится на четыре этапа:

  1. Проверьте локальную конфигурацию, проигнорируйте элементы конфигурации, которых нет в локальном снимке, и проверьте, есть ли элементы конфигурации, которым необходимо вызвать прослушиватель.
  2. Если локального элемента конфигурации нет, получите его с сервера и верните список ключей и значений, содержимое конфигурации которого изменилось.
  3. Каждое значение ключа отправляется на сервер для получения последней конфигурации, обновления локального моментального снимка и завершения отсутствующей конфигурации до
  4. экзаменMD5Независимо от того, последовательна ли метка, несоответствие должно вызывать обратно слушателя.

Если задача опроса выдает исключение, подождите некоторое время перед запуском следующего вызова, чтобы снизить нагрузку на сервер. Кроме того,NacosсуществуетHTTPВ классе инструментов также есть текущие коды-ограничители для снижения риска опроса или большого трафика с помощью различных средств. Как будет сказано ниже, если измененное значение ключа не будет найдено на стороне сервера, то серверная сторона сохранит это значение.HTTPЗапрос периода времени (тайм-аут, переданный по умолчанию на стороне клиента, равен30s) для дальнейшего снижения частоты опроса клиента и нагрузки на сервер.

Анализ сервера Nacos

Настроить дамп

Когда сервер запустится, это будет зависеть отDumpServiceизinitметод, из базы данныхloadКонфигурация хранится на локальном диске, и некоторая важная метаинформация, такая какMD5Значения кэшируются в памяти. Сервер будет определять, получено ли оно из базы данных, в соответствии с последним временем контрольных импульсов, сохраненным в файле контрольных сигналов.dumpПолные данные конфигурации или частичные инкрементные данные конфигурации (если последний интервал пульса машины6hв пределах).

Полная суммаdumpКонечно сначала очистить кеш диска, а потом уже по первичному ключуIDКаждый раз вы берете тысячу конфигураций и прошиваете их на диск и в память. ИнкрементныйdumpЭто получение новой добавленной конфигурации (включая обновленную и удаленную) за последние шесть часов, сначала обновление памяти и файлов в соответствии с этим пакетом данных, а затем сравнение базы данных в соответствии со всеми данными в памяти и повторная синхронизация. если есть какие-либо изменения. , по сравнению с полнымdumpЕсли это так, это уменьшит определенный объем базы данныхIOи дискIOчастота.

Настроить регистрацию

Nacosсервер - этоSpringBootРеализованы сервисы, основной код для настройки регистрации находится вConfigControllerа такжеConfigServletInnerсередина. Сервер, как правило, представляет собой многоузловой кластер, поэтому вначале запрос будет касаться только одной машины, и эта машина вставит конфигурацию вMySQLНастойчивость в этой части кода очень проста и повторяться не будет.

Поскольку сервер не получает доступ к каждому запросу конфигурацииMySQL, но будет зависеть отdumpФункция кэширует конфигурацию в локальном файле. Следовательно, когда одна машина сохраняет конфигурацию, ей необходимо уведомить другие машины о необходимости обновить содержимое файла в памяти и на локальном диске, чтобы опубликовать файл с именемConfigDataChangeEventсобытие, это событие пройдетHTTPВызов уведомляет все узлы кластера (включая себя), запуская сброс локальных файлов и памяти.

undefined

Обработка длинных опросов

Как упоминалось выше, у клиента будет длительная задача опроса для извлечения изменений конфигурации сервера, так как же сервер справляется с этой длинной задачей опроса? Логика исходного кода находится вLongPollingServiceкласс, который имеетRunnableзадача с именемClientLongPolling, сервер завернет полученный запрос на опрос вClientLongPollingзадание, которое содержитAsyncContextобъект ответа (Servlet 3.0новый механизм), задержанный синхронизированным пулом потоков29.5sвоплощать в жизнь.

Почему, чем клиент30sТайм-аут увеличен500msВозврат должен гарантировать, что клиент не истечет время ожидания из-за сетевых задержек в максимально возможной степени.

undefined

Здесь следует отметить, что вClientLongPollingКогда задача отправляется в пул потоков для выполнения, сервер также проходит через очередьallSubsВсе удерживаемые запросы на опрос сохраняются, потому что в течение периода, когда элемент конфигурации удерживается, если пользователь оперирует изменением элемента конфигурации через платформу управления или серверный узел получает запрос от других узлов.dumpЕсли вы обновите уведомление, вы должны немедленно отменить таранную задачу и уведомить клиента о том, что данные вовремя изменились.

для достижения этой цели,LongPollingServiceкласс наследуется отEventСам интерфейс на самом деле является триггером события и должен быть реализованonEventметод, тип события которогоLocalDataChangeEvent.

Когда сервер получает изменение конфигурации во время удержания запроса, он публикуетLocalDataChangeEventтип уведомления о событии (обратите внимание на то же, что и вышеConfigDataChangeEventразница), изменение затем будет заключено вDataChangeTaskАсинхронное выполнение, содержимое взято изallSubsнайти протаранилClientLongPollingзапрос, запись изменений заставит его немедленно вернуться.

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

undefined

Полный текст резюме

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