задний план
С развитием бизнеса и обновлением микросервисной архитектуры количество сервисов и конфигурация программы увеличиваются (разные микросервисы, разные адреса серверов, разные параметры), а традиционный метод конфигурационного файла и метод базы данных уже не актуальны. достаточно для разработки Требования к персоналу для управления конфигурацией: изменения конфигурации вступят в силу в режиме реального времени, выпуск оттенков серого, управление конфигурацией по среде и кластеру, а также совершенный механизм полномочий и аудита. В распределенной среде эти конфигурации более сложны.
Поэтому нам нужен центр конфигурации, чтобы управлять конфигурацией единообразно! Освободив бизнес-разработчиков от сложных и громоздких конфигураций, им нужно сосредоточиться только на самом бизнес-коде, что может значительно повысить эффективность разработки, эксплуатации и обслуживания. В то же время разделение пакетов конфигурации и выпуска еще больше повышает вероятность успешного выпуска и обеспечивает мощную поддержку детального контроля и аварийного управления эксплуатацией и обслуживанием.
В предыдущих статьях мы представили компонент распределенного центра конфигурации в Spring Cloud:Spring Cloud Config. В этой статье будет представлен более мощный Apollo.
Центр распределенной конфигурации
В распределенной среде часто развертывается множество экземпляров одного и того же типа службы. Эти экземпляры используют некоторую конфигурацию, и для лучшего обслуживания этих конфигураций создается служба управления конфигурацией. С помощью этой службы можно легко решить проблемы с конфигурацией для тысяч или сотен экземпляров службы. Возможности Центра конфигурации:
- Добавляйте, удаляйте, изменяйте и проверяйте конфигурацию;
- Изоляция различных конфигураций среды (разработка, тестирование, предварительный выпуск, оттенки серого/онлайн);
- Высокая производительность и высокая доступность;
- Большой объем запросов и высокий параллелизм;
- больше читайте и меньше пишите;
Существующие компоненты центра конфигурации включают: Spring Cloud Config, Apollo, Disconf, Diamond и т. д. Эти компоненты имеют более или менее функциональные различия, но все они имеют базовые функции центра конфигурации.
Знакомство с Аполлоном
Apollo — это центр управления конфигурацией с открытым исходным кодом, разработанный отделом инфраструктуры Ctrip.Он может централизованно управлять конфигурацией различных сред и кластеров приложений.После изменения конфигурации его можно передать на сторону приложения в режиме реального времени, и он стандартизирован разрешения, управление процессами и другие функции. В настоящее время существует более 14 тысяч звезд, и они широко используются. Apollo разработан на основе модели с открытым исходным кодом, адрес с открытым исходным кодом:GitHub.com/C trip Corp/Ах…
Сначала пользователь изменяет и публикует конфигурацию в центре конфигурации; центр конфигурации уведомляет клиента 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 (интерфейс управления).
- И служба 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 следующие:
- Клиент и сервер поддерживают длительное соединение, поэтому они могут получить обновление конфигурации в первый раз. (реализовано через длинный опрос HTTP)
- Клиент также регулярно получает последнюю конфигурацию приложения с сервера центра конфигурации Apollo.
- Это резервный механизм, чтобы предотвратить обновление конфигурации из-за сбоя механизма push.
- Клиент периодически извлекает локальную версию, поэтому в целом для запланированной операции извлечения сервер возвращает 304 — Not Modified.
- Частота синхронизации по умолчанию извлекается каждые 5 минут, и клиент также может переопределить ее, указав системное свойство: apollo.refreshInterval во время выполнения в минутах.
- После того, как клиент получит последнюю конфигурацию приложения с сервера центра конфигурации Apollo, она будет сохранена в памяти
- Клиент будет кэшировать копию конфигурации, полученной с сервера, в локальной файловой системе.Когда сервис недоступен или сеть заблокирована, конфигурацию все равно можно восстановить локально.
- Приложения могут получать последнюю конфигурацию от клиента Apollo и подписываться на уведомления об обновлении конфигурации.
резюме
В этой статье сначала представлена концепция распределенного центра конфигурации и практика доступа к Apollo, а затем подробно представлены некоторые детали общей архитектуры и реализации Apollo. В целом, Apollo является наиболее полнофункциональным из существующих компонентов конфигурационного центра. Он может централизованно управлять конфигурацией различных сред и различных кластеров приложений. После изменения конфигурации его можно передать на сторону приложения в режиме реального времени. Он имеет стандартизированные разрешения, управление процессами и другие функции, которые подходят для сценариев управления конфигурацией микросервисов. .
Кодовый адрес, соответствующий этой статье:GitHub.com/Доступный ETS2012/S…