Эта статья не будет вставлять слишком много исходного кода, в основном полагаясь на изображения и текстовое описание.
Полный текст содержит в общей сложности 2582 слова, а расчетное время чтения составляет 12 минут.
- Что такое Накос
- Архитектура центра конфигурации
- Пример использования Nacos
- Парсинг клиента Nacos
- Анализ сервера Nacos
- Полный текст резюме
Что такое Накос
Nacos
Это проект с открытым исходным кодом, инициированный Али по адресу:GitHub.com/alibaba/вывезти….Nacos
В основном он предоставляет две услуги: одна — центр конфигурации, который поддерживает регистрацию конфигурации, распространение изменений, иерархическое управление и т. д., что означает, что элементы конфигурации внутри службы могут динамически обновляться без простоя; другая — служба именования, обеспечивающая функции регистрации и обнаружения служб, обычно используемые вRPC
обрамленныйClient
а такжеServer
Средний выступает в качестве среды, а также имеет такие функции, как мониторинг работоспособности и балансировка нагрузки.
Эта статья посвященаNacos
Первая часть функции — это реализация центра конфигурации. Сначала опишите, какие компоненты обычно требуются для центра конфигурации, а затем объединитеNacos 1.1.4
исходный код, чтобы изучить, как эти проекты отражены в исходном коде.
Архитектура центра конфигурации
Сам центр конфигурации не сложен, при условии, что вы сначалаCAP
Вопрос об обмене оставлен в стороне. Самая основная функция центра конфигурации — хранить пару ключ-значение, а пользователь публикует конфигурацию (configKey
), то клиент получает этот элемент конфигурации (configValue
); расширенная функция заключается в информировании клиента об изменении для обновления старого значения при изменении элемента конфигурации.
На приведенной ниже схеме архитектуры кратко описана общая архитектура центра конфигурации.Пользователи могут публиковать конфигурации через платформу управления.HTTP
Вызов регистрирует конфигурацию на сервере, и сервер сохраняет ее вMySQL
и другие механизмы постоянного хранения; пользователи передают клиентуSDK
Получите доступ к конфигурации сервера и создайтеHTTP
Длительный опрос отслеживает изменения элемента конфигурации, в то же время, чтобы снизить нагрузку на сервер и обеспечить аварийное восстановление, снимок будет сохранен в локальном файле после того, как элемент конфигурации будет передан клиенту, а SDK сначала прочитайте содержимое файла.
Здесь опущены многие детали, такие как иерархический дизайн конфигурации, проверка разрешений, настройка интервала длительного опроса на стороне клиента, а серверу необходимо получить доступ к каждому запросу.MySQL
Таким образом, активно ли вносятся изменения конфигурации или инициируются регулярным опросом и т. д., а также работа по эксплуатации и обслуживанию высокой доступности (я думаю, что это суть центра конфигурации), например межрегиональное развертывание узлов, как сделать так, чтобы конфигурация была доступна для записи, когда сеть разбита на разделы.Чтобы действительно получить высококачественный центр конфигурации, все еще требуется много времени на полировку.
Пример использования 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
Чиновник дал такой дизайн:
dataId
Его можно понимать как определяемый пользователем ключ конфигурации,group
Его можно понимать как название группы конфигурации, которая относится к концепции дизайна уровня конфигурации. Проще говоря, центр конфигурации будет поддерживать различные разделы посредством иерархической структуры, чтобы различать разные среды, разные группы и даже разных разработчиков для удовлетворения потребностей публикации и тестирования в оттенках серого в процессе разработки. Поэтому ее можно оформить как угодно, лишь бы она имела смысл.Например, следующая картинка не невозможна.
Парсинг клиента Nacos
получить конфигурацию
Основной способ получить конфигурациюNacosConfigService
КатегорияgetConfigInner
метод, обычно этот метод напрямую получает значение конфигурации из локального файла, если локальный файл не существует или содержимое пустое, то передатьHTTP GET
Метод извлекает конфигурацию с удаленного устройства и сохраняет ее в локальном моментальном снимке.
когда прошелHTTP
При получении удаленной конфигурацииNacos
Предусмотрены две стратегии прерывателя цепи: одна — период тайм-аута, а другая — максимальное количество повторных попыток, по умолчанию три попытки.
зарегистрировать слушателя
Обычно клиенту центра конфигурации требуется зарегистрировать прослушиватель для элемента конфигурации, чтобы реализовать функцию выполнения обратного вызова при изменении элемента конфигурации.
iconfig.addListener(dataId, group, ml);
iconfig.getConfigAndSignListener(dataId, group, 1000, ml);
Nacos
Слушатели могут быть зарегистрированы указанными выше способами, и все их внутренние реализации вызываютClientWorker
КатегорияaddCacheDataIfAbsent
. вCacheData
Это экземпляр, который поддерживает элемент конфигурации и всех слушателей, зарегистрированных под ним.Я думал, что это имя было нелегко получить и было нелегко понять.
всеCacheData
хранятся вClientWorker
Атомы в классеcacheMap
Среди них, его внутренние основные члены:
в,content
это содержимое конфигурации,MD5
Значение — это ключ, используемый для определения того, изменилась ли конфигурация. Также внутри поддерживается массив из нескольких слушателей. Когда происходит изменение, эти слушатели вызываются по очереди.
Настроить долгий опрос
ClientWorker
Работа по настройке длинного опроса выполняется через два пула потоков под ним, один однопоточныйexecutor
, каждый10ms
Согласно каждому3000
Элемент конфигурации — это пакет, который необходимо выбрать для опроса.cacheData
например, заверните его вLongPollingTask
Отправить во второй пул потоковexecutorService
иметь дело с.
Длинная задача опроса в основном делится на четыре этапа:
- Проверьте локальную конфигурацию, проигнорируйте элементы конфигурации, которых нет в локальном снимке, и проверьте, есть ли элементы конфигурации, которым необходимо вызвать прослушиватель.
- Если локального элемента конфигурации нет, получите его с сервера и верните список ключей и значений, содержимое конфигурации которого изменилось.
- Каждое значение ключа отправляется на сервер для получения последней конфигурации, обновления локального моментального снимка и завершения отсутствующей конфигурации до
- экзамен
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
Вызов уведомляет все узлы кластера (включая себя), запуская сброс локальных файлов и памяти.
Обработка длинных опросов
Как упоминалось выше, у клиента будет длительная задача опроса для извлечения изменений конфигурации сервера, так как же сервер справляется с этой длинной задачей опроса? Логика исходного кода находится вLongPollingService
класс, который имеетRunnable
задача с именемClientLongPolling
, сервер завернет полученный запрос на опрос вClientLongPolling
задание, которое содержитAsyncContext
объект ответа (Servlet 3.0
новый механизм), задержанный синхронизированным пулом потоков29.5s
воплощать в жизнь.
Почему, чем клиент
30s
Тайм-аут увеличен500ms
Возврат должен гарантировать, что клиент не истечет время ожидания из-за сетевых задержек в максимально возможной степени.
Здесь следует отметить, что вClientLongPolling
Когда задача отправляется в пул потоков для выполнения, сервер также проходит через очередьallSubs
Все удерживаемые запросы на опрос сохраняются, потому что в течение периода, когда элемент конфигурации удерживается, если пользователь оперирует изменением элемента конфигурации через платформу управления или серверный узел получает запрос от других узлов.dump
Если вы обновите уведомление, вы должны немедленно отменить таранную задачу и уведомить клиента о том, что данные вовремя изменились.
для достижения этой цели,LongPollingService
класс наследуется отEvent
Сам интерфейс на самом деле является триггером события и должен быть реализованonEvent
метод, тип события которогоLocalDataChangeEvent
.
Когда сервер получает изменение конфигурации во время удержания запроса, он публикуетLocalDataChangeEvent
тип уведомления о событии (обратите внимание на то же, что и вышеConfigDataChangeEvent
разница), изменение затем будет заключено вDataChangeTask
Асинхронное выполнение, содержимое взято изallSubs
найти протаранилClientLongPolling
запрос, запись изменений заставит его немедленно вернуться.
Таким образом, полный процесс выглядит следующим образом: если запрос получает не узел, игнорируем первый шаг сохранения конфигурации и запускаем:
Полный текст резюме
Эта статья посвященаNacos
Как реализация исходного кода центра конфигурации, он состоит из двух частей: клиента и сервера.Содержимое в основном охватывает ключевые моменты функций центра конфигурации.Это не только сводка по обучению, но и надежда помочь читателям, которые читают Это.