Feign客户端并发问题
Feign client concurrency issue
我已经设置 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
FeignClient配置:
@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);
}
您可以在 yml 配置文件中添加 属性 sharedSecurityContext: true。
当您使用隔离策略 THREAD
时,这会将主线程的安全上下文共享给 Hystrix 命令使用的上下文
。
参见 here。
我已经设置 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
FeignClient配置:
@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);
}
您可以在 yml 配置文件中添加 属性 sharedSecurityContext: true。
当您使用隔离策略 THREAD
。 参见 here。