Introduction
MicroProfile Config specification defines how configuration values can be picked up by the application. It has the concept of a Configuration source and converters to supply the values you need.
By default, only a ConfigSource for a classpath defined file and environment and system variables are defined.
But since we have the concepts in place, we can create our custom ConfigSource to retrieve the configuration from a central server.
Configuration Server
Instead of putting the configuration of each application within the application itself, we can store it in a central location.
It is very convenient to have an overview of the configuration of all your application at one place. Which makes updating it also very simple.
The first version of the Atbash Configuration Server exposes the configuration of an application through a JAX-RS endpoint.
The URL
/config/{application}
will give you the configuration values as a JSON structure for the specified application.
{ "pets":"dog,cat", "dateValue":"2017-11-15", "value2":"500", "classname":"be.atbash.config.examples.se.testclasses.ConvTestTypeWStringCt", "value1":"Classpath Value", "value3":"true", "dateValueFmt":"16-11-2017,dd-MM-yyyy" }
Creating the Configuration server
The configuration server is available within the directory <server> of the repository https://github.com/atbashEE/atbash-config-server
You can build the server in 3 flavors
1. Java EE war.
With the maven command, mvn package -Pee7-server
a WAR file is created which can be run by any Java EE 7 compliant server (Java 8 required)
2. WildFly Swarm executable JAR
The Configuration server can also be wrapped within a WildFly swarm application with the mvn package -Pwildfly-swarm
command.
3. WebSphere Liberty executable JAR
There is also a profile defined to create a WebSphere Liberty JAR file, use the mvn package -Pliberty
command.
More servers will be supported when they have support for Config Spec 1.2.
Configuration of Server
Define within a config-server.properties or config-sever.yaml file on the classpath the following configuration information.
– rootDirectory: Root directory containing the configuration files for the application. See further for a directory structure.
– applications: List of known applications.
example (as yaml)
rootDirectory : /Users/rubus/atbash/config-server/server/demo applications : ["app1", "app2"]
Possible directory structure
/demo ├── /app1 │ ├── app1.properties │ └── app1-test.properties └── /app2 └── app2.properties
A subdirectory for each application so that the configuration values are nicely separated for each application.
All the features of Atbash config (like stage, yaml support, date support, etc) are available.
Client configuration
A ConfigSource implementation is available which integrates the result of the call to the JAX-RS endpoint into the configuration of the application.
In this first version, Atbash configuration extension is required (which makes it a bit more work) but this requirement will be removed in the next version.
Add the Maven artifact to your dependencies
<dependency> <groupId>be.atbash.config</groupId> <artifactId>atbash-config-client</artifactId> <version>${atbash-config.version}</version> </dependency>
Define the base name of the configuration file which contains the configuration of the Config server.
Create a class implementing the be.atbash.config.spi.BaseConfigurationName interface and defining this class for usage with the ServiceLoader mechanism of Java.
Define the class name within src/main/resources/META-INF/services/be.atbash.config.spi.BaseConfigurationName
be.atbash.config.examples.DemoBaseName
Define the configuration within the specified properties file.
config.server.url=http://localhost:8181 config.server.app=app1 config.server.stage=test
* config.server.url: The _root_ of the Config server endpoint.
* config.server.app: The name of your application
* config.server.stage: (optional) Indication of the stage of the application to retrieve specific values.
We can use all the regular features of Configuration or Atbash config to specify the stage value, like environment or system properties.
The client can be used in a Java SE, Java EE or a MicroProfile environment.
Conclusion
With the Atbash Configuration server, you can store the configuration values for all your applications at a central location. The values can be picked up by a JAX-RS call through the Client ConfigSource.
The server can be run by WildFly Swarm, Liberty or a regular Java EE 7 server. The client can be used for all environments capable of using the MicroProfile Configuration spec (including Java SE and Java EE)
A future version will bring you some more features and makes it easier to set things up.
Have fun.