zuul eureka服务ID重定向

时间:2017-10-05 14:27:23

标签: spring-boot netflix-eureka netflix-zuul spring-cloud-netflix

我很少有Spring Boot微服务,它们通过云环境部署到JBoss。这些引导服务是Eureka客户端,它们将自己注册到Eureka服务器。以下是一个例子:

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

它使用名为user-regn-service-app的Eureka注册应用程序 Eureka Homepage

wildfly服务器运行在8080,user-regn-service-app部署在上下文路径/ user-regn-service-app中。 所以其余的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";
    }

}

在设置新URI之后,requestURI也没有变化 ctx.set(" requestURI",contextAwareURI); request.getRequestURI();仅显示旧的Request URI。

1 个答案:

答案 0 :(得分:0)

您可以删除ZuulApiFilter并尝试设置:

strip-prefix: false

并尝试将请求发送至:

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

编辑:

@Tanmay Ghosh

以下是我将用于与Zuul相关的博客文章(仍在草稿中)的示例代码,我将在接下来的几天内发布:

Zuul&#39; application.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/....吗?