从根路径的Zuul路线

Val*_*lov 8 java spring-boot spring-cloud netflix-zuul

我有一些与Eureka一起发现的微服务.他们中的大多数提供了一些API.我有"边缘"服务,称为"网关服务",实际上是Zuul代理.问题是有一个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
Run Code Online (Sandbox Code Playgroud)

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

我的任务是:

  1. 使Web应用程序托管在可从根路径获得的其他服务上.
  2. /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: /**
Run Code Online (Sandbox Code Playgroud)

而且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;
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:有些财产zuul.routes.api=/api/**实际上没有做任何事情.它只允许将所有匹配的路径映射到Zuul过滤器链(在文档中描述).这里描述的所有其他路线都设置为完全没有/api.它允许达到这样的服务:http://app.com/requests例如,用于请求服务.在ZuulFilter执行检查中的属性描述每个请求,但只有在请求的URI开头运行/api和像没有任何它将此请求重定向同样/api的路径.

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

nic*_*ild 4

我会做以下事情:

  1. 放下zuul.prefix财产。
  2. 添加 'api zuul.routes.*.path` 属性的前缀to all of your
  3. 添加具有以下属性的最终路由(到列表末尾):

app:
  path: /**
  stripPrefix: false
Run Code Online (Sandbox Code Playgroud)

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