我有一些与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
我需要这样做,以便用户能够从这样的根路径访问Web应用程序http://app.com/
.但是现在我只能通过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
例如,用于请求服务.在ZuulFilter
执行检查中的属性描述每个请求,但只有在请求的URI开头运行/api
和像没有任何它将此请求重定向同样/api
的路径.
它确实有效.但我仍然不喜欢这个解决方案,因为没有/api
前缀的端点仍然保留在网关服务上.可能有人知道如何改进吗?