【发布时间】:2019-08-16 19:54:51
【问题描述】:
上下文
我的微服务应用基于spring-cloud:在两个微服务前面配置了一个zuul网关:service-a和service-b.
我的一个 API 要求 service-a 请求 service-b;我为此使用feign。
Zuul 向服务发送 X-FORWARDED-* 标头,以便它们正确重写 HATEOAS 链接(当服务配置为 ForwardedHeaderFilter 时)。
我的问题是服务使用Feign 相互通信,这依赖于Hystrix。
Hystrix 为每个请求创建一个新线程(我们不使用 SEMAPHORE 配置),因此 Spring 的 RequestContextHolder 中的请求在 service-a 到 的 Feign 请求中丢失service-b,由于原始请求丢失,我无法再使用feign 拦截器丰富feign 请求。
一些潜在的解决方案
Spring现在直接支持转发授权令牌,参数hystrix.shareSecurityContext: true
没有任何“开箱即用”的配置可以让 Hystrix 在线程之间共享请求。
解决方案可能是implement my own HystrixConcurrencyStrategy,它是 netflix.hystrix 中的一个类。
我最新的发现是这个Pull Request 已经发送到spring-cloud-netflix,但遗憾的是没有集成。
我可以尝试复制Pull请求的代码,并创建一个bean,就像“eacdy”写的那样:
@Bean
public RequestAttributeHystrixConcurrencyStrategy hystrixRequestAutoConfiguration() {
return new RequestAttributeHystrixConcurrencyStrategy();
}
有没有更简单的解决方案将来自Zuul 的标头转发到Hystrix?
我想在使用Zuul、Hystrix 和HATEOAS 相互通信的微服务时,我正在尝试做的事情是非常标准的,所以也许已经存在一些东西(而且我没找到)?
谢谢!
【问题讨论】:
标签: spring-cloud netflix-zuul hystrix spring-hateoas spring-cloud-feign