Префикс полосы, чтобы удалить среду, переданную в URL - PullRequest
0 голосов
/ 25 апреля 2019

Мое приложение веб-интерфейса присоединяет атрибут среды в качестве префикса к URI - у меня возникают трудности с тем, чтобы Zuul удалил этот префикс.

Например, приложение веб-интерфейса отправляет локальный запрос Zuul-прокси http://localhost:9080/local/domains/metrs/subdomains/medicare/base-templates/. Zuul необходимо удалить среду "local", как показано в URL-адресе, и затем перейти к веб-службе, расположенной (со средой «локальный» удален) на http://localhost:9090/icews/admin/domains/metrs/subdomains/medicare/base-templates/

К сожалению, я получаю ошибку 404, потому что префикс «локальный» не удаляется - при чтении журналов на сервере, на котором размещен веб-сервис, явсе еще вижу среду "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

1 Ответ

0 голосов
/ 30 апреля 2019

Я не использовал префикс strip в 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

...