Вступ до Netflix Archaius з Spring Cloud

1. Огляд

Netflix Archaius - це потужна бібліотека управління конфігурацією.

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

Крім цього, бібліотека дозволяє властивостям динамічно змінюватися під час виконання, що дозволяє системі отримувати ці варіації без необхідності перезапускати програму.

У цьому вступному посібнику ми налаштуємо просту конфігурацію Spring Cloud Archaius, пояснимо, що відбувається під капотом, і нарешті побачимо, як Spring дозволяє розширити базову настройку.

2. Особливості Netflix Archaius

Як ми знаємо, Spring Boot вже пропонує інструменти для управління екстерналізованими конфігураціями, то чому навіщо турбуватися про налаштування іншого механізму?

Що ж, Archaius пропонує кілька зручних та цікавих функцій, які не передбачені жодною іншою структурою конфігурації . Деякі з його ключових моментів:

  • Динамічні та типізовані властивості
  • Механізм зворотного виклику, який викликається при мутаціях властивостей
  • Готові до використання реалізації динамічних джерел конфігурації, таких як URL-адреси, JDBC та Amazon DynamoDB
  • JMX MBean, до якого можна отримати доступ через Spring Boot Actuator або JConsole для перевірки та керування властивостями
  • Перевірка динамічних властивостей

Ці пільги можуть бути корисними в багатьох сценаріях.

Таким чином, Spring Cloud працював над бібліотекою, яка дозволяє легко налаштувати «міст Spring Environment», щоб Archaius міг читати властивості з Spring Environment.

3. Залежності

Давайте додамо spring-cloud-starter-netflix-archaius до нашого додатку, він додасть всі необхідні залежності до нашого проекту .

За бажанням, ми також можемо додати spring-cloud-netflix до нашого розділу dependencyManagement і покластися на його специфікацію версій артефактів:

  org.springframework.cloud spring-cloud-starter-netflix-archaius      org.springframework.cloud spring-cloud-netflix 2.0.1.RELEASE pom import   

Примітка: ми можемо перевірити Maven Central, щоб переконатися, що ми використовуємо останню версію початкової бібліотеки.

4. Використання

Як тільки ми додамо необхідну залежність, ми зможемо отримати доступ до властивостей, керованих фреймворком :

DynamicStringProperty dynamicProperty = DynamicPropertyFactory.getInstance() .getStringProperty("baeldung.archaius.property", "default value"); String propertyCurrentValue = dynamicProperty.get();

Давайте попрацюємо на короткому прикладі, щоб побачити, як це доступно просто нестандартно.

4.1. Швидкий приклад

За замовчуванням він динамічно управляє всіма властивостями, визначеними у файлі з іменем config.properties у шляху до класу програми .

Тож давайте додамо його до нашої папки ресурсів з деякими довільними властивостями:

#config.properties baeldung.archaius.properties.one=one FROM:config.properties

Тепер нам потрібен спосіб перевірити значення властивостей у будь-який конкретний момент. У цьому випадку ми створимо RestController, який отримує значення як відповідь JSON:

@RestController public class ConfigPropertiesController { private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance() .getStringProperty("baeldung.archaius.properties.one", "not found!"); @GetMapping("/property-from-dynamic-management") public String getPropertyValue() { return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get(); } }

Давайте спробуємо. Ми можемо надіслати запит до цієї кінцевої точки, і служба отримає значення, що зберігаються в config.properties, як очікувалося.

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

Далі ми спробуємо зрозуміти, що відбувається під капотом.

5. Як це працює?

Перш за все, спробуємо зрозуміти загальну картину.

Archaius - це розширення бібліотеки конфігурації Commons Apache, що додає деякі приємні функції, такі як фреймворк опитування для динамічних джерел, з високою пропускною здатністю та безпечною реалізацією.

Потім починає діяти бібліотека spring-cloud-netflix-archaius , яка об’єднує всі різні джерела властивостей та автоматично налаштовує інструменти Archaius з цими джерелами.

5.1. Бібліотека Archaius Netflix

Він працює, визначаючи Складену конфігурацію, сукупність різних конфігурацій, отриманих з різних джерел.

Більше того, деякі з цих джерел конфігурації можуть підтримувати опитування під час виконання змін. Archaius надає інтерфейси та деякі заздалегідь визначені реалізації для налаштування таких типів джерел.

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

Нарешті, ConfigurationManager обробляє загальносистемний контекст конфігурації та розгортання. Він може встановити остаточну композитну конфігурацію або отримати встановлену для модифікації.

5.2. Підтримка Spring Cloud

The main task of the Spring Cloud Archaius library is to merge all the different configuration sources as a ConcurrentCompositeConfiguration and install it using the ConfigurationManager.

The order of precedence in which the library defines the sources is:

  1. Any Apache Common Configuration AbstractConfiguration bean defined in the context
  2. All the sources defined in the Autowired Spring ConfigurableEnvironment
  3. The default Archaius sources, which we saw in the example above
  4. Apache's SystemConfiguration and EnvironmentConfiguration sources

Another useful feature this Spring Cloud library provides is the definition of an Actuator Endpoint to monitor and interact with the properties. Its usage is out of the scope of this tutorial.

6. Adapting and Extending the Archaius Configuration

Now that we have a better understanding of how Archaius works, we are in good shape to analyze how to adapt the configuration to our application, or how to extend the functionality using our configuration sources.

6.1. Archaius Supported Configuration Properties

If we want Archaius to take into account other configuration files similar to the config.properties one, we can define the archaius.configurationSource.additionalUrls system property.

The value is parsed to a list of URLs separated by a comma, so, for example, we can add this system property when we launch the application:

-Darchaius.configurationSource.additionalUrls= "classpath:other-dir/extra.properties, file:///home/user/other-extra.properties"

Archaius will read the config.properties file first, and then the other ones, in the specified order. Because of this, the properties defined in the latter files will have priority over the prior ones.

There are a couple of other system properties we can use to configure various aspects of the Archaius default configuration:

  • archaius.configurationSource.defaultFileName: the default configuration file name in the classpath
  • archaius.fixedDelayPollingScheduler.initialDelayMills: initial delay before reading the configuration source
  • archaius.fixedDelayPollingScheduler.delayMills: delay between two reads of the source; the default value is 1 minute

6.2. Adding Additional Configuration Sources with Spring

How could we add a different Configuration Source to be managed by the described framework? And how could we manage dynamic properties with higher precedence than the ones defined in the Spring Environment?

Reviewing what we mentioned in section 4.2, we can realize that the highest configurations in the Composite Configuration defined by Spring are the AbstractConfiguration beans defined in the context.

Thus, all we need to do is add an implementation of this Apache's abstract class to our Spring Context using some of the functionality provided by Archaius, and the Spring's autoconfiguration will spontaneously add it to the managed configuration properties.

To keep things simple, we'll see an example where we configure a properties file similar to the default config.properties but with the difference of having a higher precedence than the rest of Spring environment and application properties:

@Bean public AbstractConfiguration addApplicationPropertiesSource() { URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL(); PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL); return new DynamicConfiguration(source, new FixedDelayPollingScheduler()); }

Lucky for us, it contemplates several configuration sources that we can set up with almost no effort. Their configuration is out of the scope of this introductory tutorial.

7. Conclusion

Підводячи підсумок, ми дізналися про Архая та деякі цікаві функції, які він пропонує, щоб скористатися перевагами управління конфігурацією.

Крім того, ми побачили, як запускається бібліотека автоконфігурації Spring Cloud, що дозволяє нам зручно використовувати API цієї бібліотеки.

Ще раз ми можемо знайти всі приклади, показані в цьому посібнику та інші, у нашому репозиторії Github.