使用Zuul,Hystrix(和Feign)与Spring Cloud HATEOAS时如何转发标头?



>上下文

我的微服务应用程序基于spring-cloud:在两个微服务的前面配置了一个zuul网关:服务-a和服务-b

我的一个 API 要求服务a请求服务 b;我为此使用feign

Zuul 将X-FORWARDED-*标头发送到服务,以便它们正确重写 HATEOAS 链接(当服务配置了ForwardedHeaderFilter时)。

我的问题是服务使用Feign相互通信,这依赖于HystrixHystrix为每个请求创建一个新线程(我们不使用 SEMAPHORE 配置),因此 SpringRequestContextHolder中的请求在从服务-a服务的Feign 请求中丢失,我无法再用feign拦截器丰富feign请求,因为原始请求丢失了。

一些潜在的解决方案

转发授权令牌现在由 Spring 直接支持,参数为hystrix.shareSecurityContext: true

没有任何"开箱即用"的配置可以让 Hystrix 在线程之间共享请求。

一个解决方案可能是实现我自己的HystrixConcurrencyStrategy,这是一个来自netflix.hystrix的类。 我的最新发现是这个拉取请求,它已发送到spring-cloud-netflix,但不幸的是没有集成。

我可以尝试复制 Pull 请求的代码,并创建一个 bean,就像"eacdy"所写的那样:

@Bean
public RequestAttributeHystrixConcurrencyStrategy hystrixRequestAutoConfiguration() {
return new RequestAttributeHystrixConcurrencyStrategy();
}

有没有更简单的解决方案可以使用HystrixZuul转发标头?

我想在使用相互通信的ZuulHystrixHATEOAS微服务时,我正在尝试做的事情是非常标准的,所以也许已经存在一些东西(我找不到)?

谢谢!

我认为这是一件很常见的事情,但是经过大量研究,我找不到一种使用FeignHystrix自动转发X-FORWARDED-*标头的方法。

因此,我寻找了另一种解决方案,该解决方案有效且非常干净:

  • 在从服务-a服务-bFeign客户端中,我声明了一个特定的配置"ServiceBFeignConfig",除了转发令牌外,还添加了与网关对应的X-Forwarded-*标头:
@Configuration
public class ServiceBFeignConfig {
@Autowired
private ApplicationProperties applicationProperties;
@Bean
public RequestInterceptor requestTokenBearerInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
OAuth2AuthenticationDetails details =
(OAuth2AuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails();
requestTemplate.header("Authorization", "bearer " + details.getTokenValue());
if (applicationProperties.getFeign().getGatewayEnabled()) {
requestTemplate.header("X-Forwarded-Host", applicationProperties.getFeign().getGatewayHost());
requestTemplate.header("X-Forwarded-Port", applicationProperties.getFeign().getGatewayPort());
requestTemplate.header("X-Forwarded-Proto", applicationProperties.getFeign().getGatewayProtocol());
requestTemplate.header("X-Forwarded-Prefix", applicationProperties.getFeign().getServiceBPrefix());
}
}
};
}
}

您可以看到网关主机和端口是在属性文件中配置的(在我的情况下由Spring Cloud Config提供)。服务-b前缀也在这些文件中设置。

仅当在属性文件中设置了"gatewayEnabled"属性时,才会添加这些标头。

  • 你必须从 Spring Boot 的组件扫描中忽略这个配置,即使它需要@Configuration注释,所以把它放在一个"ignorescan"包中,在你的主 Spring 引导类上,使用:
@ComponentScan(basePackages = { "com.myservice" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.myservice.ignorescan.*"))

最后,如果将 gatewayEnabled 设置为 true,并且对网关的 API 调用将获得正确的 HATEOAS 链接,则将添加转发标头。

相关内容

  • 没有找到相关文章

最新更新