Интеграция распределенного центра конфигурации Apollo в микросервисы

Микросервисы Архитектура

задний план

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

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

В предыдущих статьях мы представили компонент распределенного центра конфигурации в Spring Cloud:Spring Cloud Config. В этой статье будет представлен более мощный Apollo.

Центр распределенной конфигурации

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

  • Добавляйте, удаляйте, изменяйте и проверяйте конфигурацию;
  • Изоляция различных конфигураций среды (разработка, тестирование, предварительный выпуск, оттенки серого/онлайн);
  • Высокая производительность и высокая доступность;
  • Большой объем запросов и высокий параллелизм;
  • больше читайте и меньше пишите;

Существующие компоненты центра конфигурации включают: Spring Cloud Config, Apollo, Disconf, Diamond и т. д. Эти компоненты имеют более или менее функциональные различия, но все они имеют базовые функции центра конфигурации.

Знакомство с Аполлоном

Apollo — это центр управления конфигурацией с открытым исходным кодом, разработанный отделом инфраструктуры Ctrip.Он может централизованно управлять конфигурацией различных сред и кластеров приложений.После изменения конфигурации его можно передать на сторону приложения в режиме реального времени, и он стандартизирован разрешения, управление процессами и другие функции. В настоящее время существует более 14 тысяч звезд, и они широко используются. Apollo разработан на основе модели с открытым исходным кодом, адрес с открытым исходным кодом:GitHub.com/C trip Corp/Ах…

图片来源 Apollo
Кредит изображения Аполлон

Сначала пользователь изменяет и публикует конфигурацию в центре конфигурации; центр конфигурации уведомляет клиента Apollo о наличии обновления конфигурации; клиент Apollo получает последнюю конфигурацию из центра конфигурации, обновляет локальную конфигурацию и уведомляет приложение.

Apollo поддерживает 4 измерения для управления конфигурацией в формате ключ-значение:

  • приложение (приложение): приложение, которое фактически использует конфигурацию.Клиенту Apollo необходимо знать, кем является текущее приложение во время выполнения, чтобы он мог получить соответствующую конфигурацию; каждое приложение должно иметь уникальный идентификатор - appId, идентификатор приложения следует Код идет, поэтому его нужно настроить в коде.
  • Среда: Настройте соответствующую среду.Клиенту Apollo необходимо знать, в какой среде находится текущее приложение во время выполнения, чтобы он мог получить конфигурацию приложения.
  • Кластер (кластер): группировка различных экземпляров в рамках приложения.Например, экземпляры приложения в шанхайском компьютерном зале можно разделить на один кластер, а экземпляры приложения в пекинском компьютерном зале можно разделить на другой кластер. Для разных кластеров одна и та же конфигурация может иметь разные значения, например адрес zookeeper.
  • Пространство имен (namespace): группировка различных конфигураций в рамках приложения, вы можете просто сравнить пространство имен с файлом, а различные типы конфигураций хранятся в разных файлах, таких как файлы конфигурации базы данных, файлы конфигурации RPC, собственные файлы конфигурации приложения, и т. д.; приложение может напрямую считывать пространство имен конфигурации общих компонентов, таких как DAL, RPC и т. д.; приложение также может настраивать конфигурацию общих компонентов, наследуя пространство имен конфигурации общих компонентов, таких как начальный номер подключения к базе данных DAL.

Когда мы интегрируем Apollo, мы можем создавать соответствующие измерения по мере необходимости.

Быстрый старт

Давайте создадим микросервис на основе Spring Boot и интегрируем Apollo.

Запустить сервер

Центр конфигурации Apollo включает в себя: службу конфигурации, службу администрирования и портал.

  • Служба конфигурации: предоставляет интерфейс получения конфигурации и интерфейс передачи конфигурации для обслуживания клиентов Apollo;
  • Служба администратора: предоставляет интерфейс управления конфигурацией, интерфейс публикации изменений конфигурации и обслуживает портал интерфейса управления;
  • Портал: настройте интерфейс управления, получите список служб AdminService через MetaServer и используйте метод SLB с мягкой загрузкой клиента для вызова AdminService.

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

Для сервера Apollo требуются две базы данных: ApolloPortalDB и ApolloConfigDB. Созданная инструкция отображается в инсталляционном пакете.После создания необходимо настроить сценарий запуска, т.е.demo.shсценарий:

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

Сценарий запустит три службы локально, используя соответственно порты 8070, 8080 и 8090. Убедитесь, что эти три порта в данный момент не используются. воплощать в жизнь

./demo.sh start

См. следующий вывод информации журнала:

==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!

Сервер Apollo успешно запущен.

клиентское приложение

После сборки сервера Apollo подключите наше приложение к Apollo.

импортировать зависимости
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.1.0</version>
        </dependency>

Просто добавьте зависимостиapollo-clientцитаты.

процедура въезда
@SpringBootApplication
@EnableApolloConfig("TEST1.product")
public class ApolloApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApolloApplication.class, args);
    }
}

мы проходим@EnableApolloConfig("TEST1.product")Аннотация разрешает регистрацию на сервере Apollo и указывает пространство имен какTEST1.product.

конфигурационный файл
app.id: spring-boot-logger
  # set apollo meta server address, adjust to actual address if necessary
apollo.meta: http://localhost:8080
server:
  port: 0

Appid и адрес сервера Apollo указываются в конфигурационном файле.

тестовое приложение

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

@Service
public class LoggerConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(LoggerConfiguration.class);
    private static final String LOGGER_TAG = "logging.level.";

    @Autowired
    private LoggingSystem loggingSystem;

    @ApolloConfig
    private Config config;

    @ApolloConfigChangeListener
    // 监听 Apollo 配置中心的刷新事件
    private void onChange(ConfigChangeEvent changeEvent) {
        refreshLoggingLevels();
    }

    @PostConstruct
    // 设置刷新之后的日志级别
    private void refreshLoggingLevels() {
        Set<String> keyNames = config.getPropertyNames();
        for (String key : keyNames) {
            if (containsIgnoreCase(key, LOGGER_TAG)) {
                String strLevel = config.getProperty(key, "info");
                LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
                loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
                logger.info("{}:{}", key, strLevel);
            }
        }
    }

    private static boolean containsIgnoreCase(String str, String searchStr) {
        if (str == null || searchStr == null) {
            return false;
        }
        int len = searchStr.length();
        int max = str.length() - len;
        for (int i = 0; i <= max; i++) {
            if (str.regionMatches(true, i, searchStr, 0, len)) {
                return true;
            }
        }
        return false;
    }
}

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

@Service
public class PrintLogger {
    private static Logger logger = LoggerFactory.getLogger(PrintLogger.class);

    @ApolloJsonValue("${kk.v}")
    private String v;

    @PostConstruct
    public void printLogger() throws Exception {
        Executors.newSingleThreadExecutor().submit(() -> {
            while (true) {
                logger.error("=========" + v);
                logger.info("我是info级别日志");
                logger.error("我是error级别日志");
                logger.warn("我是warn级别日志");
                logger.debug("我是debug级别日志");
                TimeUnit.SECONDS.sleep(1);
            }
        });
    }
}

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

контрольная работа

В интерфейсе конфигурации Apollo мы добавляем следующую конфигурацию:

И опубликуйте конфигурацию для запуска нашего локального сервиса SpringBoot:

2019-05-28 20:31:36.688 ERROR 44132 --- [pool-1-thread-1] com.blueskykong.apollo.PrintLogger       : =========log-is-error-level.
2019-05-28 20:31:36.688 ERROR 44132 --- [pool-1-thread-1] com.blueskykong.apollo.PrintLogger       : 我是error级别日志

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

Опубликуйте отредактированную конфигурацию, и служба приложений получит события обновления.

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

2019-05-28 20:35:56.819  WARN 44132 --- [pool-1-thread-1] com.blueskykong.apollo.PrintLogger       : 我是warn级别日志
2019-05-28 20:36:06.823 ERROR 44132 --- [pool-1-thread-1] com.blueskykong.apollo.PrintLogger       : =========log-is-warn-level.

Принцип тщательно изучен

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

Общая архитектура Аполлона

图片来源 Apollo
Кредит изображения Аполлон

Изображение выше кратко описывает общий дизайн Аполлона, если смотреть снизу вверх:

  • Служба конфигурации предоставляет такие функции, как чтение и отправка конфигурации, а объектом службы является клиент Apollo.
  • Служба администрирования предоставляет такие функции, как изменение и публикация конфигурации, а объектом службы является портал Apollo (интерфейс управления).
  • И служба Config, и служба администрирования представляют собой многоэкземплярные развертывания без сохранения состояния, поэтому вам необходимо зарегистрироваться в Eureka и следить за пульсом.
  • Поверх Eureka мы настроили слой Meta Server для инкапсуляции интерфейса обнаружения служб Eureka.
  • Клиент обращается к метасерверу через доменное имя, чтобы получить список служб конфигурации (IP + порт), а затем напрямую обращается к службе через IP + порт.В то же время клиентская сторона будет выполнять балансировку нагрузки и повторять ошибки. .
  • Портал обращается к метасерверу через доменное имя, чтобы получить список служб администрирования (IP+порт), а затем напрямую обращается к службе через IP+порт. Сторона портала.
  • Чтобы упростить развертывание, мы фактически развернем три логические роли Config Service, Eureka и Meta Server в одном и том же процессе JVM.

ConfigService, AdminService и Portal относятся к модулям сервера Apollo.Эврика, упомянутая в нем, предназначена для обеспечения высокой доступности.Config и Admin оба не имеют состояния и кластеризованы.Как клиент находит Config? Как портал находит администратора? Чтобы решить эту проблему, Apollo представила компонент реестра службы Eureka в своей архитектуре, чтобы реализовать регистрацию службы и обнаружение между микрослужбами для обнаружения и регистрации службы. Служба конфигурации и администрирования регулярно регистрирует экземпляры и сообщает о пульсе. Eureka развертывается вместе с ConfigService.

MetaServer на самом деле является прокси-сервером Eureka, который предоставляет интерфейс обнаружения служб Eureka в виде более простого и явного HTTP-интерфейса, так что Client/Protal может запрашивать список адресов Config/Admin через простой HTTPClient. После получения списка адресов экземпляров службы используется простой маршрут политики программной загрузки клиента (Client SLB) для обнаружения целевого экземпляра и инициирования вызова.

Реализация клиента

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

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

Как уведомить клиента? Мы видим, что этапы реализации Apollo следующие:

  1. Клиент и сервер поддерживают длительное соединение, поэтому они могут получить обновление конфигурации в первый раз. (реализовано через длинный опрос HTTP)
  2. Клиент также регулярно получает последнюю конфигурацию приложения с сервера центра конфигурации Apollo.
    • Это резервный механизм, чтобы предотвратить обновление конфигурации из-за сбоя механизма push.
    • Клиент периодически извлекает локальную версию, поэтому в целом для запланированной операции извлечения сервер возвращает 304 — Not Modified.
    • Частота синхронизации по умолчанию извлекается каждые 5 минут, и клиент также может переопределить ее, указав системное свойство: apollo.refreshInterval во время выполнения в минутах.
  3. После того, как клиент получит последнюю конфигурацию приложения с сервера центра конфигурации Apollo, она будет сохранена в памяти
  4. Клиент будет кэшировать копию конфигурации, полученной с сервера, в локальной файловой системе.Когда сервис недоступен или сеть заблокирована, конфигурацию все равно можно восстановить локально.
  5. Приложения могут получать последнюю конфигурацию от клиента Apollo и подписываться на уведомления об обновлении конфигурации.

резюме

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

Кодовый адрес, соответствующий этой статье:GitHub.com/Доступный ETS2012/S…

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号

Ссылаться на

  1. apollo
  2. Микросервисная архитектура ~ Анализ архитектуры центра конфигурации Ctrip Apollo