一种常见的方法(不仅是Resilience4j
,而且Spring
一般而言)是使用 a (您可以在此处BeanPostProcessor
看到一个不相关的示例)。
然后在 beanPostProcessor 中,您可以获取您的句柄并使用您的CicrcuitBreaking 逻辑EnvironmentController
环绕它的实现/方法。Resilience4j
基本上,该方法将类似于:
- 使用 a
BeanPostProcessor
来@Configuration
获得完全接线的手柄EnvironmentController
CircuitBreaker
使用 Resilience4j 围绕EnvirommentController
您感兴趣的方法包装您自己的实现
- 利润
如果这不能完全清除图片,我可以添加一些示例代码来帮助您入门,请告诉我。请记住,这可能只是可以解决的众多方法之一。
编辑:
一些代码(不确定它是否有效,尚未测试,spring-boot
在使用大量aop
的 MVC 映射自动配置方面非常烦人,因此您可能不得不使用方面或代理配置),可能看起来像(请记住,为了后代,我会使用 lombok 来避免所有样板):
@Configuration
@Slf4j
public class MyConfig {
// or however the heck you get your breaker config
private final CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().build();
private final CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
private final CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("suchBreakerMuchWow");
@Bean
public CircuitBreakerAwarePostProcessor circuitBreakerAwarePostProcessor() {
return new CircuitBreakerAwarePostProcessor();
}
public class CircuitBreakerAwarePostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof EnvironmentController) {
return new CircuitBreakerFriendlyEnvironmentController((EnvironmentController) bean);
}
return bean;
}
}
private interface Exclude {
Environment labelled (String name, String profiles, String label);
}
@RequiredArgsConstructor
private class CircuitBreakerFriendlyEnvironmentController implements Exclude {
@Delegate(types = EnvironmentController.class, excludes = Exclude.class)
@NonNull private final EnvironmentController environmentController;
@Override
public Environment labelled(String name, String profiles, String label) {
return circuitBreaker.executeSupplier(() -> {
log.info("such wow");
return environmentController.labelled(name, profiles, label);
});
}
}
}