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无法重定向到指定的服务。我在配置中丢失了什么? –