2017-03-08 17 views
0

我在我們的微服務項目中遇到了Zuul-Proxy的奇怪行爲。我的安裝包含發現服務(Eureka),API網關(Zuul)和兩個微服務「A」&「B」。 開始安裝後,下列途徑是通過顯示「本地主機:10000 /路線」:Zuul似乎在REST調用後重寫路由

{ 
    "/api-gateway/**": "api-gateway", 
    "/a-service/**": "a-service", 
    "/b-service/**": "b-service" 
} 

我Zuul配置是這樣的:

zuul: 
    ignored-services: '' 
    add-proxy-headers: true 
    sensitiveHeaders: 'Cookie,Set-Cookie' 

現在我通過網關接入服務,使一些REST調用:

http://localhost:10000/a-service/sayHello - >確定

http://localhost:10000/b-service/sayBye - >確定

http://localhost:10000/a-service/sayHello - > ERROR 404

我可以看到,最後一個請求被錯誤地路由到服務B,即使我使用「/ A-服務/ **」的路線。這怎麼會發生?服務B的第二次REST呼叫是否以某種方式重寫了路由?

但是「localhost:10000/routes」仍然返回與上面相同的內容。這也與在相反的順序BAB調用服務工程 - > 404,並錯誤地路由到服務A.

你可以下載一個最小的項目,4個部件,這應該讓你輕鬆地複製這種行爲在這裏: https://github.com/Netflix/zuul/files/827817/MinimalZuulRouteBugProject.zip

謝謝你對這個問題的任何見解。從spencergibb @github

回答

0

答:

這是這裏的記錄問題http://cloud.spring.io/spring-cloud-static/Camden.SR5/#_customizing_the_ribbon_client

的FooConfiguration必須是@Configuration但照顧它 不在@ComponentScan主應用程序上下文,否則 它將被所有@RibbonClients共享。如果使用@ComponentScan (或@SpringBootApplication),則需要採取措施避免包含 (例如將其放在單獨的,不重疊的程序包中,或者指定要在@ComponentScan中顯式掃描的程序包)。

對於您的情況,RibbonConfigAvailability由組件掃描拾取並在所有功能區客戶端之間共享(這很糟糕)。要麼刪除@Configuration(它不必像這樣註釋,這是我的測試方式),或者將它從組件掃描中排除。

了錯誤的代碼:

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

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

}