Трасса матча в весеннем зууле на основе строгого соответствия - PullRequest
0 голосов
/ 10 октября 2018

Сводка: ZUUL не выбирает правильный URL назначения для входного пути, так как он не выполняет строгое сопоставление входного пути.

Ниже приведены мои маршруты zuul:

zuul:
  routes: 
    auth:
      path: /v1/txn/**
      url: http://localhost:8900/v1/cardhostauth
    cardproduct: 
      path: /v1/customer/card/product/**
      url: http://localhost:8800/v1/customer/card/product
    cardcomposite:
      path: /v1/customer/**
      url: http://localhost:8400/v1/composite

Для вводапуть: "/ v1 / customer / card / product /", ожидается, что он выберет - http://localhost:8800/v1/customer/card/product, но он выберет http://localhost:8400/v1/composite. Я ожидал, что сопоставление с шаблоном пути произойдет в указанном порядке и будетболее строгим, но, кажется, это не работает таким образом.

Можете ли вы дать мне знать, как работает ZUUL, когда для одного и того же входного пути определено несколько маршрутов?

Thx

PS - Iможет увидеть эту проблему, когда я запускаю через Docker в AWS, но проблема не возникает, когда я бегу из затмения.Порядок маршрута zuul зависит от источника zuul jar (spring-cloud-starter-netflix-zuul - 2.0.0.RELEASE vs 2.0.1.RELEASE)

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Редактирование ответа на основе официальной документации Zuul: https://cloud.spring.io/spring-cloud-netflix/multi/multi__router_and_filter_zuul.html

Если вам нужно, чтобы ваш маршрут сохранил свой порядок, вам нужно использовать файл YAML, так как при использованиифайл свойств.В следующем примере показан такой файл YAML:

application.yml.

 zuul:
  routes:
    users:
      path: /myusers/**
    legacy:
      path: /**

Если вы используете файл свойств, старый путь может оказаться вперед пользовательским путем, делая пользовательский путь недоступным.

Убедитесь, что вы используете последнюю стабильную версию Spring Cloud (в настоящее время 2.0.2 )

0 голосов
/ 29 октября 2018

Я работаю с zuul 2 года назад, и я думаю, что лучший подход для работы с маршрутами zuul - это когда вы работаете с каким-либо сервисом обнаружения, например, с сервисом Eureka, который регистрирует ваше приложение.

Так что вам просто нужно добавить идентификатор службы

zuul:
  routes:
    auth: 
      path: /v1/txn/**
      service-id: txn-service
      strip-prefix: false
      sensitiveHeaders:
    cardproduct:
      path: /v1/customer/card/product/**
      service-id: card-service   // here you need to put application name .
      strip-prefix: false
      sensitiveHeaders:
    cardcomposite:
      path: /v1/customer/**
      service-id: customer-service
      strip-prefix: false
      sensitiveHeaders:
0 голосов
/ 23 октября 2018

Для выбора маршрута на основе лучшего соответствия я нашел эту ветку полезной (спасибо @maximdim).По сути, вы можете написать свой собственный маршрутизатор, чтобы выбрать наиболее подходящий маршрут.

https://github.com/spring-cloud/spring-cloud-netflix/issues/2408

Надеюсь, это поможет.(И поскольку это мой первый ответ, мои извинения, если он не очень хороший.)

Пример, взятый из потока github, выглядит следующим образом:

public class CustomRouteLocator extends SimpleRouteLocator {
    public CustomRouteLocator(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
    }

    @Override
    protected ZuulRoute getZuulRoute(String adjustedPath) {
        // Spring's AbstractUrlHandlerMapping already found best matching path for us
        // and stored it into request attribute. See AbstractUrlHandlerMapping.exposePathWithinMapping
        RequestContext ctx = RequestContext.getCurrentContext();
        String bestMatchingPattern = (String)ctx.getRequest().getAttribute(HandlerMapping.class.getName() + ".bestMatchingPattern");
        if (bestMatchingPattern == null) {
            return super.getZuulRoute(adjustedPath);
        }

        if (!matchesIgnoredPatterns(adjustedPath)) {
            return locateRoutes().get(bestMatchingPattern);
        }
        return null;
    }
}

@ maximdim:

Вместо дублирования логики для поиска «лучшего соответствия» я просто получаю его из атрибута запроса, где Spring's HandlerMapping сохраняет его.Возможно, немного хакерский, но мне кажется, что он работает.

...