У меня есть настройка Spring Cloud (Camden.SR7)
с Eureka (1.3.5.RELEASE)
, Config server
и несколькими Spring Boot (1.5.7.RELEASE)
микросервисами. Связь между микросервисами осуществляется с клиентом Feign
(Hystrix
отключен). Хотя во время разработки это работает правильно, я заметил, что при большом трафике, когда несколько одновременных вызовов выполняются между одними и теми же микросервисами, потоки блокируются и ответы не принимаются. Кажется, что клиент Feign не ведет себя правильно в многопоточности.
В настоящее время я использую SEMAPHORE
стратегию изоляции. Я также попытался изменить стратегию изоляции на THREAD
и указать пул потоков, но в этом случае я получил ошибку 403 для всех моих вызовов. Я также экспериментировал с feign-httpclient
в качестве альтернативы, и, хотя это, казалось, улучшило ситуацию, потребовались жестко закодированные URL-адреса вместо того, чтобы извлекать их из Eureka
, поэтому я не стал использовать это решение.
Есть идеи, как это исправить? Мой код выглядит следующим образом
bootstrap.yml:
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
semaphore:
maxConcurrentRequests: 100000 # basically 'unlimited'
timeout:
enabled: false
circuitBreaker:
enabled: false
fallback:
enabled: false
ribbon:
ConnectTimeout: 180000
ReadTimeout: 180000
FeignClientConfiguration:
@Configuration
public class FeignClientConfiguration {
@Bean
public Retryer retryer() {
return new Retryer() {
@Override
public void continueOrPropagate(RetryableException e) {
throw e;
}
@Override
public Retryer clone() {
return this;
}
};
}
@Bean
public RequestInterceptor requestTokenBearerInterceptor() {
return requestTemplate -> {
requestTemplate.header("Authorization",JWTUtil.getAuthorizationToken());
};
}
FeignClient:
@FeignClient(name = "audit-log-service", configuration = FeignClientConfiguration.class)
public interface AuditLogFeignClient {
@RequestMapping("/audit-log-ms/audit/save")
void saveEntityToDatabase(@RequestBody Object object);
}