1. Начало работы с Nacos
1.1 Предисловие
Моим первоначальным намерением было создать фреймворк, пригодный для оперативной быстрой разработки, и интегрировать некоторые необходимые технологии.Первой идеей было попробоватьSpringCloud Alibaba
,ведь его разработал Али и адаптировал под нужды китайцев.Я скачал исходники и планировал его изучить.Прочитав накосы,думал про Эврику использованную в предыдущем проекте,а так же знаю что Эврика на самом деле просто простой центр регистрации, в нем нужно настраивать атрибуты и полагаться на git В качестве центра конфигурации может быть хорошей идеей перейти на nacos, поэтому я начал изучать nacos
1.2. Конфигурация развертывания
Моя запись отличается от обычной записи демо-версии, я просто смотрю исходный код и говорю первым.SpringCloud Alibabaвниз по коду git
Поскольку nacos — это отдельно развернутая служба, сначалаофициальный сайт НакоПосле установки nacos учетная запись и парольnacos
, измените адрес nacos файла конфигурации
1.3 Конфигурация консоли
- Вы можете увидеть приведенный выше файл конфигурации, очевидно, что dataId соответствует файлу конфигурации, группа используется в качестве параметра группы, мы можем настроить ее в интерфейсе nacos.
Нажмите Опубликовать, и после подтверждения вы сможете обновиться до приложения, так что теперь изучим его принцип
1.4 Анализ отладки
1.4.1 Получить конфигурацию
Не стесняйтесь опубликовать обновление конфигурации, чтобы увидеть параметры печати
затем войтиClientWorker
class видно, что за прием данных отвечает отдельный пул потоков
Основной метод конфигурации обновленияcheckUpdateDataIds
, а основным методом внутри этого метода являетсяcheckUpdateConfigStr
, его основное содержание заключается в следующем
Очевидно, вы можете увидеть метод удаленного почтового вызова, этот метод используется для получения последней конфигурации nacos,На этом этапе вам, возможно, придется спросить.Очевидно, что nacos изменяет конфигурацию и передает ее клиенту.Почему клиент вызывает сервер? Здесь nacos использует умный метод, чтобы установить более длительный период ожидания.Глядя на скриншот, мы видим, что период ожидания составляет 45 секунд.На самом деле, если nacos не изменит данные в течение 30 секунд, он вернет пустые данные, чтобы указать что обновления нет.Если есть обновленные данные в течение 30 секунд, их можно вернуть прямо в этом 45-секундном запросе, увидев этот дизайн, я действительно восхищаюсь дырой в мозгу автора, сделать это равносильно тому, чтобы поставитьСердцебиение и передача данных объединены, нет необходимости делать дополнительное соединение heartbeat, как только nacos зависнет, клиент сообщит об ошибке, и если клиент запрашивает, nacos также знает, что клиент жив. Недостаток, о котором я могу думать, может быть, в том, что длинные соединения, подобные этому, не могут быть сделаны слишком часто, но общих служебных соединений достаточно.
Далее введите методparseUpdateDataIdResponse
, этот метод используется для подтверждения того, какая конфигурация была изменена.Если вы действительно изменили конфигурацию системы, вам придется вернуться и продолжить чтение.
можно увидетьchangedGroupKeys
Для измененного файла после того, как nacos получит измененное имя файла, он пройдетgetServerConfig
Метод берет на себя инициативу, чтобы получить данные об изменении
проходить послеLocalConfigInfoProcessor.saveSnapshot
Сохраните снимок локально и обновите локальный кешcacheMap
1.4.2 Обновить конфигурацию
-
Обход имен файлов конфигурации кэша
-
Обнаружение изменений данных
- обновить значение атрибута
- Обновите контейнер, чтобы загрузить новый файл конфигурации.
-
Загрузите соответствующий файл конфигурации среды
-
локатор ресурсов
-
Читаем расположение, вот файл failover, то есть можно поставить свой файл конфигурации и использовать его при сбое nacos
- Как правило, файл аварийного переключения отсутствует, тогда удаленный вызов получает правильную конфигурацию.
- Построить источник свойств
1.5. Резюме
Весь процесс можно разделить на несколько шагов
- Сохраняйте удаленное соединение и извлекайте измененное имя файла.
- Получить реальные данные конфигурации в соответствии с вытащенным именем файла, идентификатором данных и другими параметрами.
- Обновите конфигурацию в кеше, тут я обнаружил, что многие места будут проходить
configFilterChainManager.doFilter(null, cr)
, я добавил фильтр через отражение, и в результате много раз будет вызываться обновление файлаdoFilter
, я не знаю, что это значит - Последующие события обновления конфигурации
RefreshEvent
, перезагрузитсяpropertySource
, Nacos будет вызван удаленно в процессе, чтобы снова вызвать последнюю конфигурацию
1.6 Проблемы
Я не хотел разбираться в этом избыточном дизайне, с углублением исходного кода, он действительно переворачивался и переворачивался, и сюжет был взлетами и падениями.
- Я думал, что измененные параметры конфигурации будут возвращены прямо в запросе на блокировку, а возвращенный результат - это имя файла, настроенное в nacos, ну это понятно, имя файла используется для поиска конкретного
propertySource
Тоже работает, но почему бы не вернуться с изменением параметров; - Ну по возвращаемым параметрам в первый раз идем на удалённый вызов для получения конфигурации.Я думал, что могут быть возвращены только измененные параметры, но возвращаются параметры файла целиком.Ну эта отказоустойчивость лучше и понятнее ,и можно один раз пройти.Количество данных будет больше,что вроде бы отличается от дизайна аполлона
- Я думал, что когда я получил данные, я должен обновить переменные среды и обновить экземпляр, но я этого не сделал.Я оперировал кешем, а затем обновил контейнер Spring напрямую и перечитал содержимое конфигурации удаленно через локатор ресурсов, определенный в нем. , обновите до
propertySource
середина - Ну, ряд операций посередине, я думаю на данный момент подготовиться к другим зависимостям, но несколько вхождений
configFilterChainManager.doFilter(null, cr)
Я снова не могу понять.Название должно быть цепным фильтром, но нет фильтра, который вызывается более 3 раз в одном обновлении, и он не может фильтровать, пока контейнер не будет обновлен; - И этот фильтр определяет метод добавления, но я не могу найти запись для добавления, только через отражение, чтобы заставить считывание атрибута добавить фильтр
- я тоже видел
listener.receiveConfigInfo(contentTmp);
Этот метод больше похож на метод чтения содержимого конфигурации, предоставленного пользователем. Если вы хотите получить новую информацию о конфигурации после изменения конфигурации, не используйте фильтр. Пример реализации выглядит следующим образом.