我的前端应用程序将环境属性附加为URI中的前缀-我很难让Zuul剥离此前缀。
例如,前端应用程序正在本地http://localhost:9080/local/domains/metrs/subdomains/medicare/base-templates/向Zuul代理发出请求。 Zuul需要剥离在URL中看到的“本地”环境,然后转发到位于http://localhost:9090/icews/admin/domains/metrs/subdomains/medicare/base-templates/
处的Web服务(剥离了“ local”环境)。不幸的是,由于没有删除前缀“ local”,所以我收到404错误-当读取托管Web服务的服务器上的日志时,我仍然看到呼叫中转发了环境“ local”。
这是我的Zuul配置:
ice.ws.local.url=http://localhost:9090/icews/admin
ice.ws.dev.url=http://developmentserver/icews/admin
zuul.routes.base-templates.path=/local/**/base-templates/**
zuul.routes.base-templates.url=${ice.ws.local.url}
zuul.routes.base-templates.strip-prefix=true
zuul.routes.base-templates.path=/dev/**/base-templates/**
zuul.routes.base-templates.url=${ice.ws.dev.url}
zuul.routes.base-templates.strip-prefix=true
更新 我继续使用下面概述的方法:https://github.com/spring-cloud/spring-cloud-netflix/issues/1893和https://github.com/spring-cloud/spring-cloud-netflix/issues/2408
答案 0 :(得分:0)
我没有在application.properties中使用带前缀,而是遵循了https://github.com/spring-cloud/spring-cloud-netflix/issues/1893
中概述的方法。特别是对于我的前端需要在不同环境(每个都是不同的微服务)上进行路由的情况,我还有另一个Zuul过滤器,其运行顺序为6(PRE_DECORATION_FILTER_ORDER + 1):
@Component
public class PostDecorFilter extends ZuulFilter {
@Value("${zuul.PostSendResponseCustomFilter.post.disable:false}")
private boolean isDisableFilter;
@Override
public int filterOrder() {
// run this filter after zuul..PreDecorationFilter
return PRE_DECORATION_FILTER_ORDER + 1;
}
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public boolean shouldFilter() {
return !isDisableFilter;
}
/**
* Add custom response processing here
*
* @return
*/
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
// environment is added by frontend Angular app, e.g. dev, dev-t, qa, qa-t
String environment = RequestContext.getCurrentContext().getRequest().getRequestURI().split("/")[1];
if ( "dev".equals(environment) || "dev-t".equals(environment) || "qa".equals(environment) || "qa-t".equals(environment) ) {
// e.g. /dev/some/resource/
String requestUriWithEnvironment = RequestContext.getCurrentContext().getRequest().getRequestURI();
// e.g. /some/resource/
String requestUriWithoutEnvironment =
requestUriWithEnvironment.substring(environment.length() + 1);
context.put(REQUEST_URI_KEY, requestUriWithoutEnvironment);
}
return null;
}
我还必须使用此处概述的CustomRouteLocator:https://github.com/spring-cloud/spring-cloud-netflix/issues/2408
原因是application.properties中的路径是
ice.ws.local.url=http://localhost:9090/icews/admin
ice.ws.dev.url=http://developmentserver/icews/admin
zuul.routes.base-templates.path=/local/**/base-templates/**
zuul.routes.base-templates.url=${ice.ws.local.url}
zuul.routes.base-templates.path=/dev/**/base-templates/**
zuul.routes.base-templates.url=${ice.ws.dev.url}
从本质上讲,我的行为与此处概述的相同:“似乎SimpleRouteLocator遍历所有路由,而不是按照它们在配置文件中的顺序进行迭代,而只是选择第一个匹配项” https://github.com/spring-cloud/spring-cloud-netflix/issues/2408