J'ai essayé sans succès d'implémenter le modèle de disjoncteur, ici , en Java en utilisant le framework Spring.
Comment pouvez-vous implémenter le modèle de disjoncteur par Java et Spring?
Pour un implémentation de disjoncteur simple et direct, consultez Failsafe . Ex:
CircuitBreaker breaker = new CircuitBreaker()
.withFailureThreshold(5)
.withSuccessThreshold(3)
.withDelay(1, TimeUnit.MINUTES);
Failsafe.with(breaker).run(() -> connect());
Ça ne devient pas beaucoup plus simple.
Apache commons a quelques implémentations pour plusieurs types de disjoncteurs légers, voici un lien vers la documentation
Le projet fournit les classes EventCountCircuitBreaker
et ThresholdCircuitBreaker
, ainsi qu'un résumé AbstractCircuitBreaker
afin que vous puissiez implémenter les vôtres.
Le code est open source et est hébergé sur github , ainsi toute personne essayant d'implémenter le modèle devrait au moins jeter un coup d'oeil.
Spring Cloud fournit une intégration intéressante avec Hystrix . Vous devriez probablement y jeter un coup d'œil ...
Vous pouvez obtenir de nombreuses informations utiles sur ce modèle sur Le blog de Martin Fowler . Il contient l'implémentation de Ruby ainsi que des références pour l'implémentation dans d'autres langues.
Veuillez vérifier la bibliothèque JRugged . Elle contient la mise en œuvre du disjoncteur au printemps ainsi que d’autres modèles de conception.
Vous n'avez pas besoin d'utiliser Spring cloud ou Spring Boot pour utiliser Hystrix.
Utiliser hystrix-javanica facilite également l’utilisation de Hystrix avec Spring.
Voici un exemple de méthode de secours (les deux méthodes, getMessageTimeout et getMessageException, échouent par défaut):
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class CircuitBreakingWithHystrix {
@Bean
public HystrixCommandAspect hystrixAspect() {
return new HystrixCommandAspect();
}
public static void main(String[] args) throws Throwable {
ApplicationContext ctx
= new AnnotationConfigApplicationContext(CircuitBreakingWithHystrix.class);
ExampleService ex = ctx.getBean(ExampleService.class);
for (int i = 0; i < 1000; i++) {
System.out.println(ex.getMessageException());
System.out.println(ex.getMessageTimeout());
}
}
@Service
class ExampleService {
/*
* The default Hystrix timeout is 1 second. So the default
* version of this method will always fail.
* Adding the @HystrixProperty will cause
* the method to succeed.
*/
@HystrixCommand(
commandProperties = {
//@HystrixProperty(name = EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,
// value = "5000")
},
fallbackMethod = "messageFallback"
)
public String getMessageTimeout() {
try {
//Pause for 4 seconds
Thread.sleep(4000);
} catch (InterruptedException ex) {
// Do something clever with this
}
return "result";
}
@HystrixCommand(
fallbackMethod = "messageFallback")
public String getMessageException() {
throw new RuntimeException("Bad things happened");
}
private String messageFallback(Throwable hre) {
return "fallback";
}
}
Vous pouvez également examiner le jetable envoyé à la méthode de secours pour identifier la raison de l'échec de l'appel de la méthode.
Vous pouvez consulter JCircuitBreaker . La mise en œuvre met en œuvre une approche semblable à celle d'un disjoncteur
Veuillez noter qu'il ne s'agit pas d'une implémentation 1: 1 du modèle car il ne définit pas d'états fixes comme "semi-ouvert". Au lieu de cela, il prend la décision (si le disjoncteur doit être ouvert ou fermé) en se basant sur l'état actuel de l'application (en utilisant la "stratégie de rupture"). Néanmoins, il devrait être possible de définir une telle "stratégie de rupture" qui évalue les seuils de défaillance - de sorte qu'il soit également possible de mettre en œuvre un modèle original à l'aide de JCircuitBreaker.