BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Actualités Spring Cloud Propose Une Interface Pour Circuit-Breakers

Spring Cloud Propose Une Interface Pour Circuit-Breakers

Spring Cloud incubator propose un nouveau projet appelé Spring Cloud Circuit Breaker, qui fournit une interface pour faciliter l'utiliser de circuit-breakers. Un circuit-breaker définit un ensemble de seuils qui, une fois dépassés, arrêteront l'exécution d'un bloc de code. Cela permettra aux systèmes d’échouer rapidement, d’empêcher les pannes en cascade et la surcharge du système. 

Le projet Spring Cloud Circuit Breaker est une couche d’abstraction pour les bibliothèques de type circuit-breaker populaires en Java. Le projet prend actuellement en charge Netflix HystrixResilience4jSentinel et Spring Retry.

Spring Cloud est un ensemble d’outils pouvant être utilisés pour créer des systèmes distribués dans le cloud. Spring Cloud fournit des fonctionnalités pour les cas d'utilisation typiques tels que l'enregistrement et la découverte de services, le routage, l'équilibrage de charge et les circuit-breakers. Jusqu'à récemment, la fonctionnalité de circuit-breaker de Spring Cloud reposait uniquement sur Netflix Hystrix.

Avec le nouveau projet Spring Cloud Circuit Breaker, les développeurs ont la possibilité de choisir d’autres implémentations de circuit-breaker en utilisant l'interface. Pour choisir une implémentation spécifique au moment de l'exécution, il est nécessaire d'ajouter le fichier starter JAR approprié dans le classpath de l'application.

L'extrait de code ci-dessous montre comment un service peut exploiter l'API CircuitBreakerFactory pour créer un CircuitBreaker et encapsuler des appels vers un service de recommandations externe à l'intérieur du CircuitBreaker.

@Service
public static class ProductsService {
  private RestTemplate rest;
  private CircuitBreaker circuitBreaker;
  public ProductsService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
    this.rest = rest;
    this.circuitBreaker = cbFactory.create("recs");
  }
  public ProductList getProducts() {
    return circuitBreaker.run(
        () -> rest.getForObject("/recs", ProductList.class),
        throwable -> "fallback");
  }
}

La méthode d'exécution du CircuitBreaker prend deux arguments, un Supplier et une fonction de callback. Le Supplier est utilisé pour fournir la logique d'exécution à l'intérieur du CircuitBreaker. La fonction de callback est utilisée pour spécifier la logique à exécuter lorsque le CircuitBreaker se déclenche.

Spring Cloud Circuit Breaker fournit une version réactive sous la forme de l’API ReactiveCircuitBreakerFactory. Elle peut être utilisée dans des applications construites avec le projet Reactor. Ci-dessous un extrait qui montre comment un service peut utiliser la version réactive de CircuitBreaker pour encapsuler des appels vers un service de recommandations externe :

@Service
public static class ProductsService {
  private WebClient webClient;
  private ReactiveCircuitBreaker circuitBreaker;
  public ProductsService(WebClient webClient,
        ReactiveCircuitBreakerFactory cbFactory) {
    this.webClient = webClient;
    this.circuitBreaker = cbFactory.create("recs");
  }
  public Mono<ProductList> getProducts() {
    return circuitBreaker.run(
        webClient
            .get()
            .uri("/recs")
            .retrieve()
            .bodyToMono(ProductList.class),  throwable -> return Mono.just("fallback"));
  }
}

Le comportement des circuit-breakers peut être configuré à l'aide d'un bean implémentant l'interface Customizer. Un Customizer peut fournir une configuration par défaut pour tous les circuit-breakers ainsi que des configurations spécifiques pour chaque circuit-breaker.

Ci-dessous un extrait de code qui montre comment fournir une configuration par défaut pour tous les circuit-breakers s'appuyant sur Resilience4j :

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
  TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig
      .custom()
      .timeoutDuration(Duration.ofSeconds(4))
      .build();
  return factory ->
      factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
          .timeLimiterConfig(timeLimiterConfig)
          .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
          .build());
}

Les jars de Spring Cloud Circuit Breaker sont actuellement disponibles dans le référentiel snapshot de Spring. La documentation du projet décrit les concepts de base et les différentes options de configuration.

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT