Симулировать проблему параллелизма клиента - PullRequest
0 голосов
/ 02 июля 2018

У меня есть настройка 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);
}

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете добавить в файл конфигурации yml свойство sharedSecurityContext: true. Это позволит разделить контекст безопасности основного потока с тем, который используется командой Hystrix при использовании стратегии изоляции THREAD

. Смотри здесь .

...