
Централизованный сервер конфигураций для распределённых систем с HTTP API, шифрованием/дешифрованием свойств и поддержкой бэкендов Git, Vault, JDBC и локальной файловой системы.
//// НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ОН БЫЛ СОЗДАН АВТОМАТИЧЕСКИ. Ручные изменения этого файла будут потеряны при его повторной генерации. Вместо этого редактируйте файлы в каталоге src/main/asciidoc/. ////
image::https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master"] image::https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master"] image::https://api.codacy.com/project/badge/Grade/f064024a072c477e97dca6ed5a70fccd?branch=master["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-config?branch=master&utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-config&utm_campaign=Badge_Grade"]
Spring Cloud Config обеспечивает поддержку на стороне сервера и клиента для внешней конфигурации в распределённой системе. С Config Server вы получаете централизованное место для управления внешними свойствами приложений во всех средах.
Концепции как на клиенте, так и на сервере полностью соответствуют абстракциям Spring Environment и PropertySource, поэтому они отлично подходят для приложений Spring, но могут использоваться с любым приложением, работающим на любом языке.
По мере продвижения приложения по конвейеру развёртывания от разработки к тестированию и к производству вы можете управлять конфигурацией между этими средами и быть уверенными, что приложения имеют всё необходимое для работы при миграции.
Реализация серверного хранилища по умолчанию использует git, поэтому она легко поддерживает версионированные конфигурационные среды, а также доступна для широкого спектра инструментов управления содержимым.
Легко добавить альтернативные реализации и подключить их с помощью конфигурации Spring.
== Возможности
=== Spring Cloud Config Server
Spring Cloud Config Server предлагает следующие преимущества:
@EnableConfigServer=== Spring Cloud Config Client
Специально для приложений Spring Spring Cloud Config Client позволяет:
Environment удалёнными источниками свойств.@RefreshScope для Spring @Beans, которые нужно переинициализировать при изменении конфигурации./env для обновления Environment и перепривязки @ConfigurationProperties и уровней логирования.
** /refresh для обновления bean-компонентов с @RefreshScope.
** /restart для перезапуска контекста Spring (отключено по умолчанию).
** /pause и /resume для вызова методов Lifecycle (stop() и в ).== Быстрый старт
В этом кратком руководстве рассматривается использование как сервера, так и клиента Spring Cloud Config Server.
Сначала запустите сервер, как показано ниже:
Сервер — это приложение Spring Boot, поэтому при желании вы можете запустить его из своей IDE (главный класс — ConfigServerApplication).
Затем попробуйте клиент, как показано ниже:
Стратегия по умолчанию для поиска источников свойств заключается в клонировании git-репозитория (по адресу spring.cloud.config.server.git.uri) и использовании его для инициализации мини-приложения SpringApplication.
Environment мини-приложения используется для перечисления источников свойств и публикации их в виде JSON-конечной точки.
HTTP-сервис предоставляет ресурсы в следующем виде:
где application внедряется как spring.config.name в SpringApplication (обычно это application в обычном приложении Spring Boot), profile — это активный профиль (или список свойств, разделённых запятыми), а label — необязательная метка git (по умолчанию master).
Spring Cloud Config Server получает конфигурацию для удалённых клиентов из различных источников. В следующем примере показано получение конфигурации из git-репозитория (который должен быть предоставлен), как показано ниже:
Другими источниками являются любая база данных, совместимая с JDBC, Subversion, Hashicorp Vault, Credhub и локальные файловые системы.
=== Использование на стороне клиента
Чтобы использовать эти функции в приложении, вы можете построить его как приложение Spring Boot, зависящее от spring-cloud-config-client (пример см. в тестовых случаях config-client или в образце приложения).
Самый удобный способ добавить зависимость — использовать стартер Spring Boot org.springframework.cloud:spring-cloud-starter-config.
Также существует родительский pom и BOM (spring-cloud-starter-parent) для пользователей Maven и файл управления версиями Spring IO для Gradle и Spring CLI. В следующем примере показана типичная конфигурация Maven:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>{spring-boot-docs-version}</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>{spring-cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- repositories also needed for snapshots and milestones -->
Теперь вы можете создать стандартное приложение Spring Boot, например, следующий HTTP-сервер:
@SpringBootApplication @RestController public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
Когда этот HTTP-сервер запускается, он получает внешнюю конфигурацию из локального сервера конфигурации по умолчанию (если он запущен) на порту 8888.
Чтобы изменить поведение при запуске, вы можете изменить местоположение сервера конфигурации с помощью bootstrap.properties (аналогично application.properties, но для фазы начальной загрузки контекста приложения), как показано в следующем примере:
По умолчанию, если имя приложения не задано, будет использоваться application. Чтобы изменить имя, добавьте следующее свойство в файл bootstrap.properties:
ПРИМЕЧАНИЕ: При установке свойства ${spring.application.name} не добавляйте к имени приложения зарезервированное слово application-, чтобы избежать проблем с разрешением правильного источника свойств.
Свойства начальной загрузки отображаются в конечной точке /env как источник свойств с высоким приоритетом, как показано в следующем примере.
Источник свойств с именем ```configService:<URL удалённого репозитория>/<имя файла>содержит свойствоfooсо значениемbar` и имеет наивысший приоритет.
ПРИМЕЧАНИЕ: URL в имени источника свойств — это git-репозиторий, а не URL сервера конфигурации.
=== Пример приложения
Вы можете найти пример приложения https://github.com/spring-cloud/spring-cloud-config/tree/master/spring-cloud-config-sample[здесь].
Это приложение Spring Boot, поэтому вы можете запустить его, используя обычные механизмы (например, mvn spring-boot:run).
При запуске оно ищет сервер конфигурации на http://localhost:8888 (настраиваемое значение по умолчанию), так что вы также можете запустить сервер, чтобы увидеть их совместную работу.
В примере есть тестовый случай, когда сервер конфигурации также запускается в той же JVM (на другом порту), и тест проверяет наличие свойства окружения из git-репозитория конфигурации.
Чтобы изменить местоположение сервера конфигурации, вы можете установить spring.cloud.config.uri в bootstrap.yml (или в системных свойствах и других местах).
В тестовом случае есть метод main(), который запускает сервер таким же образом (следите за портом в логах), так что вы можете запустить всю систему в одном процессе и поиграться с ней (например, запустить метод main() в вашей IDE).
Метод main() использует target/config в качестве рабочего каталога git-репозитория, так что вы можете вносить локальные изменения там и видеть их отражение в работающем приложении. В следующем примере показан сеанс работы с тестовым случаем:
Конечная точка refresh сообщает, что свойство "sample" изменилось.
== Сборка
:jdkversion: 1.7
=== Базовая компиляция и тестирование
Для сборки исходного кода вам потребуется установить JDK {jdkversion}.
Spring Cloud использует Maven для большинства действий, связанных со сборкой, и вы должны быстро освоиться, клонировав интересующий вас проект и выполнив команду
ПРИМЕЧАНИЕ: Вы также можете установить Maven (>=3.3.3) самостоятельно и запускать команду mvn
вместо ./mvnw в примерах ниже. Если вы это сделаете, вам также может
понадобиться добавить -P spring, если ваши локальные настройки Maven не
содержат объявлений репозиториев для предварительных артефактов Spring.
ПРИМЕЧАНИЕ: Имейте в виду, что вам может потребоваться увеличить объём памяти,
доступной для Maven, установив переменную окружения MAVEN_OPTS со
значением, например, -Xmx512m -XX:MaxPermSize=128m. Мы стараемся учесть это в
конфигурации .mvn, поэтому если вам приходится делать это для успешной
сборки, пожалуйста, создайте тикет, чтобы добавить настройки в систему контроля версий.
Подсказки по сборке проекта можно найти в .travis.yml, если он
есть. Там должна быть команда "script" и, возможно, "install". Также
посмотрите раздел "services", чтобы узнать, нужно ли запускать какие-либо службы локально
(например, mongo или rabbit). Игнорируйте части, связанные с git, которые
вы можете найти в "before_install", поскольку они относятся к настройке учётных данных git,
а они у вас уже есть.
Проекты, требующие промежуточного ПО, обычно включают
docker-compose.yml, поэтому рассмотрите возможность использования
https://docs.docker.com/compose/[Docker Compose] для запуска серверов промежуточного ПО
в контейнерах Docker. См. README в
https://github.com/spring-cloud-samples/scripts[репозитории демонстрационных скриптов]
для конкретных инструкций по типичным случаям mongo,
rabbit и redis.
ПРИМЕЧАНИЕ: Если ничего не помогает, выполняйте сборку командой из .travis.yml (обычно
./mvnw install).
=== Документация
Модуль spring-cloud-build имеет профиль "docs", и если вы его
включите, он попытается собрать источники asciidoc из
src/main/asciidoc. В процессе он будет искать
README.adoc и обработает его, загрузив все включения, но не
анализируя и не отображая их, а просто скопирует в ${main.basedir}
(по умолчанию ${basedir}, т.е. корень проекта). Если в README
есть изменения, они будут отображены после сборки Maven как
изменённый файл в нужном месте. Просто зафиксируйте и отправьте изменения.
=== Работа с кодом Если у вас нет предпочтений по IDE, мы рекомендуем использовать https://www.springsource.com/developer/sts[Spring Tools Suite] или https://eclipse.org[Eclipse] при работе с кодом. Мы используем плагин eclipse https://eclipse.org/m2e/[m2eclipse] для поддержки Maven. Другие IDE и инструменты также должны работать без проблем, если они используют Maven 3.3.3 или новее.
==== Импорт в eclipse с m2eclipse Мы рекомендуем плагин eclipse https://eclipse.org/m2e/[m2eclipse] при работе с eclipse. Если у вас ещё не установлен m2eclipse, его можно найти на "eclipse marketplace".
ПРИМЕЧАНИЕ: Старые версии m2e не поддерживают Maven 3.3, поэтому после
импорта проектов в Eclipse вам также потребуется указать
m2eclipse использовать правильный профиль для проектов. Если вы
видите много разных ошибок, связанных с POM в проектах, проверьте,
что у вас установлена актуальная версия. Если вы не можете обновить m2e,
добавьте профиль "spring" в ваш settings.xml. Альтернативно вы можете
скопировать настройки репозитория из профиля "spring" родительского
pom в ваш settings.xml.
==== Импорт в eclipse без m2eclipse Если вы предпочитаете не использовать m2eclipse, вы можете сгенерировать метаданные проекта eclipse с помощью следующей команды:
$ ./mvnw eclipse:eclipse
Сгенерированные проекты eclipse можно импортировать, выбрав import existing projects
из меню file.
=== JCE
Если вы получаете исключение из-за "Illegal key size" и используете JDK от Sun, вам необходимо установить файлы политики юрисдикции неограниченной силы Java Cryptography Extension (JCE). Дополнительную информацию см. по следующим ссылкам:
https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html[Java 6 JCE]
https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html[Java 7 JCE]
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java 8 JCE]
Извлеките файлы JCE в папку JDK/jre/lib/security для версии JRE/JDK x64/x86, которую вы используете.
== Участие в разработке
:spring-cloud-build-branch: master
Spring Cloud распространяется под неограничительной лицензией Apache 2.0 и следует стандартному процессу разработки Github, используя Github трекер для задач и слияние пул-реквестов в master. Если вы хотите внести даже что-то тривиальное, пожалуйста, не стесняйтесь, но следуйте приведённым ниже рекомендациям.
=== Подписание лицензионного соглашения участника Прежде чем мы примем нетривиальный патч или пул-реквест, нам потребуется, чтобы вы подписали https://cla.pivotal.io/sign/spring[Contributor License Agreement (Лицензионное соглашение участника)]. Подписание соглашения участника не предоставляет никому прав на коммиты в основной репозиторий, но это означает, что мы можем принять ваши изменения, и вы получите авторский кредит, если мы это сделаем. Активным участникам может быть предложено присоединиться к основной команде и получить возможность сливать пул-реквесты.
=== Кодекс поведения Этот проект придерживается https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc[Кодекса поведения] Contributor Covenant. Участвуя, вы обязуетесь соблюдать этот кодекс. Пожалуйста, сообщайте о неприемлемом поведении по адресу [email protected].
=== Соглашения о коде и ведение домашнего хозяйства Ни одно из этих требований не является обязательным для пул-реквеста, но они помогут. Они также могут быть добавлены после исходного пул-реквеста, но до слияния.
eclipse-code-formatter.xml из
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[проекта Spring
Cloud Build]. Если вы используете IntelliJ, вы можете использовать
https://plugins.jetbrains.com/plugin/6546[Плагин Eclipse Code Formatter
Plugin] для импорта того же файла..java содержат простой комментарий Javadoc класса с как минимум
тегом @author, идентифицирующим вас, и желательно хотя бы абзац о том, для чего предназначен класс..java (скопируйте из существующих файлов
в проекте).@author в файлы .java, которые вы существенно изменяете (более
чем косметические изменения).Fixes gh-XXXX в конце сообщения
коммита (где XXXX — номер задачи).=== Checkstyle
Spring Cloud Build поставляется с набором правил checkstyle. Вы можете найти их в модуле spring-cloud-build-tools. Самые заметные файлы в модуле:
<1> Правила Checkstyle по умолчанию <2> Настройка заголовка файла <3> Правила подавления по умолчанию
==== Конфигурация Checkstyle
Правила Checkstyle отключены по умолчанию. Чтобы добавить checkstyle в ваш проект, просто определите следующие свойства и плагины.
<reporting>
<plugins>
<plugin> <5>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
</plugins>
</reporting>
${project.root}/src/checkstyle/checkstyle-suppressions.xml с вашими подавлениями. Пример:.projectRoot/src/checkstyle/checkstyle-suppresions.xmlРекомендуется скопировать ${spring-cloud-build.rootFolder}/.editorconfig и ${spring-cloud-build.rootFolder}/.springformat в ваш проект. Таким образом будут применены некоторые правила форматирования по умолчанию. Вы можете сделать это, запустив этот скрипт:```bash
$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
$ touch .springformat
=== IDE setup
==== Intellij IDEA
Для настройки Intellij необходимо импортировать наши соглашения по оформлению кода, профили инспекций и настроить плагин checkstyle.
Следующие файлы можно найти в проекте https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools[Spring Cloud Build].
.spring-cloud-build-tools/
----
└── src
├── checkstyle
│ └── checkstyle-suppressions.xml <3>
└── main
└── resources
├── checkstyle-header.txt <2>
├── checkstyle.xml <1>
└── intellij
├── Intellij_Project_Defaults.xml <4>
└── Intellij_Spring_Boot_Java_Conventions.xml <5>
----
<1> Правила Checkstyle по умолчанию
<2> Настройка заголовка файла
<3> Правила подавления по умолчанию
<4> Настройки проекта для Intellij, применяющие большинство правил Checkstyle
<5> Стилевые соглашения для Intellij, применяющие большинство правил Checkstyle
.Code style
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-code-style.png[Code style]
Перейдите в `File` -> `Settings` -> `Editor` -> `Code style`. Там нажмите на значок рядом с разделом `Scheme`. Затем выберите `Import Scheme` и укажите опцию `Intellij IDEA code style XML`. Импортируйте файл `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml`.
.Inspection profiles
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-inspections.png[Code style]
Перейдите в `File` -> `Settings` -> `Editor` -> `Inspections`. Там нажмите на значок рядом с разделом `Profile`. Затем выберите `Import Profile` и импортируйте файл `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml`.
.Checkstyle
Чтобы Intellij работал с Checkstyle, необходимо установить плагин `Checkstyle`. Также рекомендуется установить `Assertions2Assertj` для автоматического преобразования утверждений JUnit
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-checkstyle.png[Checkstyle]
Перейдите в `File` -> `Settings` -> `Other settings` -> `Checkstyle`. Там нажмите на значок `+` в разделе `Configuration file`. Затем нужно указать, откуда брать правила checkstyle. На изображении выше мы выбрали правила из клонированного репозитория Spring Cloud Build. Однако вы можете указать репозиторий Spring Cloud Build на GitHub (например, для `checkstyle.xml` : `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml`). Необходимо предоставить следующие переменные:
- `checkstyle.header.file` – укажите путь к файлу `spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` проекта Spring Cloud Build либо в вашем клонированном репозитории, либо через URL `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt`.
- `checkstyle.suppressions.file` – подавления по умолчанию. Укажите путь к файлу `spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` проекта Spring Cloud Build либо в клонированном репозитории, либо через URL `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml`.
- `checkstyle.additional.suppressions.file` – эта переменная соответствует подавлениям в вашем локальном проекте. Например, вы работаете над `spring-cloud-contract`. Тогда укажите путь к папке `project-root/src/checkstyle/checkstyle-suppressions.xml`. Пример для `spring-cloud-contract`: `/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`.
ВАЖНО: Не забудьте установить `Scan Scope` в `All sources`, так как мы применяем правила checkstyle для производственного и тестового кода.
start()ApplicationContext