0%
Configuration Server avec Spring Cloud Config

Configuration Server

Configuration centralisée

10-15 min

Configuration Server avec Spring Cloud Config

Dans ce tutoriel, nous allons explorer la mise en place d’un serveur de configuration centralisé avec Spring Cloud Config. Nous verrons comment gérer les configurations de manière centralisée et sécurisée.

Configuration du serveur

Dépendances

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Configuration de base

server:
  port: 8888

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-org/config-repo
          default-label: main
          search-paths: 
            - config/*/default
            - config/*/prod
          clone-on-start: true

Classe principale

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

Configuration des clients

Dépendances

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

Configuration des clients

spring:
  application:
    name: product-service
  cloud:
    config:
      uri: http://localhost:8888
      fail-fast: true
      retry:
        max-attempts: 6
        initial-interval: 1000
        multiplier: 1.1
        max-interval: 2000

Gestion des profils

Structure des fichiers

config-repo/
  ├── product-service/
  │   ├── default/
  │   │   └── application.yml
  │   ├── dev/
  │   │   └── application.yml
  │   └── prod/
  │       └── application.yml
  └── order-service/
      ├── default/
      │   └── application.yml
      ├── dev/
      │   └── application.yml
      └── prod/
          └── application.yml

Configuration par profil

# application.yml (default)
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password: 

# application-dev.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/devdb
    username: devuser
    password: devpass

# application-prod.yml
spring:
  datasource:
    url: jdbc:mysql://prod-server:3306/proddb
    username: produser
    password: ${DB_PASSWORD}

Sécurité

Configuration du serveur

spring:
  security:
    user:
      name: ${CONFIG_SERVER_USERNAME:admin}
      password: ${CONFIG_SERVER_PASSWORD:secret}

Configuration des clients

spring:
  cloud:
    config:
      username: ${CONFIG_SERVER_USERNAME:admin}
      password: ${CONFIG_SERVER_PASSWORD:secret}

Configuration de la sécurité

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/actuator/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

Encryption et Décryption

Configuration du serveur

encrypt:
  key-store:
    location: classpath:keystore.jks
    secret: ${KEYSTORE_SECRET}

Utilisation

# application.yml
spring:
  datasource:
    password: ENC(encrypted-password)

Commandes de chiffrement

# Chiffrement
curl -X POST "http://localhost:8888/encrypt" -d "secret-password"

# Déchiffrement
curl -X POST "http://localhost:8888/decrypt" -d "encrypted-password"

Monitoring et Métriques

Configuration Actuator

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: always

Métriques personnalisées

@Component
public class ConfigMetrics {
    
    private final MeterRegistry registry;
    
    public ConfigMetrics(MeterRegistry registry) {
        this.registry = registry;
    }
    
    public void recordConfigRefresh(String application, String profile) {
        registry.counter("config.refresh", 
            "application", application,
            "profile", profile)
            .increment();
    }
}

Refresh et Reload

Configuration du client

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

Endpoint de refresh

@RestController
@RequestMapping("/actuator")
public class RefreshController {
    
    @PostMapping("/refresh")
    public ResponseEntity<String> refresh() {
        // Logique de refresh
        return ResponseEntity.ok("Configuration refreshed");
    }
}

Configuration du bus

spring:
  cloud:
    bus:
      enabled: true
      destination: config-bus

Exercices pratiques

  1. Configuration multi-environnements

    • Créez des configurations pour dev, test et prod
    • Configurez les variables sensibles
    • Testez le chargement des configurations
  2. Sécurité et chiffrement

    • Configurez l’authentification
    • Chiffrez les données sensibles
    • Testez la sécurité
  3. Monitoring et refresh

    • Configurez les métriques
    • Testez le refresh des configurations
    • Mettez en place des alertes

Conclusion

Dans ce tutoriel, nous avons exploré :

  • La configuration du serveur Config
  • La configuration des clients
  • La gestion des profils
  • La sécurité
  • Le chiffrement
  • Le monitoring
  • Le refresh des configurations

Spring Cloud Config permet :

  • La centralisation des configurations
  • La gestion des environnements
  • La sécurité des données sensibles
  • Le monitoring des changements
  • La mise à jour dynamique

Dans le prochain tutoriel, nous explorerons l’API Gateway avec Spring Cloud Gateway.

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !