Не удается заставить Resilience4j @RateLimiter работать с пружинной загрузкой

#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();  }  } }