Java Zuul路线不';t与ribbon listOfServers(不带Eureka)进行属性映射

Java Zuul路线不';t与ribbon listOfServers(不带Eureka)进行属性映射,java,spring-cloud,spring-cloud-netflix,netflix-ribbon,Java,Spring Cloud,Spring Cloud Netflix,Netflix Ribbon,我正在尝试为我的zuul路由配置ribbon,所以当我转到它时,应该将我路由到。 当我使用“url”属性定义路由时,它可以正常工作,而不使用功能区: zuul: routes: restful-service: path: /restful-service/** url: http://host2:port2/rest-example 但当我尝试使用ribbon时,它看起来像这样: zuul: routes: restful-

我正在尝试为我的zuul路由配置ribbon,所以当我转到它时,应该将我路由到。 当我使用“url”属性定义路由时,它可以正常工作,而不使用功能区:

zuul:
  routes:
      restful-service:
          path: /restful-service/**
          url: http://host2:port2/rest-example
但当我尝试使用ribbon时,它看起来像这样:

zuul:
  routes:
    restful-service:
      path: /restful-service/**
      serviceId: restful-service

ribbon:
  eureka:
    enabled: false

restful-service:
  ribbon:
    listOfServers: host2:port2/rest-example

它只允许我直接路由到所选服务,而不允许直接路由到所选服务(它返回404状态代码)。

listOfServers属性仅支持主机和端口,不支持路径。

将配置属性更改为以下内容-

    zuul:
        routes:
              restful-service:
                       serviceId:restful-service
                       stripPrefix:false

   ribbon:
        eureka:
             enabled:false

   restful-service:
        ribbon:
            listOfServers: host2:port2
然后需要编写一个zuul预过滤器来更改requestURI

      public class CustomPreFilter extends ZuulFilter {

      public Object run() {

       RequestContext context=RequestContext.getCurrentContext();
       String oldrequestURI=(String) context.get("requestURI");
       String newrequestURI=oldrequestURI.replace("restful-service", "rest-example");
       context.put("requestURI",newrequestURI);
       return null;
     }

      public boolean shouldFilter() {

       HttpServletRequest httpServletRequest=RequestContext.getCurrentContext().getRequest();
    if(httpServletRequest.getRequestURI().contains("/restful-service"))
        return true;
    else
        return false;
   }

       @Override
       public int filterOrder() {
       return PreDecorationFilter.FILTER_ORDER+1;
   }

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

 }

现在提出一个请求,这将对您想要做的事情起作用

您可以编写一个预过滤器来更改请求uri。将很快发布一个样本。感谢您的解决方案。不幸的是,它似乎只适用于一个服务,因为过滤器中有硬编码的名称。我的示例包含一项服务,但最终配置中包含的服务很少。您是否可以编辑您的问题和所有要求。我可以编辑我的答案并尝试使其通用。或者你可以只为不同的路线编写多个过滤器。只需更改“应筛选”中的条件。