⚙️ Spring Cloud Config Cheatsheet Completo ⚙️

Spring Cloud Config proporciona un servidor y clientes para una configuración externa y distribuida en arquitecturas de microservicios. Permite gestionar la configuración de todas las aplicaciones de forma centralizada y versionada, lo que simplifica la administración en entornos dinámicos.


1. 🌟 Conceptos Clave


2. 🛠️ Configuración Inicial

2.1. Config Server (Servidor de Configuración)

  1. Añadir dependencias en pom.xml:
    <dependencies>
        <parent>...</parent> &lt;!-- Tu parent de Spring Boot -->
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        &lt;!-- Spring Cloud BOM -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>2023.0.0</version> &lt;!-- Usar la versión compatible con tu Spring Boot -->
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </dependencies>
  2. Habilitar Config Server en la clase principal:
    // src/main/java/com/example/configserver/ConfigServerApplication.java
    package com.example.configserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer; // Habilita el servidor
    
    @SpringBootApplication
    @EnableConfigServer // Anotación clave para habilitar el servidor de configuración
    public class ConfigServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class, args);
        }
    }
  3. Configurar application.yml (para el Config Server):
    # src/main/resources/application.yml
    server:
      port: 8888 # Puerto por defecto de Config Server
    
    spring:
      application:
        name: config-server
      cloud:
        config:
          server:
            git: # Configurar el backend Git (repositorio donde están tus configuraciones)
              uri: https://github.com/tu-usuario/mi-repo-config.git # URL de tu repositorio Git de configuraciones
              search-paths: # Subdirectorios dentro del repo donde buscar configs
                - 'configs' # Por ejemplo, si tus configs están en 'mi-repo-config/configs/'
              default-label: main # Rama por defecto para buscar configs
              # username: tu-usuario-git # Para repos privados, si no usas SSH
              # password: tu-token-git   # Usar un Personal Access Token (PAT)
              # strict-host-key-checking: false # Para SSH, no recomendado en prod
            # native: # Alternativa: Usar el sistema de archivos local (para dev/testing)
            #   search-locations: file:///C:/config-files, classpath:/config-files/
    • Repositorio de Configuración (Ejemplo Git): Crea un repositorio Git (ej. en GitHub) que contendrá tus archivos de configuración.
      # mi-repo-config.git/configs/
      #   └─ my-service.yml        # Configuración por defecto para 'my-service'
      #   └─ my-service-dev.yml    # Configuración para 'my-service' en perfil 'dev'
      #   └─ my-service-prod.yml   # Configuración para 'my-service' en perfil 'prod'
      #   └─ another-service.yml
    • Iniciar la aplicación. El Config Server estará disponible en http://localhost:8888.

2.2. Config Client (Microservicio Cliente)

  1. Añadir dependencias en pom.xml (en el microservicio):

    <dependencies>
        <parent>...</parent> &lt;!-- Tu parent de Spring Boot -->
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        &lt;!-- Spring Cloud BOM -->
        <dependencyManagement>...</dependencyManagement>
    </dependencies>
  2. Configurar bootstrap.yml (o bootstrap.properties)

    • El archivo bootstrap.yml se carga antes que application.yml. Es crucial para que el cliente se conecte al Config Server antes de cargar cualquier otra configuración.
    # src/main/resources/bootstrap.yml
    spring:
      application:
        name: my-service # ¡CRÍTICO! Nombre de la aplicación para buscar en el Config Server
      cloud:
        config:
          uri: http://localhost:8888 # URL del Config Server
          profile: ${spring.profiles.active:default} # Envía el perfil activo
          label: main # Envía la etiqueta/rama de Git (default: main)
    • Iniciar la aplicación. Debería intentar conectar con el Config Server.

2.3. Acceso a la Configuración en el Cliente


3. 🌐 API del Config Server

El Config Server expone un API REST para acceder a las configuraciones.


4. 🔄 Actualización Dinámica (Hot Reload)

Para que los clientes de configuración actualicen su configuración en caliente sin reiniciar la aplicación.

4.1. Configurar Cliente para Refrescar

  1. Añadir dependencia: spring-boot-starter-actuator
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. Habilitar el refresh endpoint en application.yml:
    # src/main/resources/application.yml (del cliente)
    management:
      endpoints:
        web:
          exposure:
            include: refresh # Expone el endpoint /actuator/refresh
  3. Anotar componentes con @RefreshScope:
    • Cualquier bean de Spring que necesite refrescar sus propiedades cuando cambie la configuración debe estar anotado con @RefreshScope.
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RefreshScope // Anotación clave para recargar bean al refrescar
    public class DynamicConfigController {
        @Value("${message.greeting:Hello World}")
        private String greetingMessage;
    
        @GetMapping("/greeting")
        public String getGreeting() {
            return greetingMessage;
        }
    }
  4. Disparar el Refresh (después de cambiar la config en Git y hacer push):
    curl -X POST http://localhost:8080/actuator/refresh # Llama al endpoint de refresh del cliente

4.2. Spring Cloud Bus (Automatización del Refresh)

Spring Cloud Bus propaga los cambios de configuración a múltiples instancias de microservicios usando un Message Broker (Kafka, RabbitMQ).

  1. Añadir dependencia en pom.xml (en el Config Server Y en los Clientes):
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-kafka</artifactId> &lt;!-- O -bus-amqp para RabbitMQ -->
    </dependency>
    ```2.  **Configurar el Broker en `application.yml` (del Config Server y Clientes):**
    ```yaml
    # Para Kafka
    spring.cloud.stream.kafka.binder.brokers=localhost:9092
    spring.cloud.bus.trace.enabled=true # Para ver el rastro de la propagación
  2. Disparar el Refresh (después de cambiar la config en Git y hacer push):
    • Llama al endpoint /actuator/bus-refresh en el Config Server.
    curl -X POST http://localhost:8888/actuator/bus-refresh # Dispara el refresh global
    # O para una app específica: http://localhost:8888/actuator/bus-refresh/my-service:8080
    • El Config Server publicará un evento en el Message Broker.
    • Todos los clientes conectados al Bus recibirán el evento y activarán su propio /actuator/refresh.

5. 🔒 Seguridad


6. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de Spring Cloud Config, cubriendo sus conceptos esenciales, cómo configurar el servidor y los clientes, la actualización dinámica, la seguridad y las mejores prácticas para una gestión centralizada y versionada de la configuración en arquitecturas de microservicios.