1. Центр распределенной конфигурации
В распределенной системе количество сервисов резко возрастает, а ее конфигурационные файлы должны управляться единообразно и обновляться в режиме реального времени.Необходим компонент распределенного конфигурационного центра. Spring Cloud предоставляет компонент центра конфигурации Spring Cloud Config, который поддерживает службы конфигурации в удаленных репозиториях Git и локальных файлах. По умолчанию git используется для хранения информации о конфигурации, а в примере автора также используется репозиторий git по умолчанию, чтобы можно было легко управлять содержимым конфигурации и получать к нему доступ с помощью клиентского инструмента git.
В компоненте Spring Cloud Config есть две роли: одна — это сервер конфигурации сервера конфигурации, который предоставляет информацию о файлах конфигурации для других служб; другая — это клиент конфигурации, который является другими службами и извлекает конфигурацию с сервера конфигурации в запускать.
Ниже описаны методы создания и реализации Config Server и Config Client соответственно.
2. Сервер конфигурации
2,1 баночки в пом
Просто добавьте ссылки на следующие два пакета jar.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>jsr311-api</artifactId>
<groupId>javax.ws.rs</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Поскольку сервер Spring Cloud Config предоставляет конфигурацию для клиента посредством обнаружения службы, здесь представлен стартер консула, и и сервер конфигурации, и клиент зарегистрированы в кластере консула.
2.2 Начальный класс
Просто, потому что Spring Cloud предоставляет множество готовых функций для активации сервера конфигурации через аннотацию spring-cloud-config-server.
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
@EnableConfigServer
Аннотация очень важна, помечая службу как сервер конфигурации;@EnableDiscoveryClient
Зарегистрируйте службу, чтобы другие службы могли ее обнаружить и вызвать.
2.3 bootstrap.yml
server:
port: 8888
spring:
application:
name: config-server
cloud:
consul:
discovery:
preferIpAddress: true
enabled: true
register: true
service-name: config-service
//...
host: localhost
port: 8500
---
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/keets/Config-Repo.git
searchPaths: ${APP_LOCATE:dev}
username: user
password: pwd
В первом разделе конфигурации указывается порт службы; во втором разделе — конфигурация, связанная с обнаружением службы; в третьем разделе — информация о сервере конфигурации, где файл конфигурации хранится в облаке кода, путь к файлу поиска по умолчанию — папку dev, вы можете указать переменные среды, а ниже имя пользователя и пароль.Общественный проект не нужно устанавливать имя пользователя и пароль.
Пока настроен сервер конфигурации, это очень просто?
3. Настроенный git-репозиторий
Репозиторий, который настраивает конфигурацию сервера,https://gitee.com/keets/Config-Repo.git
. Автор создал в этом репозитории две папки: dev и prod. И в папке dev создается новый файл configclient-dev.yml. Почему он так называется, можете ли вы назвать его как хотите? Ответ — нет, давайте посмотрим на правила именования файла конфигурации.
Отношение сопоставления между URL-адресом и файлом конфигурации выглядит следующим образом:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
Приведенный выше URL-адрес сопоставит файл конфигурации, соответствующий {application}-{profile}.yml, {label} соответствует разным веткам на git, по умолчанию используется master
Например, Config Client, {application} соответствуетspring.application:configclient
, exp соответствует {profile}, и если {label} не указан, по умолчанию используется master.
Недавно созданный файл configclient-dev.yml выглядит следующим образом:
spring:
profiles: dev
cloud:
version: Dalston.SR4
4. Клиент конфигурации
4.1 баночки в пом
Просто добавьте ссылки на следующие два пакета jar.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>jsr311-api</artifactId>
<groupId>javax.ws.rs</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
Добавлен модуль мониторинга spring-boot-starter-actuator, который включает API обновления /refresh для динамического обновления информации о конфигурации. Остальные такие же, как добавленные в конфигурации сервера, нечего и говорить.
4.2 Начальный класс
Просто, потому что Spring Cloud предоставляет множество готовых функций для активации сервера конфигурации через аннотацию spring-cloud-config-server.
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
Не требуется настройка клиента@EnableConfigServer
аннотация.
4.3 bootstrap.yml
server:
port: 9901
cloud:
version: Brixton SR7
spring:
cloud:
consul:
discovery:
preferIpAddress: true
enabled: true
register: true
service-name: config-client
//...
host: localhost
port: 8500
---
spring:
profiles:
active: dev
application:
#app名称
name: configclient
cloud:
config:
#指定profile
profile: dev
label: master
discovery:
enabled: true
#server名
service-id: config-service
enabled: true
fail-fast: true
---
spring:
profiles: default
application:
name: configclient
Из приведенной выше конфигурации мы видим, что профиль, который мы активировали, называется dev, а настроенная служба конфигурации называетсяconfig-service
, указывает, что нужно извлечь конфигурацию из основной ветки. Таким образом, когда configclient запускается, он обращается к серверу конфигурации, чтобы получить информацию о файле конфигурации соответствующего файла configclient-dev.
4.4 TestResource
Автор создал новый TestResource, и соответствующей конечной точкой API является /api/test.
@Value("${cloud.version}")
private String version;
@GetMapping("/test")
public String from() {
return version;
}
cloud.version
В приведенном выше конфигурационном файле видно, что Brixton SR7 указан по умолчанию, а значение, установленное автором в конфигурационном центре, — Dalston.SR4.
5. Результаты испытаний
5.1 Получить конфигурацию
Во-первых, давайте взглянем на информацию журнала при запуске клиента конфигурации, действительно ли в соответствии с нашей конфигурацией вытягивать информацию configclient-dev с сервера конфигурации.
Судя по журналу, это соответствует приведенной выше гипотезе конфигурации. Далее мы проверяем интерфейс API, предоставляемый клиентом конфигурации.
Видно, что это действительно Dalston.SR4, и служба конфигурации может работать нормально.
5.2 Конфигурация динамического обновления
Spring Cloud Config также может реализовать функцию динамического обновления конфигурации. Затем мы изменим конфигурацию cloud.version в репозитории конфигурации на Camden SR7 и применим конфигурацию, обновив конечную точку /refresh клиента конфигурации.
Как вы можете видеть на изображении ниже, результаты соответствуют ожиданиям.
Обновление конфигурации здесь выполняется вручную, и его также можно запустить с помощью github. Когда код отправляется локально в git, вызывается URL-адрес, указанный на следующем рисунке. Можно использовать две конечные точки:
- Refresh: выполнение /refresh в пост-режиме обновит конфигурацию в env.
- перезапуск: если информация о конфигурации была введена в bean-компонент, поскольку bean-компонент является одноэлементным, измененная конфигурация не будет загружена.
Нужно выполнить/перезапустить через метод POST, также нужно настроить endpoints.restart.enabled:true.
Второй случай требует больше времени, т.@RefreshScope
Это аннотация, предоставленная Spring Cloud, и значение переменной в bean-компоненте будет обновлено при выполнении обновления. Взгляните на объяснение исходного кода ниже.
Convenience annotation to put a @Bean definition in RefreshScope.
Beans annotated this way can be refreshed at runtime and any components that are using them will get a new instance on the next method call, fully initialized and injected with all dependencies.
Общая идея выше заключается в том, что RefreshScope — это удобная аннотация компонента, и эта аннотация может обновлять компонент во время выполнения. Другие компоненты, использующие этот компонент, получат новый инициализированный экземпляр объекта при следующем вызове.
Страница настроек github выглядит следующим образом.
6. Резюме
В этой статье в основном рассказывается о процессе создания сервера конфигурации и клиента конфигурации, и, наконец, через журнал клиента конфигурации и информацию о конечной точке, чтобы проверить, можно ли успешно использовать центр обслуживания конфигурации. В общем, очень просто. Некоторые конфигурации в статье написаны не полностью, читатели должны видеть проект git в конце статьи.
Однако в отношении центра конфигурации объяснение в этой статье не является полным.В следующей статье будет объяснено совместное использование сервера конфигурации и шины сообщений для реализации таких функций, как автоматическое обновление и публикация клиента конфигурации в оттенках серого.
Исходный код этой статьи
github: GitHub.com/Доступный ETS2012/S…
gitee: git ee.com/can ets/judgment day you…