#java #spring-boot #resilience4j
#Ява #пружинный ботинок #отказоустойчивость 4j
Вопрос:
Кажется, я не могу заставить Resilience4j @RateLimiter работать с Spring Boot.
Ниже приведен код
@Log4j2 @Component class Resilience4jDemo implements CommandLineRunner { @Override public void run(String... args) throws Exception { for (int i = 0; i lt; 100; i ) { callBackendA(); } } @RateLimiter(name = "backendA") private void callBackendA() { log.info("Calling "); } }
приложение.файл yaml
resilience4j.ratelimiter: instances: backendA: limitForPeriod: 1 limitRefreshPeriod: 10s timeoutDuration: 0
pom.xml
lt;!-- https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-spring-boot2 --gt; lt;dependencygt; lt;groupIdgt;io.github.resilience4jlt;/groupIdgt; lt;artifactIdgt;resilience4j-spring-boot2lt;/artifactIdgt; lt;versiongt;1.7.1lt;/versiongt; lt;/dependencygt; lt;!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator --gt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-actuatorlt;/artifactIdgt; lt;versiongt;2.6.0lt;/versiongt; lt;/dependencygt; lt;!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop --gt; lt;dependencygt; lt;groupIdgt;org.springframework.bootlt;/groupIdgt; lt;artifactIdgt;spring-boot-starter-aoplt;/artifactIdgt; lt;versiongt;2.6.0lt;/versiongt; lt;/dependencygt;
Там нет ограничений по ставкам. Не могу понять, что я пропустил.
Комментарии:
1. Это называется самостоятельным вызовом , и ни один из АОП Весны не сработает.
Ответ №1:
У меня нет опыта работы с Resilience4j, но, похоже, вы пытаетесь использовать spring-aop здесь. Это работает с прокси-сервером, созданным во время выполнения, который обертывает исходный класс, предоставляя дополнительные функции (в данном случае ограничение скорости).
Если это так, вы не можете аннотировать закрытый метод класса, потому что он не будет обнаружен и обработан механизмом генерации прокси-сервера.
Вместо этого подумайте о создании другого компонента и предоставьте его функциональность в качестве общедоступного метода:
public interface Backend { void callBackendA(); } @Component // this is a spring bean! @Log4j2 public class LoggingBackendImpl implements Backend { @RateLimiter(name = "backendA") public void callBackendA() { log.info("calling backend"); } } @Component class Resilience4jDemo implements CommandLineRunner { @Autowired Backend backend; // this has to be managed by spring @Override public void run(String... args) throws Exception { for (int i = 0; i lt; 100; i ) { backend.callBackendA(); } } }