Microservices Zuul似乎在REST调用后重写了路由

Microservices Zuul似乎在REST调用后重写了路由,microservices,netflix-zuul,netflix-eureka,Microservices,Netflix Zuul,Netflix Eureka,在我们的微服务项目中,我遇到了Zuul代理的一个奇怪行为。我的设置包括一个发现服务(Eureka)、一个API网关(Zuul)和两个微服务“a”和“B”。 启动设置后,通过“localhost:10000/路由”显示以下路由: 我的Zuul配置如下所示: zuul: ignored-services: '' add-proxy-headers: true sensitiveHeaders: 'Cookie,Set-Cookie' 现在我通过网关访问服务并拨打一些REST电话: --

在我们的微服务项目中,我遇到了Zuul代理的一个奇怪行为。我的设置包括一个发现服务(Eureka)、一个API网关(Zuul)和两个微服务“a”和“B”。 启动设置后,通过“localhost:10000/路由”显示以下路由:

我的Zuul配置如下所示:

zuul:
  ignored-services: ''
  add-proxy-headers: true
  sensitiveHeaders: 'Cookie,Set-Cookie'
现在我通过网关访问服务并拨打一些REST电话:

-->好的

-->好的

-->错误404

我可以看到最后一个请求被错误地路由到服务B,即使我使用的是“/a-Service/**”路由。这怎么会发生?对服务B的第二个REST调用是否以某种方式重写了路由

但是,“localhost:10000/routes”仍然返回与上面相同的结果。这也适用于以相反顺序B-A-B->404调用服务,并错误地路由到服务A

您可以下载一个包含4个组件的最小项目,这样您就可以在此处轻松复制此行为:


感谢您对此问题的任何见解。

Spencergib@github的回答:

这是一个记录在案的问题

FooConfiguration必须是@Configuration,但请注意 不在主应用程序上下文的@ComponentScan中,否则 它将由所有@RibbonClient共享。如果您使用@ComponentScan (或@springbootplication)您需要采取措施避免 包括(例如,将其放在单独的、不重叠的包中, 或者在@ComponentScan)中指定要显式扫描的包

在您的情况下,RibbonConfigAvailability由组件扫描获取,并在所有ribbon客户端之间共享(这很糟糕)。要么删除@Configuration(它不需要这样注释,这是我测试的方式),要么将其从组件扫描中排除

错误代码:

@Configuration //THIS ANNOTATION IS THE ERROR    
public class RibbonConfigAvailability {

    @Bean
    public IRule ribbonRule() {
        return new AvailabilityFilteringRule();
    }

}
@Configuration //THIS ANNOTATION IS THE ERROR    
public class RibbonConfigAvailability {

    @Bean
    public IRule ribbonRule() {
        return new AvailabilityFilteringRule();
    }

}