伪装客户并发问题

时间:2018-07-02 13:56:53

标签: spring-cloud netflix-eureka hystrix spring-cloud-feign feign

我已经使用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 :(得分:0)

您可以在yml配置文件中添加属性sharedSecurityContext:true。 使用隔离策略THREAD

时,这将与Hystrix命令使用的主线程共享安全上下文。

。  参见here