Zuul路径从根路径

我有一些与Eureka一起发现的微服务。 他们大多提供一些API。 我实际上有Zuul Proxy的“边缘”服务叫做“网关服务”。 问题是有一个Web应用程序。 它由网关服务主持了很长时间,并没有任何问题。 但现在我需要在网关后面的单独服务中托管此客户端。 这不是一个问题。 我创建了新的服务并将Web应用程序放在那里。 但事情是Zuul在网关服务上有下一个配置

zuul:
  ignoredServices: '*'
  prefix: /api
  sensitiveHeaders: Cookie, Set-Cookie
  routes:
    config-service:
      path: /conf/**
      serviceId: config-service
    security-service:
      path: /security/**
      serviceId: security-service
      stripPrefix: false
    request-service:
      path: /requests/**
      stripPrefix: false

我需要这样做,以便用户可以像这样的http://app.com/从根路径访问Web应用程序。 但现在我只能通过http://app.com/api/访问它,这完全不正确。

我的任务是:

  • 使Web应用程序托管在从根路径可用的另一个服务上。
  • 对于所有其他服务, /api前缀仍然非常重要。
  • 我试图实现ZuulFilter 。 但看起来它对根路径没有任何作用,只有在与上述任何路由匹配时才会运行。

    我该如何做这项工作?

    更新 :我用ZuulFilter取得了一点成功。 我做到了。 这是Zuul的配置:

    zuul:
      ignoredServices: '*'
      sensitiveHeaders: Cookie, Set-Cookie
      routes:
        api: /api/**
        config-service:
          path: /conf/**
          serviceId: config-service
        security-service:
          path: /security/**
          serviceId: security-service
          stripPrefix: false
        request-service:
          path: /requests/**
          stripPrefix: false
        frontend-host-service:
          path: /**
    

    ZuulFilter本身

    @Bean
        public ZuulFilter apiPrefixStrip(RouteLocator routeLocator) {
            return new ZuulFilter() {
    
                @Override
                public String filterType() {
                    return "pre";
                }
    
                @Override
                public int filterOrder() {
                    return 0;
                }
    
                @Override
                public boolean shouldFilter() {
                    RequestContext context = RequestContext.getCurrentContext();
                    return context.getRequest().getRequestURI().startsWith("/api");
                }
    
                @Override
                public Object run() {
                    RequestContext context = RequestContext.getCurrentContext();
                    String path = context.getRequest().getRequestURI();
                    Route route = routeLocator.getMatchingRoute(path.substring(4));
                    if (route != null) {
                        context.put("proxy",route.getId());
                        context.put("requestURI", route.getPath());
                        context.set("serviceId", route.getLocation());
                    }
                    return null;
                }
            };
        }
    

    这是如何工作的:有属性zuul.routes.api=/api/** ,它实际上没有做任何事情。 它只允许将所有匹配的路径映射到Zuul过滤器链(在文档中描述)。 这里描述的所有其他路由都是根据没有/api设置的。 它允许达到这样的服务: http://app.com/requests : http://app.com/requests例如对于请求服务。 ZuulFilter执行对属性中描述的每个请求的检查,但只有在请求的URI以/api开头并且它以与路径中没有任何/api相同的方式重定向该请求时才会运行。

    它真的有效。 但我仍然不喜欢这个解决方案,因为没有/api前缀的端点仍然保留在网关服务上。 可能有人知道如何改进它?


    我会做以下事情:

  • 删除zuul.prefix属性。
  • to all of your zuul.routes。*。path`属性前面加上'api的前缀。
  • 添加具有以下属性的最终路由(到列表的末尾):

  • app:
      path: /**
      stripPrefix: false
    

    (3)非常重要,因为这里的路线顺序很重要。 这是传入请求将评估路由是否匹配的顺序。 在yaml中执行此操作也很重要,因为订单将保留下来,可能不包含属性文件(根据文档)。

    链接地址: http://www.djcxy.com/p/38157.html

    上一篇: Zuul route from root path

    下一篇: Plot training, validation and test set accuracy