Почему автоматический выключатель Resilience4j не раскручивает новые темы - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь перейти с Hystrix на Resilience4j и попробовал вариант настройки resilience4j с использованием аннотаций (https://resilience4j.readme.io/docs/getting-started-3), который использует зависимость resilience4j-spring-boot2.

Когда я протестируйте его и проанализируйте журналы, даже метод, украшенный @CircuitBreaker, работает в том же потоке http-nio:

журналы с аннотацией CircuitBreaker:


2020-01 -10 10: 31: 15,996 [ http-nio-8080-exe c -1 ] INFO APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = 1 | TRACE_ID = eb88d5c53ab97a40 | SPAN_ID = eb88d5c53ab97a40 | CLIENT_ID = 1 | CLIENT_VERSION = 1 | a. c .simpdependent.DependentApi - Запрос: http://example.api.com/api/customers/John

2020-01-10 10: 31: 15,997 [ http-nio-8080-exe c -1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = 1 | TRACE_ID = eb88d5c53ab97a40 | SPAN_ID = eb88d5c53ab97a40 | CLIENT_ID = 1 | CLIENT_VERSION = 1 | a. c .simyservice.aop.LogingAspect - введите: au.com.suncorp.insurance.myservice.config.DependentApiRestOperation.getRestOperations () с аргументом [s] = []

2020-01-10 10: 31: 15,999 [ http-nio-8080-exe c -1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = 1 | TRACE_ID = eb88d5c53ab97a40 | SPAN_ID = eb88d5c53ab97a40 | CLIENT_ID = 1 | CLIENT_VERSION = 1 | a. c .simyservice.aop.LoggingAspect - Выход: au.com.suncorp.insurance.myservice.config.DependentApiRestOperation.getRestOperations () с результатом = org.springframework.web.client. RestTemplate@1f3111d1

1026 * 2020-01-10 10: 31: 16,065 [ http-nio-8080-exe c -1 ] ОШИБКА APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = 1 | TRACE_ID = eb88d5c53ab97a40 | SPAN_ID = eb88d5c53ab97a40 | CLIENT_ID = 1 | CLIENT_VERSION = 1 | a. c .simyservice.aop.LoggingAspect

Напротив, когда я создаю CircuitBreaker из CircuitBreakerFactory, в этом случае я вижу, как новые потоки выключателя вращаются, когда элемент управления внутри метода защищен от автоматического выключателя.

Журналы с помощью CircuitBreakerFactory:


2020-01-10 10: 50: 04,178 [ hystrix-HystrixCircuitBreakerFactory-1 ] DEBUG APP = тест -app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simyservice.aop.LoggingAspect - введите: au.com.suncorp.insurance.myservice.config.properties.DependentApiProperties.getAddress () с аргументом [s] = []

2020-01 -10 10: 50: 04,178 [ hystrix-HystrixCircuitBreakerFactory-1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simyservice.aop.LoggingAspect - Выход: au.com.suncorp.insurance.myservice.config.properties.DependentApiProperties.getAddress () с result = au.com.suncorp.insurance.myservice.config.properties. DependentApiProperties$Address@1928e7f3

2020-01-10 10: 50: 04,179 [ hystrix-HystrixCircuitBreakerFactory-1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simyservice.aop.LoggingAspect - введите: au.com.suncorp.insurance.myservice.config.properties.DependentApiProperties.getAddress () с аргументом [s] = []

2020-01 -10 10: 50: 04,179 [ hystrix-HystrixCircuitBreakerFactory-1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simyservice.aop.LoggingAspect - Выход: au.com.suncorp.insurance.myservice.config.properties.DependentApiProperties.getAddress () с result = au.com.suncorp.insurance.myservice.config.properties. DependentApiProperties$Address@1928e7f3

2020-01-10 10: 50: 04,184 [ hystrix-HystrixCircuitBreakerFactory-1 ] INFO APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simpdependent.DependentApi - Запрос: http://example.api.com/api/customers/John

2020-01-10 10: 50: 04,186 [ hystrix-HystrixCircuitBreakerFactory-1 ] DEBUG APP = test-app | ENV = МЕСТНЫЙ | REQUEST_ID = | TRACE_ID = bde6e74d65833730 | SPAN_ID = d5dc68689645201a | CLIENT_ID = | CLIENT_VERSION = | a. c .simyservice.aop.LoggingAspect - введите: au.com.suncorp.insurance.myservice.config.DependentApiRestOperation.getRestOperations () с аргументом [s] = []


1 Ответ

1 голос
/ 10 января 2020

Resilience4j Spring Boot Starter и Spring Cloud CircuitBreaker - это два разных / отдельных проекта.

Spring Cloud CircuitBreaker запускает методы в отдельном пуле потоков. См. -> https://github.com/spring-cloud/spring-cloud-circuitbreaker/blob/master/spring-cloud-circuitbreaker-resilience4j/src/main/java/org/springframework/cloud/circuitbreaker/resilience4j/Resilience4JCircuitBreaker.java#L68

В Resilience4j и Spring Boot Starter CircuitBreaker и Bulkhead на основе Threadpool представляют собой два разных шаблона устойчивости, которые вы можете объединить или нет. Если вы хотите объединить их, вы должны применить две аннотации к вашему методу -> @CircuitBreaker и @Bulkhead(type = Type.THREADPOOL).

Посмотрите демо -> https://github.com/resilience4j/resilience4j-spring-boot2-demo

...