Files

144 lines
6.1 KiB
Plaintext

[[spring-cloud-zookeeper-config]]
= Distributed Configuration with Zookeeper
Zookeeper provides a
https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_dataModelNameSpace[hierarchical namespace]
that lets clients store arbitrary data, such as configuration data. Spring Cloud Zookeeper
Config is an alternative to the
https://github.com/spring-cloud/spring-cloud-config[Config Server and Client].
Configuration is loaded into the Spring Environment during the special "`bootstrap`"
phase. Configuration is stored in the `/config` namespace by default. Multiple
`PropertySource` instances are created, based on the application's name and the active
profiles, to mimic the Spring Cloud Config order of resolving properties. For example, an
application with a name of `testApp` and with the `dev` profile has the following property
sources created for it:
* `config/testApp,dev`
* `config/testApp`
* `config/application,dev`
* `config/application`
The most specific property source is at the top, with the least specific at the bottom.
Properties in the `config/application` namespace apply to all applications that use
zookeeper for configuration. Properties in the `config/testApp` namespace are available
only to the instances of the service named `testApp`.
Configuration is currently read on startup of the application. Sending a HTTP `POST`
request to `/refresh` causes the configuration to be reloaded. Watching the configuration
namespace (which Zookeeper supports) is also available.
[[activating]]
== Activating
Including a dependency on
`org.springframework.cloud:spring-cloud-starter-zookeeper-config` enables
autoconfiguration that sets up Spring Cloud Zookeeper Config.
CAUTION: When working with version 3.4 of Zookeeper you need to change
the way you include the dependency as described xref:install.adoc[here].
[[config-data-import]]
== Spring Boot Config Data Import
Spring Boot 2.4 introduced a new way to import configuration data via the `spring.config.import` property. This is now the default way to get configuration from Zookeeper.
To optionally connect to Zookeeper for configuration set the following in application.properties:
.application.properties
[source,properties]
----
spring.config.import=optional:zookeeper:
----
This will connect to Zookeeper at the default location of "localhost:2181". Removing the `optional:` prefix will cause Zookeeper Config to fail if it is unable to connect to Zookeeper. To change the connection properties of Zookeeper Config either set `spring.cloud.zookeeper.connect-string` or add the connect string to the `spring.config.import` statement such as, `spring.config.import=optional:zookeeper:myhost:2818`. The location in the import property has precedence over the `connect-string` property.
Zookeeper Config will try to load values from four automatic contexts based on `spring.cloud.zookeeper.config.name` (which defaults to the value of the `spring.application.name` property) and `spring.cloud.zookeeper.config.default-context` (which defaults to `application`). If you want to specify the contexts rather than using the computed ones, you can add that information to the `spring.config.import` statement.
.application.properties
[source,properties]
----
spring.config.import=optional:zookeeper:myhost:2181/contextone;/context/two
----
This will optionally load configuration only from `/contextone` and `/context/two`.
NOTE: A `bootstrap` file (properties or yaml) is *not* needed for the Spring Boot Config Data method of import via `spring.config.import`.
[[customizing]]
== Customizing
Zookeeper Config may be customized by setting the following properties:
[source,yml,indent=0]
----
spring:
cloud:
zookeeper:
config:
enabled: true
root: configuration
defaultContext: apps
profileSeparator: '::'
----
* `enabled`: Setting this value to `false` disables Zookeeper Config.
* `root`: Sets the base namespace for configuration values.
* `defaultContext`: Sets the name used by all applications.
* `profileSeparator`: Sets the value of the separator used to separate the profile name in
property sources with profiles.
CAUTION: If you have set `spring.cloud.bootstrap.enabled=true` or `spring.config.use-legacy-processing=true`, or included `spring-cloud-starter-bootstrap`, then the above values will need to be placed in `bootstrap.yml` instead of `application.yml`.
[[access-control-lists-acls]]
== Access Control Lists (ACLs)
You can add authentication information for Zookeeper ACLs by calling the `addAuthInfo`
method of a `CuratorFramework` bean. One way to accomplish this is to provide your own
`CuratorFramework` bean, as shown in the following example:
[source,java,indent=0]
----
@BoostrapConfiguration
public class CustomCuratorFrameworkConfig {
@Bean
public CuratorFramework curatorFramework() {
CuratorFramework curator = new CuratorFramework();
curator.addAuthInfo("digest", "user:password".getBytes());
return curator;
}
}
----
Consult
https://github.com/spring-cloud/spring-cloud-zookeeper/blob/main/spring-cloud-zookeeper-core/src/main/java/org/springframework/cloud/zookeeper/ZookeeperAutoConfiguration.java[the ZookeeperAutoConfiguration class]
to see how the `CuratorFramework` bean's default configuration.
Alternatively, you can add your credentials from a class that depends on the existing
`CuratorFramework` bean, as shown in the following example:
[source,java,indent=0]
----
@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {
public ZookeeperConfig(CuratorFramework curator) {
curator.addAuthInfo("digest", "user:password".getBytes());
}
}
----
The creation of this bean must occur during the boostrapping phase. You can register
configuration classes to run during this phase by annotating them with
`@BootstrapConfiguration` and including them in a comma-separated list that you set as the
value of the `org.springframework.cloud.bootstrap.BootstrapConfiguration` property in the
`resources/META-INF/spring.factories` file, as shown in the following example:
.resources/META-INF/spring.factories
----
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig
----