Skip to main content

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

GitHub Repos

Config Repo

Config Server

Config Client

Comments

Popular posts from this blog

How to use Splunk SPL commands to write better queries - Part I

Introduction As a software engineer, we are quite used to deal with logs in our daily lives, but in addition to ensuring that the necessary logs are being sent by the application itself or through a service mesh, we often have to go a little further and interact with some log tool to extract more meaningful data. This post is inspired by a problem I had to solve for a client who uses Splunk as their main data analysis tool and this is the first in a series of articles where we will delve deeper and learn how to use different Splunk commands. Running Splunk with Docker To run Splunk with docker, just run the following command: docker run -d —rm -p 8000:8000 -e SPLUNK_START_ARGS=--accept-license -e SPLUNK_PASSWORD=SOME_PASSWORD --name splunk splunk/splunk:latest Sample Data We are going to use the sample data provided by Splunk. You can find more information and download the zip file from their web site . How does it work? In order to be able to interact with Splunk t...

How to become a Blockchain developer and write your first Smart Contract

Introduction This is an introductory article to help you understanding the tools and frameworks needed so that you can know from where and how to start creating your own Smart Contracts. In this post I will give you an overview of the tools, frameworks, libraries and languages used to create a Smart Contract in the Ethereum Blockchain . In the second part of this article, we are going to see how to create a Smart Contracts using Solidity and ee are also going to see how to run a Blockchain locally using Ganache , so that you can deploy, interact and test your Smart Contract in your local development environment. According to a definition from the Wikipedia website: A blockchain is a decentralized, distributed, and often public, digital ledger consisting of records called blocks that are used to record transactions across many computers so that any involved block cannot be altered retroactively, without the alteration of all subsequent blocks.. What do you need to know? T...

How to run OPA in Docker

From the introduction of the openpolicyagent.org site: OPA generates policy decisions by evaluating the query input against policies and data. In this post i am going to show you an easy and fast way to test your policies by running OPA in Docker. First, make sure you have already installed Docker and have it running: docker ps Inside your choosen directory, create two files. One called input.json file for your system representation and one file called example.rego for your rego policy rules. Add the following content to your json file: Add the following content for the example.rego: Each violation block represents the rule that you want to validate your system against. The first violation block checks if any of the system servers have the http protocol in it. If that is the case, the server id is added to the array. In the same way, the second violation block checks for the servers that have the telnet protocol in it and if it finds a match the server id is also...