Динамически изменить URL-адрес маршрута в Zuul на основе параметра запроса - PullRequest
0 голосов
/ 21 мая 2019

Как видно из названия, я хочу изменить URL-адрес на основе заданного параметра запроса. Так, например, если я запрашиваю:

Я пробовал несколько разных версий на основе , это , , это , , это или , что . Ни один из этих примеров не работал или не предоставил полную среду списка (код + файлы конфигурации).

Текущая не рабочая версия:

application.yml:

zuul:
  ignoredServices: '*'
  routes:
    serviceA:
      path: /statistics/**
      url: http://localhost:3000/a
    serviceB:
      path: /statistics/**
      url: http://localhost:3000/b

Предварительный фильтр для Zuul

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import java.net.URL;

import static com.netflix.zuul.context.RequestContext.getCurrentContext;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.*;


public class QueryParamServiceIdPreFilter extends ZuulFilter {

    public int filterOrder() {
        return PRE_DECORATION_FILTER_ORDER + 1;
    }

    public String filterType() {
        return PRE_TYPE;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    public Object run() {
        RequestContext ctx = getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        // always null
        URL routeHost = getCurrentContext().getRouteHost();

        if ( "A".equals(request.getParameter("serviceUrl")) ) {
            ctx.put("serviceId", "serviceA");
        }

        if ( "B".equals(request.getParameter("serviceUrl")) ) {
            ctx.put("serviceId", "serviceB");
        }

        return null;
    }
}

Поддельный микро сервис:

var express = require('express');
var app = express();
app.get('/a', function (req, res) {
  res.send('Service A');
});

app.get('/b', function (req, res) {
  res.send('Service B');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

Результат по вызову

$ curl "localhost:8071/statistics?serviceUrl=B" ;  echo; curl "localhost:8071/statistics?serviceUrl=A"
Service B
Service B⏎

1 Ответ

1 голос
/ 27 мая 2019

Ваш код выглядит хорошо, но вам не хватает службы обнаружения сервисов. Вы сказали:

ctx.put("serviceId", "serviceA");

но у вас нет идентификатора службы, вместо этого вы используете URL службы, здесь:

serviceA:
  path: /statistics/**
  url: http://localhost:3000/a

после настройки обнаружения службы у вас будет:

serviceA:
  path: /statistics/**
  serviceId: serviceA

Проверьте мои ответы здесь и здесь

...