当前位置: 首页 > 知识库问答 >
问题:

如何在使用Zuul、Hystrix(和费恩)和Spring Cloud HATEOAS时转发标头?

莫振
2023-03-14

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

我的一个API需要该service-a请求service-b;为此我使用feign

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

我的问题是,这些服务使用依赖于Hystrix的外文进行通信Hystrix为每个请求创建一个新线程(我们不使用信号量配置),因此Spring的RequestContextHolder中的请求在从service-a到service-b的外部请求中丢失,由于原始请求丢失,我无法再使用Feign拦截器丰富Feign请求。

通过参数hystrix,Spring现在直接支持转发授权令牌。shareSecurityContext:true

没有任何“现成”配置可以让Hystrix在线程之间共享请求。

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

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

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

有没有更简单的解决方案可以使用Hystrix转发来自Zuul的标头?

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

谢谢!


共有1个答案

昝浩阔
2023-03-14

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

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

  • 在从service-a到service-b的客户机中,我声明了一个特定的配置“ServiceBFeignConfig”,它除了转发令牌外,还添加了对应于网关的X转发头:
@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提供)。这些文件中也设置了service-b前缀。

仅当在属性文件中设置了“网关启用”属性时,才会添加这些标头。

  • 您必须从Spring Boot的组件扫描中忽略此配置,即使它需要@Configuration注释,因此将其放入“忽略扫描”包中,并在您的主Spring Boot类上使用:
@ComponentScan(basePackages = { "com.myservice" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.myservice.ignorescan.*"))

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

 类似资料:
  • 我们在Spring启动应用程序中使用hystrix。我们希望使用MDC将请求ID、请求URI和登录用户等特定属性附加到每个日志语句中。这种机制在实现hystrix的任何地方都不起作用。 对于非hystrix注释的方法,它的工作非常好。我知道MDC是特定于线程的,hystrix在不同的线程上执行。由于我无法对hystrix发表评论,请建议开展相关工作。

  • Turbine(由Spring Cloud Netflix项目提供))聚合多个实例Hystrix指标流,因此仪表板可以显示聚合视图。Turbine使用DiscoveryClient接口查找相关实例。要将Turbine与Spring Cloud Consul结合使用,请按以下示例配置Turbine应用程序:的pom.xml <dependency> <groupId>org.springfram

  • 我现在正尝试用以下代码连接API网关微服务以进行咨询: 这将导致以下异常: 此服务的pom.xml是: bootstrap.yml: application.yml: 谁能告诉我如何使用Spring cloud和Consul作为发现和配置服务来创建aan API-Gateway?

  • 我有zuul网关服务器,没有eureka服务发现。 我使用下面显示的yml文件连接微服务和zuul。 当我执行URL超时时,会发生异常

  • 我正面临使用Zuul和Ribbon的问题。我也在微服务注册中心使用尤里卡。 null 当我启动我的微服务生态系统并尝试使用ribbon-service API(zuulservice:8761/ribbon-service/)时,我得到以下错误: com.netflix.zuul.exception.zuulException:org.springframework.cloud.netflix.z

  • 我正在使用feign创建一个REST客户端。我有我的电话工作,但我想添加一些超时支持,我有一段时间,弄清楚如何做到这一点。 Feign的文档中说:“要将Hystrix与Feign一起使用,请将Hystrix模块添加到类路径中,然后使用HystrixFeign构建器。”好了,现在我有了这个: 现在我的所有方法都在返回HystrixCommands,我可以执行或排队,但仍然看不到如何配置它们。 但是我