Config Client

Intermedio
SpringBoot
SpringBoot
Actualizado: 09/10/2025

Config Client: dependencias y bootstrap

Para convertir un microservicio en cliente de configuración que consuma propiedades del Config Server, necesitamos configurar las dependencias apropiadas y establecer la configuración inicial que permita conectar con el servidor centralizado de configuración.

Dependencias del proyecto

La dependencia principal para un Config Client en Spring Boot 3 es spring-cloud-starter-config. Esta dependencia incluye todas las librerías necesarias para conectar con el servidor de configuración y obtener las propiedades remotas.

Configuración en Maven:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.5.6</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
		<spring-cloud.version>2025.0.0</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

Adicionalmente, desde Spring Boot 2.4 en adelante, es necesario incluir la dependencia spring-cloud-starter-bootstrap si queremos utilizar el método tradicional de bootstrap para la configuración inicial:

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

Esta dependencia es especialmente importante porque habilita el procesamiento de bootstrap que permite cargar la configuración del Config Server antes que el resto de propiedades de la aplicación.

Ejemplo:

Contenido de los archivos:

Configuración con spring.config.import (método moderno)

Spring Boot 3 introduce un enfoque moderno para importar configuración externa utilizando la propiedad spring.config.import. Este método no requiere archivos bootstrap y simplifica la configuración.

Configuración en application.yml:

spring:
  application:
    name: usuario-service
  config:
    import: configserver:http://localhost:8888

Configuración en application.properties:

spring.application.name=usuario-service
spring.config.import=configserver:http://localhost:8888

El prefijo **configserver:** indica a Spring Boot que debe importar la configuración desde un Config Server ubicado en la URL especificada.

Configuración con bootstrap (método tradicional)

Si preferimos utilizar el método tradicional con bootstrap, necesitamos crear un archivo bootstrap.yml en el directorio src/main/resources/:

spring:
  application:
    name: usuario-service
  cloud:
    config:
      uri: http://localhost:8888
      fail-fast: true

Las propiedades de configuración más importantes son:

1. spring.application.name: Define el nombre de la aplicación que el Config Server utilizará para buscar los archivos de configuración

2. spring.cloud.config.uri: Especifica la URL del Config Server

3. spring.cloud.config.fail-fast: Si está habilitado, la aplicación fallará al inicio si no puede conectar con el Config Server

Configuración mínima para desarrollo

Para un entorno de desarrollo local, la configuración mínima necesaria sería:

Con spring.config.import:

spring:
  application:
    name: usuario-service
  config:
    import: optional:configserver:http://localhost:8888
  profiles:
    active: dev

Con bootstrap.yml:

spring:
  application:
    name: usuario-service
  cloud:
    config:
      uri: http://localhost:8888
      fail-fast: false
  profiles:
    active: dev

La palabra clave **optional:** en el método moderno permite que la aplicación arranque aunque el Config Server no esté disponible, lo cual es útil durante el desarrollo.

Verificación de la configuración

Para verificar que nuestro Config Client está configurado correctamente, podemos añadir la dependencia de Actuator:

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

Y habilitar el endpoint de configuración en application.yml:

management:
  endpoints:
    web:
      exposure:
        include: env, configprops

Con esta configuración podremos acceder a http://localhost:puerto/actuator/env para ver todas las fuentes de propiedades cargadas, incluyendo las que provienen del Config Server.

Estructura del proyecto cliente

Una vez configuradas las dependencias y la conexión con el Config Server, nuestro microservicio cliente tendrá una estructura similar a:

usuario-service/
├── src/main/java/
│   └── com/ejemplo/usuario/
│       └── UsuarioServiceApplication.java
├── src/main/resources/
│   ├── application.yml (o bootstrap.yml)
│   └── logback-spring.xml
└── pom.xml

La clase principal del microservicio no requiere anotaciones especiales para funcionar como Config Client:

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

El Config Client se configurará automáticamente gracias a las dependencias añadidas y buscará las propiedades en el Config Server utilizando el nombre de aplicación especificado en la configuración.

Carga de propiedades y profiles

Una vez configurado el Config Client para conectar con el Config Server, el siguiente paso es comprender cómo se cargan las propiedades desde el servidor centralizado y cómo los profiles permiten gestionar diferentes entornos de manera eficiente.

Mecanismo de carga de propiedades

El Config Client solicita las propiedades al Config Server utilizando una clave compuesta formada por tres elementos:

  • Application: Corresponde al valor de spring.application.name del cliente
  • Profile: Basado en spring.profiles.active del cliente
  • Label: Etiqueta opcional para versionado (por defecto "master" o "main")

El Config Server busca archivos de configuración siguiendo el patrón de nombres **{application}-{profile}.yml** o **{application}-{profile}.properties** en el repositorio configurado.

# Ejemplo de solicitud del cliente
spring:
  application:
    name: usuario-service
  profiles:
    active: development

Con esta configuración, el Config Server buscará archivos como:

  • usuario-service-development.yml
  • usuario-service.yml (configuración común)
  • application.yml (configuración global)

Uso de propiedades en el código

Una vez que el Config Client obtiene las propiedades del servidor, podemos utilizarlas de la manera habitual en Spring Boot mediante la anotación **@Value**:

@RestController
public class UsuarioController {
    
    @Value("${usuario.database.url}")
    private String databaseUrl;
    
    @Value("${usuario.api.timeout:5000}")
    private int apiTimeout;
    
    @GetMapping("/config")
    public Map<String, Object> getConfiguration() {
        Map<String, Object> config = new HashMap<>();
        config.put("databaseUrl", databaseUrl);
        config.put("apiTimeout", apiTimeout);
        return config;
    }
}

También podemos utilizar **@ConfigurationProperties** para mapear grupos de propiedades a clases Java:

@Component
@ConfigurationProperties(prefix = "usuario.database")
public class DatabaseProperties {
    
    private String url;
    private String username;
    private int maxConnections;
    
    // Getters y setters
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    
    public int getMaxConnections() { return maxConnections; }
    public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; }
}

Gestión de profiles para diferentes entornos

Los profiles son fundamentales para gestionar configuraciones específicas de cada entorno sin duplicar código. Un enfoque típico incluye profiles para desarrollo, testing y producción.

Configuración local (application.yml):

spring:
  application:
    name: usuario-service
  config:
    import: configserver:http://localhost:8888
  profiles:
    active: development

# Configuración común para todos los entornos
logging:
  level:
    com.ejemplo: INFO

Configuración específica de desarrollo (usuario-service-development.yml en el Config Server):

usuario:
  database:
    url: jdbc:h2:mem:devdb
    username: dev_user
    maxConnections: 5
  api:
    timeout: 10000
  features:
    debug: true

Configuración específica de producción (usuario-service-production.yml en el Config Server):

usuario:
  database:
    url: jdbc:postgresql://prod-db:5432/usuarios
    username: prod_user
    maxConnections: 20
  api:
    timeout: 3000
  features:
    debug: false

Cambio dinámico de profiles

Para probar diferentes configuraciones, podemos cambiar el profile activo mediante varias aproximaciones:

1. Variable de entorno:

export SPRING_PROFILES_ACTIVE=production
java -jar usuario-service.jar

2. Parámetro de JVM:

java -jar usuario-service.jar -Dspring.profiles.active=production

3. Argumento de línea de comandos:

java -jar usuario-service.jar --spring.profiles.active=production

Actualización dinámica de configuración con @RefreshScope

Una característica importante del Config Client es la capacidad de actualizar propiedades sin reiniciar la aplicación utilizando **@RefreshScope**:

@RestController
@RefreshScope
public class ConfiguracionController {
    
    @Value("${usuario.mensaje.bienvenida}")
    private String mensajeBienvenida;
    
    @GetMapping("/mensaje")
    public String getMensaje() {
        return mensajeBienvenida;
    }
}

Para habilitar la actualización dinámica, necesitamos incluir Actuator y exponer el endpoint de refresh:

management:
  endpoints:
    web:
      exposure:
        include: refresh

Después de modificar una propiedad en el Config Server, podemos refrescar la configuración sin reiniciar:

curl -X POST http://localhost:8080/actuator/refresh

Precedencia de propiedades

Es importante comprender la precedencia de las propiedades cuando se combinan múltiples fuentes:

  • 1. Propiedades locales del cliente (application.yml local)
  • 2. Propiedades específicas del profile del Config Server
  • 3. Propiedades de aplicación del Config Server
  • 4. Propiedades globales (application.yml) del Config Server

Las propiedades con mayor precedencia sobrescriben a las de menor precedencia, permitiendo así personalizar configuraciones específicas manteniendo valores por defecto.

Verificación de propiedades cargadas

Para verificar qué propiedades se han cargado desde el Config Server, podemos utilizar el endpoint de Actuator /actuator/env:

curl http://localhost:8080/actuator/env

Este endpoint muestra todas las fuentes de propiedades activas, incluyendo aquellas que provienen del Config Server, lo que facilita la depuración de problemas de configuración.

La respuesta incluirá secciones como configService que identifican claramente las propiedades cargadas desde el servidor centralizado, permitiendo verificar que la integración funciona correctamente.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en SpringBoot

Documentación oficial de SpringBoot
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, SpringBoot es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de SpringBoot

Explora más contenido relacionado con SpringBoot y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Identificar y configurar las dependencias necesarias para un Config Client en Spring Boot.
  • Comprender los métodos modernos y tradicionales para importar configuración desde un Config Server.
  • Entender cómo se cargan y gestionan las propiedades y profiles desde el servidor centralizado.
  • Aplicar la inyección de propiedades en el código mediante @Value y @ConfigurationProperties.
  • Implementar la actualización dinámica de configuración con @RefreshScope y verificar la configuración mediante Actuator.

Cursos que incluyen esta lección

Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje