A Beginner’s Guide to Centralized Configuration with Spring Cloud Config

Alexander Obregon
9 min readSep 29, 2023

--

Image Source

Introduction

In the modern microservices world, handling configuration for different environments and services can be a daunting task. Centralized configuration is an approach to manage the configuration for all environments and services from a central location. Spring Cloud Config provides tooling for centralized external configuration management backed by various types of external repositories like Git, Subversion, or file system.

Introduction to Centralized Configuration

In the landscape of microservices, managing configurations and ensuring they are consistent and easily accessible is a significant challenge. Centralized configuration emerges as a solution to these challenges, providing a streamlined, unified, and efficient approach to handling configurations across various services and environments. It eliminates the hassle of managing configurations for each microservice individually and offers a single source of truth for all configurations, enhancing the manageability and consistency across the microservices ecosystem.

Why Centralized Configuration?

Consistency

One of the most compelling advantages of centralized configuration is the consistency it brings to the system. In a microservices architecture, where multiple services are working together, ensuring uniform configuration across all services is paramount. Centralized configuration management with tools like Spring Cloud Config assures that all services have access to the same configuration information, eliminating discrepancies and inconsistencies and ensuring that all parts of the system are in harmony.

Ease of Management

Another significant benefit is the ease of management. As systems grow and evolve, keeping track of configurations for each service can become a daunting task. The centralized approach simplifies this by providing a single platform for managing all configurations, saving time and resources and reducing the possibility of errors and conflicts.

Improved Security

Security is a primary concern in configuration management. Handling sensitive data and ensuring it is only accessible to authorized services is crucial. Centralized configuration systems often come with robust security features that protect configuration data, manage access controls, and ensure the integrity and confidentiality of configuration information.

Enhanced Auditability

Centralized configuration enables better auditability. It allows administrators to easily monitor and track changes to the configuration, ensuring transparency and enabling quick identification and resolution of issues.

The Role of Spring Cloud Config

In this panorama, Spring Cloud Config shines as an effective tool for centralized configuration management in a microservices architecture. It provides a server and client-side support for externalized configuration in a distributed system. With Spring Cloud Config, configurations are accessible across various services, ensuring consistency, security, and ease of access.

By storing configurations in a central server that can be version-controlled and access-managed, Spring Cloud Config ensures that applications have fast and reliable access to their configuration regardless of where they are deployed within a distributed system. This setup allows for dynamic refresh and update of configurations without the need to restart services, enhancing the flexibility and responsiveness of the system.

Configuration Sources and Formats

Spring Cloud Config supports various formats for configuration data, including property files, YAML files, and more, offering flexibility in how configuration data is written and managed. It supports various back-end systems for storing configuration data, including git repositories, which means configuration data can be version-controlled, audited, and managed just like source code.

The Road Ahead

Understanding and adopting centralized configuration management with Spring Cloud Config is a step towards a more manageable, consistent, and reliable microservices architecture. The initial setup and migration effort is compensated by the long-term benefits of having a streamlined, secure, and efficient system for managing configurations across various services and environments.

The road ahead in the world of microservices is filled with the challenge of managing growing complexity as systems expand and evolve. Centralized configuration management, with its consistency, security, and efficiency, stands as a beacon of reliability and manageability in this journey.

In the sections to follow, we will delve deeper into how to set up and use Spring Cloud Config for centralized configuration management, ensuring your microservices architecture is robust, reliable, and ready for the challenges of modern software development and deployment environments.

Setting Up Spring Cloud Config Server

Setting up a Spring Cloud Config Server is straightforward and can be completed in a few steps. Below, a more detailed process is outlined for those starting from scratch with Spring Cloud Config. The server will act as a centralized platform where all configurations for the various microservices and environments are stored and managed.

Pre-Requisites

Before starting, ensure you have the following installed:

  • Java Development Kit (JDK 8 or above)
  • Apache Maven (or any build tool you are comfortable with)
  • An Integrated Development Environment (IDE) like Eclipse or IntelliJ IDEA

Step 1: Creating a Spring Boot Project

Begin by creating a new Spring Boot project using Spring Initializer or your preferred IDE.

In Spring Initializer:

  • Go to the Spring Initializer website.
  • Choose the desired Project Metadata.
  • Add the Config Server dependency.
  • Click on “Generate” to download the project as a zip file.

After downloading, import the project into your preferred IDE.

Step 2: Adding Necessary Dependencies

In the pom.xml file of the project, add the Spring Cloud Config Server dependency. If it was not added in the Initializer, your dependency section would look something like this:

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>

Step 3: Configuring the Application

In the src/main/resources folder, create or edit the application.yml file to configure the Spring Cloud Config Server.

server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/your-repository/config-repo

In this configuration:

  • The server is set to run on port 8888.
  • The spring.cloud.config.server.git.uri property is where the address of the git repository containing the configuration files is placed.

Step 4: Enabling the Config Server

Open the main class of the application and annotate it with @EnableConfigServer. This annotation tells Spring Boot to enable the Config Server functionality for the application.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}

Step 5: Running the Server

To run the server, execute the main method in the ConfigServer class from your IDE, or build the project and run the resulting jar file.

$ mvn clean install
$ java -jar target/config-server-0.0.1-SNAPSHOT.jar

After executing these commands, your Spring Cloud Config Server will start, and it will be ready to manage the configurations for different microservices.

Verifying the Setup

To ensure that your Config Server is running, open a web browser and navigate to http://localhost:8888. If everything is set up correctly, you will not see any errors, and the server will be ready to serve configuration files from the configured Git repository.

Troubleshooting

If you encounter any issues while setting up the server:

  • Verify that the Git repository URL in the application.yml is correct and accessible.
  • Ensure that the @EnableConfigServer annotation is added to the main class.
  • Check that all dependencies are correctly added in the pom.xml file.

By following these steps, your Spring Cloud Config Server should be up and running, ready to centralize and manage the configurations of various microservices efficiently and reliably, laying the groundwork for a scalable and maintainable microservices architecture.

Connecting a Client Application to the Config Server

Connecting a client application to the Spring Cloud Config Server is crucial to ensure that the application can access the centralized configuration and refresh its configuration without needing a restart. The following steps offer a clear, concise guide on how to establish this connection.

Step 1: Setting Up Client Application

Start by setting up a Spring Boot client application. Like before, you can use the Spring Initializer to generate a basic project structure. Add the Spring Cloud Starter Config as a dependency or you can add it manually to your pom.xml file.

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>

This dependency is essential for integrating the client application with the Spring Cloud Config Server.

Step 2: Configuring the Client Application

Create or edit the bootstrap.yml (or bootstrap.properties) file in the src/main/resources directory of your client application. The bootstrap.yml file is used by Spring Cloud applications during startup to configure various settings.

In this file, specify the name of the application and the URI of the Config Server:

spring:
application:
name: client-app
cloud:
config:
uri: http://localhost:8888

Here:

  • spring.application.name is used by the Config Server to identify the application and provide the appropriate configuration.
  • spring.cloud.config.uri is used to specify the address of the Config Server.

Step 3: Consuming Configuration from Config Server

In your client application, you can now access the configurations stored in the Config Server by using the @Value annotation to inject configuration properties. For example:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigClientController {

@Value("${example.property}")
private String exampleProperty;

@GetMapping("/get-config")
public String getConfig() {
return "Configuration property value: " + exampleProperty;
}
}

In this code snippet, the application retrieves the value of example.property from the Config Server and returns it in the response of the /get-config endpoint.

Step 4: Refreshing Configuration

For dynamic configuration, enable the /actuator/refresh endpoint by adding the Spring Boot Actuator dependency in the pom.xml file.

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

And in the bootstrap.yml or application.yml, expose the refresh endpoint:

management:
endpoints:
web:
exposure:
include: 'refresh'

Now, you can refresh the configuration of your client application at runtime by sending a POST request to the /actuator/refresh endpoint.

Step 5: Verifying the Configuration

Run the client application and verify that it is able to fetch the configuration from the Config Server by accessing the /get-config endpoint, usually at http://localhost:8080/get-config.

Troubleshooting

In case of issues while connecting the client application to the Config Server:

  • Ensure the bootstrap.yml file is correctly configured with the right application name and Config Server URI.
  • Verify that the Config Server is running and accessible from the client application.
  • Ensure that the configuration property name used in the @Value annotation matches with the property name in the Config Server.

Following this guide step-by-step will effectively connect your client application to the Spring Cloud Config Server, allowing it to access and dynamically refresh the centralized configuration, thereby enhancing the manageability and robustness of your microservices architecture.

Spring Cloud Config Features and Enhancements

Spring Cloud Config is a powerful tool for externalized configuration in a distributed environment. It offers robust server and client-side support, allowing applications to pull their configurations from a centralized server. Below, we delve into the features and enhancements of Spring Cloud Config, unraveling its utility for modern microservices architectures.

Centralized and Versioned Configuration

Spring Cloud Config propels the management of configurations by centralizing the storage of configurations across multiple applications and environments. This centralization ensures consistency and ease in managing and accessing configurations. Moreover, the server stores configuration data in version control repositories, such as Git or SVN. This version control aspect is essential for tracking changes and facilitating easy management of configurations across different environments.

Client-Side Configuration Loading

The dynamic refresh feature of Spring Cloud Config is a game-changer. It allows microservices to adapt to new configurations in real-time, enhancing the system’s flexibility and responsiveness. This feature is achieved by exposing specific endpoints, which, when accessed, reload the configuration parameters without the need to restart the entire microservice. Furthermore, the Config Server can serve different configurations for various environments from the same configuration repository, guaranteeing the correct configurations are used in each respective environment.

Enhanced Security

Security is paramount in handling configurations, and Spring Cloud Config is adept in this domain. It supports the encryption and decryption of property values, ensuring that sensitive data is handled securely. Integration with security mechanisms for access control is also a highlight. This integration guarantees that only authorized personnel or services can access or modify the configuration data, bolstering the security framework in managing configurations.

Integration and Compatibility

The compatibility and integration features of Spring Cloud Config ensure seamless operation within various ecosystems. It supports integration with different platforms and is compatible with various version control systems, allowing flexibility and efficiency in managing configurations. This wide-ranging compatibility ensures that organizations can choose systems based on their needs and preferences without worrying about integration issues.

Future Enhancements

Spring Cloud Config stands out for its ease of management and scalability, making it a preferred choice for managing configurations in microservices architectures. Continuous updates and enhancements keep it aligned with industry standards and requirements, ensuring it remains a robust and reliable solution for configuration management. Future enhancements are anticipated to focus on bolstering security, enhancing integration capabilities, and providing more flexible configuration management options.

The exploration of Spring Cloud Config’s features and enhancements underscores its critical role in ensuring efficient, secure, and seamless configuration management in microservices architectures, laying a solid foundation for robust and resilient system operation.

Conclusion

Spring Cloud Config is a powerful tool for managing the configuration of microservices in a centralized manner. It simplifies the task of configuration management and enhances the security, scalability, and modularity of microservices architecture.

  1. Spring Cloud Config Documentation
  2. Spring Initializer
  3. Encryption and Decryption in Spring Cloud Config
Spring Boot icon by Icons8

--

--

Alexander Obregon

Software Engineer, fervent coder & writer. Devoted to learning & assisting others. Connect on LinkedIn: https://www.linkedin.com/in/alexander-obregon-97849b229/