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

Understanding RabbitMQ

Introduction RabbitMQ is a centralized message broker based on the AMQP (Advanced Message Queuing Protocol) protocol, acting as a Middleware between Producers and Consumers of different systems. In a message system, Publishers sends a message to a message broker where messages are consumed some time later by one or more Subscribers. By introducing a message brokeer between systems we are decoupling the sender application from the receiver. In this case the service that is responsible for sending or publishing the message does not need to know about any other service. All it needs to care about is the message and its format. With a message system you send a message to a message broker first and when the consumers or listeners of it become online they can start consuming from the message queue. This means you can keep sending messages without even care if the other application is online or if they had any failures. RabbitMQ Architecture Exchange, queue and bindings are the ...

A Retrospective board to call your own made with React, GraphQL and MongoDB

Introduction I have been working in a project to enable anyone to fork and run a retrospective board in its own server. I have created 2 (two) projects: one for the UI with React and GraphQL using Apollo client and one for the GraphQL server also using Apollo (Server) and MongoDB for the database. In the following sections I am going to walk you through the steps and explain how to run both projects. Main features The board main features: - History of your past iteractions saved in the Mongo database - Easy url link format to quick access any past iteractions - Automatically add action items as last action items in the new board - Quick move items to Action Items Coming next You can fork the React UI from the following GitHub repo: - Support for multiple teams - Authentication - Subscriptions (pub/sub) Code Repo You can fork the React UI from the following GitHub repo: React Retrospective UI You can fork the GraphQL Server from the following GitHub rep...

Simple, quick and easy steps to run an Oracle Database in your development environment using Docker without overloading your machine

Introduction In our development environment, besides being easy and fast to use, above all, we need a lightweight version of it to run locally, right? I have tested different Oracle images and this was the option that best work for me. In this post i will show you how you can run the Oracle Database Express Edition version on your local machine quickly and easily and also how to connect to it using Oracle SQL Developer IDE and SQL*Plus. How to do it Basically we just need two simple steps to get our Oracle database running on our local environment. First we need to login to the Oracle Container Registry so we can pull the image from it and then we just need to run it in a container. You can find more information by going to the Oracle Container Registry , under the "Browse Containers", click into Database and next click in the express Repository for the Oracle Database Express Edition. I am going to skip the docker pull step, because docker run will do it for us ...