Spring Cloud Alibaba Nacos (функция)

Микросервисы
Spring Cloud Alibaba Nacos (функция)

Все больше и больше читателей общаются со мной о Spring Cloud Alibaba, и даже во время интервью половина времени была посвящена этой теме. Поэтому, увлеченный техническими исследованиями, я провел небольшое исследование Spring Cloud Alibaba.

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

1. Предпосылки

Во-первых, давайте поговорим о фоне.

Теперь явная тенденция:Микросервисы.

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

Затем, используя архитектурный стиль микросервисов, используя Spring Cloud или Dubbo для построения набора строительных лесов, он начал работать.

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

Конечно, там, где есть проблемы, есть и возможности. После серии упаковок крупные производители облачных вычислений XX используют «Облако Собственный"Новая концепция дебюта.

Spring Cloud Alibaba — одна из них.

Основные ценности этой концепции:Плавная миграция в облако, позволяющая эксплуатировать и обслуживать. Наиболее очевидная деловая видимость заключается в том, что будет предоставлен набор открытых API, и даже визуальная консоль будет предоставлена ​​в тесном контакте, что глупо.

2. Начиная с НАКОС

Это была ослепительная жемчужина, которая быстро привлекла мое внимание.

По регламенту он разбит на две лекции. Один из них — описать функциональные характеристики NACOS и его использование, а другой — пойти дальше и посмотреть на код, написанный осадными львами больших заводов.

Версия, используемая в этой статье,NACOS 1.0.0, так как эта версия по-прежнему является первой официальной версией NACOS, NACOS находится в стадии быстрой разработки, некоторый контент этой статьи может быть неприменим к будущим версиям, пожалуйста, определите сами.

NACOS решает две основные проблемы: управление динамической конфигурацией и обнаружение регистрации службы.

Что касается совместимости, помимо поддержки собственного Dubbo, он также совместим с Spring Cloud, Kubernetes и Istio.

野心勃勃的生态圈
По сравнению с приведенной выше панорамой текущий NACOS все еще находится на некотором расстоянии, но недалеко.

В этот момент, не говоря уже об Эврике, я чувствую себя немного смущенным.

Мой опыт: NACOS может полностью заменить Eureka.

Из таланта в каждом поколении это неизбежный результат.

На фоне «нативного облака» NACOS успешно запустила консоль, которая еще больше расширила свои щупальца до усовершенствованного управления услугами.

Конечно, не исключено, что Эврика тоже сдерживает свои большие ходы.

Поговорим о характеристиках динамической конфигурации.

Конечно, NACOS немного лучше и может заменить Spring Cloud Config.

Элементами конфигурации, которые изначально размещались в Git/SVN, можно единообразно управлять в консоли.

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

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

Есть два способа: один — клонировать напрямуюисходный код, упакованный с maven. Второй способ — напрямую загрузить сжатый пакет из выпуска GitHub.

Последнее рекомендуется.

метод 1: в основном запускайте следующие команды:

git clone https://github.com/alibaba/nacos.git 
cd nacos/ 
mvn -Prelease-nacos clean install -U

После периода сборки у нас есть желаемый сжатый пакет в каталоге ./distribution/target.

Способ 2:ВойтиGitHub.com/alibaba/вывезти…, найдите сжатый пакет и загрузите его.

Чтобы продемонстрировать, мы сначала запускаем в автономном режиме.

В среде Windows:

startup.cmd -m standalone

Когда все будет готово, посетитеhttp://127.0.0.1:8848/nacos/index.html, используйте nacos/nacos для входа.

Далее просто побродить.

Console预览

3. Важные понятия

Чтобы не заблудиться в Консоли, необходимо сначала уточнить несколько важных понятий.

数据模型
Эта картина важна. Описывает отношение включения пространства имен, группы и службы/идентификатора данных.

Передовая практика, предоставленная NACOS, показывает, что самое внешнее пространство имен может использоваться для различения сред развертывания, таких как test, uat, product и т. д. В то же время существует и ценность коммерческого использования: мультиарендность. Используйте пространство имен в качестве единицы, чтобы освободить пространство для пользователей.

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

По умолчанию пространство имен = общедоступное, группа = DEFAULT_GROUP.

Поняв эту модель данных, вы можете немного поиграть с консолью, например, создать несколько пространств имен:

namespace列表
После того, как пространство имен будет успешно создано, вы увидите вкладку, состоящую из пространств имен, на каждой странице первого уровня.Вы можете переключать пространство имен по желанию и управлять данными в нем. Например, следующий список конфигурации:
配置列表
Конечно, моделей предметной области много, но к этой лекции это не имеет никакого отношения, и мы проанализируем их, когда будем углубляться в исходный код на следующей лекции. Затем будет создан демонстрационный проект для создания сервера конфигурации и сервера обнаружения на основе NACOS.

Прежде чем перейти к следующей главе, настоятельно рекомендуется создать шаблонный проект Spring Boot без какой-либо настройки и без добавления кода.

Конечно, чтобы сделать содержание этой лекции более практичным, я не буду копировать демо на официальный сайт, демо-проект, сделанный в этой статье, также можно скачать сGitHubклонировано выше. Пожалуйста, подготовьтесь заранее, следующий контент будет посвящен только объяснению, а не тому, как построить проект.

4. Строительный проект с использованием NACOS

Имя проекта: nacos-example, и соответствующее управление зависимостями в каждом файле pom.xml повторяться не будет.

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

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

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

工程结构
Согласно вышесказанному, после запуска службы NACOS мы создаем два пространства имен, dev и product.При написании конфигурации весенней загрузки мы заполняем не имена пространств имен test и product, а ID.Этот ID будет создан после пространство имен успешно создано. , которое автоматически назначается системой. Текущее правило генерации — случайная функция UUID.

Такие правила настройки будут очень спорными и не будут обсуждаться в этой статье.

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

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

Пока что читатели обнаружат некоторые «недостатки», привнесенные NACOS, наиболее очевидной проблемой является навязчивость, вызванная «множеством ролей». Поскольку это централизованная архитектура, неудивительно, что эта проблема возникает, если она плохо отделена.

NACOS строго придерживается модели «производитель-потребитель», особенно при распределении ролей удаленных вызовов.

Далее обратите внимание на конфигурацию.

Большинство продуктов с открытым исходным кодом Alibaba рекомендуют использовать файл свойств.Из-за личных привычек я использую yml, и эффект тот же.

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

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

server:
  port: 8100
spring:
  application:
    name: user
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: 7d3e5f19-a102-471a-b6e0-67bd7d1d35f3
        group: USER_GROUP
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 7d3e5f19-a102-471a-b6e0-67bd7d1d35f3
---
spring:
  profiles: prod
  cloud:
    nacos:
      config:
        server-addr: 11.162.196.16:8848
        namespace: c4c81555-91e1-4ef5-8b57-77c5407b3481
      discovery:
        server-addr: 11.162.196.16:8848
        namespace: c4c81555-91e1-4ef5-8b57-77c5407b3481
---
spring:
  profiles:
    active: dev

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

Затем инкапсулируйте пользовательские параметры конфигурации. Если есть только один параметр, форма JavaBean не может быть использована, но в большинстве случаев она настраивается с несколькими параметрами.Эта статья дает инкапсуляцию в форме JavaBean.

Параметры конфигурации, используемые пользовательским модулем:

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@Setter
@ConfigurationProperties(prefix = "user")
public class UserConfig {

    /**
     * 用户状态:enable-启用,disable-禁用
     */
    private String status;
}

Параметры конфигурации, используемые модулем заказа:

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@Setter
@ConfigurationProperties(prefix = "order")
public class OrderConfig {

    /**
     * 最大购买数量
     */
    private int maxNum = Integer.MAX_VALUE;

    /**
     * 是否上架
     */
    private boolean onSale = true;
}

Далее нужно написать код реализации функции, основной записью является OrderController в модуле заказа:

@RefreshScope
@RestController
@RequestMapping
public class OrderController {

    @Autowired
    private OrderConfig config;

    @Autowired
    private UserRpcService userRpcService;

    @PostMapping(value = "/order")
    public String placeOrder(@RequestParam(name = "num", defaultValue = "1") Integer num) {
        if (!"enable".equals(userRpcService.getUserStatus())) return "该用户已被禁用,暂不能下单";
        if (num <= 0) return "购买数量有误";
        if (!config.isOnSale()) return "商品未上架";
        if (num > config.getMaxNum()) return "购买数量超限";
        return "OK";
    }
}

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

@RefreshScope
@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserConfig config;

    @GetMapping(value = "/status")
    public String getUserStatus() {
        return config.getStatus();
    }
}

Аннотация @RefreshScope в контроллере используется для автоматического обновления конфигурации.

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

Процесс добавления конфигурации здесь повторяться не будет, необходимо обратить внимание на заполнение спецификации Data Id. Полный формат dataId состоит из трех частей:

${prefix}-${spring.profile.active}.${file-extension}

prefix, который используется по умолчанию${spring.application.name}, также можно настроить через spring.cloud.nacos.config.prefix.

spring.profile.active, который является профилем, соответствующим текущей среде.Подробности см. в документации Spring Boot. Примечание. Когда spring.profile.active пуст, соответствующий коннектор также не будет существовать, а формат сплайсинга dataId станет${prefix}.${file-extension}

file-exetension, который можно настроить с помощью элемента конфигурации spring.cloud.nacos.config.file-extension для настройки формата данных содержимого. В настоящее время поддерживаются только свойства и типы yaml.

Demo工程的配置列表
Следующим шагом будет запуск двух модулей, порядка и пользователя, соответственно, и играйте небрежно.

V. Знакомство с другими функциями

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

配置历史版本
NACOS предоставляет Open-API для настройки прослушивателей. Слушатель регистрации использует технологию асинхронного сервлета. Суть мониторинга регистрации заключается в сравнении значения MD5 с конфигурацией и значением конфигурации и фоном. Если значения MD5 несовместимы, несогласованная конфигурация возвращается немедленно. Если значения совпадают, подождите определенный период времени и верните нулевое значение.

Наконец, элегантная функция онлайн/офлайн является изюминкой NACOS. В каждой служебной детали может быть несколько экземпляров, и включение/выключение каждого экземпляра можно контролировать через Консоль. Если вы снова подключитесь к сети, в течение некоторого времени будет проходить процесс регистрации, и вы не сможете получить доступ к экземпляру сразу после нажатия кнопки «Войти в сеть».

6. Расширенные функции NACOS

Если будет решено запустить NACOS в крупносерийное производство, вышеперечисленные функции далеки от выполнения условий. В этой главе будет объяснено несколько расширенных функций для сопровождения вашей службы NACOS.

1. Кластерный режим

Запуск только одного экземпляра службы NACOS немного слаб. Вышеупомянутое содержимое основано на предпосылке развертывания на одном компьютере. В этом разделе рассказывается, как развернуть кластер NACOS.

Найдите файл conf/cluster.conf, если нет, создайте новый. Для редактирования контента нужно только указать ip и порт машины, желательно 3 и больше. Если машинных ресурсов не так много, его можно развернуть сразу на одной машине, и выделить номер порта. следующим образом:

# ip:port
192.168.0.88:8848
192.168.0.88:8849
192.168.0.88:8840

Обратите внимание, что 127.0.0.1 или локальный хост нельзя использовать в режиме кластера, в текущей версии есть ошибки в разрешении сетевой карты.

Эта проблема связана с тем, что когда Nacos получает локальный IP-адрес, он не получает правильный внешний IP-адрес. Необходимо убедиться, что результат InetAddress.getLocalHost().getHostAddress() или имя хоста -i соответствует IP-адресу, настроенному в кластере. конф.

Найдите conf/application.properties, если нет, то есть проблема. Отредактируйте содержимое внутри, основная цель — включить MySQL в качестве уровня хранения (в настоящее время поддерживается только MySQL). Добавьте в конец файла:

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

Затем создайте новую базу данных с именем nacos и запуститеconf/nacos-mysql.sqlфайл сценария.

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

Поскольку вы хотите имитировать несколько служб NACOS на одном компьютере, вы можете скопировать сконфигурированный проект в двух копиях, а затемconf/application.propertiesВы можете изменить номер порта в .

目录
Затем запустите NACOS в трех командных окнах:

startup -m cluster

Используйте соответствующий номер порта для доступа к консоли. Если ее можно открыть успешно, развертывание выполнено успешно.

Наконец, в демонстрационном проекте, созданном выше, измените значение server-addr и добавьте другие адреса доступа NACOS:

server:
  port: 8200
spring:
  application:
    name: order
  cloud:
    nacos:
      config:
        server-addr: 192.168.0.88:8848,192.168.0.88:8849,192.168.0.88:8840
        file-extension: yaml
        namespace: 7d3e5f19-a102-471a-b6e0-67bd7d1d35f3
        group: ORDER_GROUP
      discovery:
        server-addr: 192.168.0.88:8848,192.168.0.88:8849,192.168.0.88:8840
        namespace: 7d3e5f19-a102-471a-b6e0-67bd7d1d35f3

2. Меры безопасности

К сожалению, на официальном сайте NACOS нет подробных сведений о безопасности. только виделaccessKeyа такжеsecretKeyДва подозреваемых элемента конфигурации безопасности были настроены для взаимодействия с ACM Alibaba Cloud.

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

Nacos планирует предоставить возможности шифрования в версии 1.X. В настоящее время он не поддерживает шифрование. Он может быть зашифрован только с помощью sdk, а затем сохранен в nacos. С безопасностью NACOS Console тоже очень плохо: пароли нельзя менять, пользователей нельзя создавать, нет понятия ролей и разрешений.

Регистрация службы и обнаружение NACOS основаны на HttpURLConnection для удаленных вызовов. Это место обеспечивает переключатель включения HTTPS. Имя параметра JVM:com.alibaba.nacos.client.naming.tls.enable.

Кроме того, в настоящее время только некоторые меры безопасности могут быть приняты на периферии NACOS.

3. Некоторые полезные настройки

nacos.home, который является параметром запуска службы NACOS, передаваемым в качестве параметра JVM. Но к сожалению, пользоваться этим параметром не очень удобно, нужно модифицировать скрипт запуска, это примерно 104 строка в файле startup.sh:

JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"

Более тщательный подход заключается в изменении значения BASE_DIR (которое по умолчанию соответствует родительскому каталогу файла startup.sh) примерно в строке 71 в файле startup.sh:

export BASE_DIR=`cd $(dirname $0)/..; pwd`

nacos.logging.path, журнал является ценнейшим дополнительным продуктом работы системы, и иногда необходимо настроить каталог журнала для удобства управления. Если вам нужно указать, вам также нужно изменить сценарий startup.sh. Добавление строки примерно после строки 104:

JAVA_OPT="${JAVA_OPT} -Dnacos.logging.path=指定的目录"

Конечно, уровень журнала также можно указать с помощью двух параметров JVM com.alibaba.nacos.naming.log.level и com.alibaba.nacos.config.log.level соответственно.

Однако необходимо специально пояснить, что не все журналы являются ценными и могут быть удалены в соответствии с реальной ситуацией, в противном случае это создаст ненужную нагрузку на сервер.Соответствующая конфигурация журнала может быть изменена в файле conf/nacos-logback.xml. файл .

4. конечная точка

Параметр serverAddr, включенный в приведенный выше файл конфигурации, представляет собой исчерпывающий список всех доступных служб NACOS.В сценариях крупномасштабных приложений этот метод настройки явно нецелесообразен. Конечная точка эквивалентна службе DNS, которая может проксировать все службы NACOS и требует только указать доменное имя доступа.

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

7. Резюме

Эта статья представляет собой функциональное введение в Spring Cloud Alibaba Nacos.

Если у вас есть команда с сильными возможностями для исследований и разработок, вы можете попробовать этого «краба» сейчас, и, кстати, вы также можете внести большой вклад в PR.

Лично рекомендуется подождать и посмотреть некоторое время.После версии v1.2.0 его можно будет постепенно внедрять в стек технологий компании.

Отсканируйте QR-код ниже, чтобы ввести оригинальную галантерею и заняться «технической» святой землей.