0

我有幾個spring引導微服務,它們通過雲環境部署到JBoss。這些引導服務是Eureka客戶端,它將自己註冊到Eureka服務器。以下是一個例子:zuul eureka服務id重定向

eureka: 
    client: 
    healthcheck: 
     enabled: true 
    serviceUrl: 
     defaultZone: ${DISCOVERY_URL:http://localhost:8761}/eureka/ 


    instance: 
    ip-address: 127.0.0.1 
    appname: user-regn-service-app 
    home-page-url-path: /user-regn-service-app 

它註冊的應用與尤里卡名稱爲用戶REGN服務,應用 Eureka Homepage

的wildfly服務器在8080上運行和用戶REGN服務,應用程序部署在上下文路徑/ user-regn-service-app中。 所以REST API是如下

localhost:8080/user-regn-service-app/regnUser 

當我使用zuul作爲API網關的配置是如下

zuul: 
    prefix: /api 
    routes: 
    test: 
     path: /test/** 
     service-id: USER-REGN-SERVICE-APP 
     strip-prefix: true 


ribbon: 
    eureka: 
    enabled: true 

eureka: 
    client: 
    serviceUrl: 
     defaultZone: http://localhost:8761/eureka/ 
    registerWithEureka: false 

但每當我正在調用zuul API網關是無法識別上下文路徑並重定向到localhost:8080而不是localhost:8080/user-regn-service-app。

http://localhost:8765/api/ - > 404未找到

http://localhost:8765/api/user-regn-service-app/ - > Wildfly默認主頁

http://localhost:8765/api/user-regn-service-app/user-regn-service-app/regnUser - >重定向到用戶註冊。

預期行爲:http://localhost:8765/api/test/regnUser應該重定向到用戶註冊。

我幾乎嘗試了所有從Zuul和Eureka之間的博客中獲得的組合,以完成以下工作,但沒有運氣。請提醒我是否缺少一些東西。

我已經嘗試使用自定義zuul自定義篩選器,但它不會轉發到必需的上下文路徑。代碼是如下

@Component 
public class ZuulApiFilter extends ZuulFilter{ 

    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     System.out.println("original"+ ctx.get("requestURI")); 
     HttpServletRequest request = ctx.getRequest(); 
     String requestURI = request.getRequestURI(); 
     String contextAwareURI=requestURI.concat("user-regn-service-app/"); 
     ctx.set("requestURI", contextAwareURI); 
     return null; 
    } 

    @Override 
    public boolean shouldFilter() { 
     return true; 
    } 

    @Override 
    public int filterOrder() { 
     return 1; 
    } 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

} 

的requestURI設定新的URI以及 ctx.set( 「requestURI」,contextAwareURI)後不改變; request.getRequestURI();僅顯示舊的請求URI。

回答

0

你能刪除和嘗試設置:

strip-prefix: false

,並嘗試將請求發送到:

http://<zuul ip>:<zuul port>/api/test/....

編輯:

@Tanmay戈什

這裏是我使用Zuul相關博客文章(仍處於草案)的樣本代碼,我將在未來幾天內公佈:

Zuulapplication.yml

... 
eureka: 
    client: 
    registerWithEureka: false 
    fetchRegistry: true 
    serviceUrl: 
     defaultZone: http://localhost:8000/eureka/ 

# ribbon.eureka.enabled: false 
zuul: 
    ignoredServices: "*" 
    routes: 
    zuulDemo1: 
     path: /zuul1/** 
# serviceId as registed with Eureka. Enabled and used when ribbon.eureka.enabled is true. 
     serviceId: demo-zuul-api1 
# zuul.routes.<the route>.url used when ribbon.eureka.enabled is false, serviceId is disabled. 
#  url: http://localhost:8600/ 
# stripPrefix set to true if context path is set to/
     stripPrefix: true 
... 

而且實際上我的Zuul服務器回購是公開的,可在:https://bitbucket.org/asimio/zuulserver和最近的博客文章http://tech.asimio.net/2017/10/10/Routing-requests-and-dynamically-refreshing-routes-using-Spring-Cloud-Zuul-Server.html

另一件事,Zuul服務是否也使用除/如果是這樣,你可以嘗試通過Zuul發送請求:http://<zuul host>:<zuul port>/<zuul app context>/api/test/....

+0

如果我讓假我可以訪問以下 的http://本地主機:8765/API /用戶REGN服務,應用程序/ - > Wildfly主頁 的http://本地主機:8765/API /用戶REGN服務,應用/用戶REGN服務,應用程序/ userRegn - >服務 不知道任何配置丟失 –

+0

這是混亂的,您使用JBoss和WebLogic的? 如果API在'監聽localhost:8080'以及使用應用程序上下文'用戶REGN服務,app'這意味着請求應被髮送到'HTTP://本地主機:8080 /用戶REGN服務,應用程序/ <資源>'。 stripPrefix被設置爲真,如果API(未Zuul服務)的上下文路徑設置爲/ – ootero

+0

很抱歉的混亂,我使用JBoss Wildfly此服務和它部署在上下文根/用戶REGN自行修理應用在8080 的http://本地主機:8080 /用戶REGN服務,應用程序/ <資源>工作正常,但zuul無法重定向到指定的服務。我在配置中丟失了什麼? –