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

Для небольших приложений, которые я создавал во время моего учебного курса по программированию, мне было легко делать такие вещи, как URL-адреса жесткого кода, чтобы мое внешнее приложение могло взаимодействовать со своим внутренним аналогом и базой данных. У меня было только две среды: моя локальная разработка на моем ноутбуке и моя производственная среда AWS, в которой я разместил свой портфель проектов, и это был довольно простой, хотя и полностью ручной процесс (с небольшим количеством проб и ошибок), чтобы получить части. головоломки связаны.

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

Я упоминал, что в процессе разработки, управляемого тестированием (TDD), Agile у нас также есть четыре разных среды разработки, прежде чем новая функция попадет в рабочую среду? Ага: локальное пространство разработки, пространство QA, пространство Q1, пространство приемки и, наконец, наше производственное пространство.

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

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

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

«Обеспечить серверную и клиентскую поддержку для внешней конфигурации в распределенной системе. С помощью Config Server у вас есть центральное место для управления внешними свойствами приложений во всех средах ».

- Spring Cloud Config

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

Первый конфигурационный сервер, с которым я познакомился, - это сервер Spring Cloud Config, поскольку моя команда отвечает за полнофункциональное приложение, состоящее из множества внутренних микросервисов Java Spring Boot и клиентской службы узла JavaScript.

Настройка вашего сервера конфигурации

На самом деле настроить сервер конфигурации очень просто; Для начала вы можете просто перейти на сайт Spring Initializr, добавить Сервер конфигурации в качестве зависимости к проекту и нажать кнопку Создать проект. Я также добавлю, что, по крайней мере, в то время, когда я пишу это, Spring Cloud Config Server несовместим с Spring Boot версии 2 (я обнаружил это на собственном горьком опыте), поэтому выберите самый высокий снимок Spring Boot версии 1 вы можете.

После того, как вы загрузили проект и открыли его в выбранной вами среде IDE (моя - IntelliJ), вы можете сразу перейти к основному файлу приложения, добавить аннотации @EnableConfigServer и @SpringBootApplication, и вы почти готовы к работе.

Ниже приведен мой фактический файл основного метода, правда, это все, что ему нужно.

package com.myExampleConfigServer; 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer; 
@EnableConfigServer
@SpringBootApplication
public class MyExampleConfigServerApplication {  
  public static void main(String[] args) {
    SpringApplication.run(MyExampleConfigServerApplication.class,  args); 
    }
}

Другой файл, который вам нужно будет настроить, - это ваш application.yml файл в папке ресурсов. В этом файле вы настраиваете доступ своего облачного сервера конфигурации к Github (и к файлам Github, которые он будет использовать для предоставления конфигурации приложения).

Как видите, есть место для вашего URL-адреса Github (к которому я вернусь через минуту), имени пользователя и пароля. Поскольку наши приложения размещены на Pivotal Cloud Foundry, мы используем то, что они называют сервисами VCAP (это сокращение от VMWare Cloud Application Platform). Это причудливый способ обозначить службу, в которой хранятся переменные среды, к которой могут получить доступ только люди (и приложения), имеющие доступ к этому пространству в PCF - это позволяет нам размещать конфиденциальную информацию, такую ​​как учетные записи служб и пароли, где-то помимо Github, где доступны учетные данные. для сервера конфигурации, но недоступен для всех без авторизации.

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

server:  
  port:
    8888
spring:  
  application:    
    name: myexample-config-server  
cloud:    
  config:      
    server:        
      git:          
        uri: ${vcap.services.config-service.credentials.url}
        username: ${vcap.services.config-service.credentials.user}          
        password: ${vcap.services.config-service.credentials.token}

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

Итак, теперь у вас есть сервер конфигурации. Отлично, теперь пора настроить свойства вашего сервера конфигурации - файлы, к которым сервер конфигурации будет иметь доступ, чтобы вытащить переменные среды в ваш проект.

Настройка свойств вашего сервера конфигурации

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

[application name]-[life cycle profile].yml
ex. my-app-to-config-QA.yml

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

configurations:
  featureToggleFlag: true
  my-custom-flag: false
  sampleCronJob: "0 0 1 * * *"
  sampleUrl: http://google.com

Зафиксируйте это в репозитории Github, скопируйте этот URL репо и поместите его в URI сервера Cloud Config в application.yml вашего сервера конфигурации. Теперь сервер знает, где искать в Github файлы конфигурации, которые вы хотите использовать.

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

Подключение приложения Spring Boot к серверу Config

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

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

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version:'1.3.3.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: "${springBootVersion}"

Затем вы создадите bootstrap.yml файл, который будет находиться вместе с вашим application.yml файлом в вашей src/main/resources папке и будет содержать информацию, указывающую на расположение сервера конфигурации, где бы он ни размещался. Это будет выглядеть примерно так:

spring:
  application:
    name: ##APPLICATION NAME GOES HERE##
  cloud:
    config:
      uri: https://myexample-config-server.non-prod.com
---
spring:
  profiles: production
  cloud:
    config:
      uri:  https://myexample-config-server.prod.com

Затем вы перейдете к тем файлам, которые действительно нуждаются в свойствах конфигурации, и добавите аннотации @Configuration и @ConfigurationProperties(prefix=”configurations") (или как вы назвали свои свойства конфигурации в свойствах конфигурации YAML).

Вот пример.

Если вы заметили, свойства имеют префикс configurations. Чтобы привязать эти свойства к классу ConfigProperties, вам сначала нужно добавить «префикс» к аннотации @ConfigurationProperties, например, так.

@Configuration
@ConfigurationProperties(prefix = "configurations")
public class ConfigProperties {
    
}

Чтобы привязать свойство featureToggleFlag, добавьте следующую переменную-член. вместе с геттером и сеттером. Или используйте @NoArgsConstructor Lombok и пропустите геттеры и сеттеры, на ваш выбор.

@Configuration
@ConfigurationProperties(prefix = "configurations")
public class ConfigProperties {
   private boolean featureToggleFlag;
   
   //Add Getter and Setter here if desired...
    
}

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

Последнее, что вы должны сделать перед запуском службы, - это убедиться, что вы установили SPRING_PROFILES_ACTIVE в правильную среду свойств конфигурации. Текущие значения: «QA» для среды QA, «Q1» для среды Q1, «prod» для производственной среды и т. Д. Имейте в виду, что эти значения чувствительны к регистру, поэтому, как бы вы ни назвали их в своем файле свойств конфигурации, они должны быть точно такими же в переменной Active Profiles.

В IntelliJ это можно сделать, щелкнув свойство «Изменить конфигурации» при настройке проекта Spring Boot для запуска и добавив правильное значение в поле «Активные профили» в середине модального окна конфигурации.

Вот и все. Теперь, когда вы запускаете службу Spring Boot, вы должны увидеть, что профиль Spring установлен в журналах, и, конечно, вы также можете добавить несколько сообщений System.out.println, чтобы вы знали, успешно ли он достиг сервера конфигурации и приобрел свойства тебе нужно.

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

Заключение и часть вторая: сервер конфигурации и узел

Но как сделать то же самое с проектом узла JavaScript? Можете ли вы использовать тот же сервер конфигурации Spring Boot? Или вам нужно настроить отдельный сервер конфигурации узла?

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

Спасибо за чтение, мы очень ценим аплодисменты!

Если вам понравилось это читать, возможно, вам понравятся и другие мои блоги:

Ссылки и дополнительные ресурсы: