How to externalize your Spring configuration files for different environments in a distributed system
Introduction
In this post we are going to see how we can create a Spring Configuration Server to externalize our Spring Boot application configuration files.
In order to do that we need one Spring Boot application running as a configuration server, one Spring Boot application running as a configuration client and one external repo like GitHub to keep our configuration yml files.
Config Server
Let´s start by going to the Spring Initializr web site to create a Spring Boot project.
For this project we just need one dependency, the Config Server from Spring Cloud Config as shown in the image below:
This is all you need. You can go ahead and click in generate to download your Spring Boot project.
Next, open your application.yml file and add the code below. We just need to add this configuration to let Spring know where to get our yml configuration files.
Under repos we can add configurations for all the environments we need. I am just adding a section for my development environment. Note the pattern property. It is very simple but very important to understand how it works, since this is how our file in the git repo will be matched against. The project running the configuration client will make a request to the configuration server using the following pattern:
http(s)://host:port/application/environment
This format application/environment must be reflected in your repo in the following way:
application-environment.yml
Since i need the configuration file for the nosqljs application, this is how i have my files in the repo:
This allows us to tell the configuration server how to find for the right files using the pattern:
pattern: 'nosqljs/dev'
Also note that since my configuration files are placed inside the config-repo directory in my GitHub repository i also need to tell configuration server about it, using the searchPaths so that it can look for the files under the right directory:
searchPaths: config-repo
We are now ready to make a get request using our browser to test if our config server is working. If all went well we should be able to make a successful request to the following address and get our configurations under the source property. Config server also show us the full url of our yml file in the GitHub repo:
http://localhost:8080/nosqljs/dev
Let's see next how to create our config client application.
Config Client
For the configuration client we are going to add two dependencies: Config Client and Spring Boot Actuator.
Go to your application.yml file and add the following code:
The import section is to tell config client about the host we have our config server running and the application and profiles are used to build the url in the expected format. So this will create the following request to our configuration server:
http(s)://localhost:8080/nosqljs/dev
Note how we are using the pattern defined in the configuration server: 'nosqljs/dev' to create our request to the config server and repo.
To test that our application is working properly lets create a configuration class under a new package called config. Create a new file called Configuration.java and add the code below:
Lets now add a breakpoint to the line 15 of our Configuration.java file and start our application in debug mode to test if our port property is being set correctly with the values from our file in the GitHub repo.
Conclusion
As you can see, the value of the server port in our configuration file is being set correctly with the value of 7000 for the dev environment.
While you are here, why don't you try to create a production section under repos in our configuration server to test getting the values for its environment.
The nosqljs-prod.yml file is already in the GitHub and you can use my projects as your starting point! Links down there in the GitHub Repos!
Additional Reading
Spring Doc for Spring Cloud Config
Spring Doc for Spring Cloud Config
Comments
Post a Comment