Как сделать контентную динамическую маршрутизацию в zuul? - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над архитектурой на основе микроуслуг, которая включает Spring-Boot, Eureka, Zuul на ключевом уровне.Моя проблема заключается в следующем:

Service1: / api / v1 / service1 POSTService2: / api / v2 / service2 POST

application.yml выглядит как

zuul:
    routes:
        service1:
            path: /api/v1/**
        service2:
            path: /api/v1/**
        common:
            path: /common/endpoint

Кроме того, я написал фильтр, в котором я пытаюсь получить ввод через эту общую конечную точку и вычесть на основеотправить запрос, куда направить запрос, т. е. на service1 или service2.Но здесь я застрял и, похоже, ничего не получается, даже после нескольких поисков в Google и проверки проблем других людей, я пока не могу найти свое решение.Вот как выглядит мой Фильтр:


public class CommonEndpointFilter extends ZuulFilter {

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        if ((ctx.get("proxy") != null) && ctx.get("proxy").equals("common")) {
            return true;
        }
        return false;
    }

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

        InputStream in = (InputStream) ctx.get("requestEntity");
        if (in == null) {
            try {
                in = request.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String body = null;
        try {
            body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));

            if (body.indexOf("somethingrelatedtoservice1") != -1) {
                //forward the request to Service1: /api/v1/service1
            } else if (body.indexOf("somethingrelatedtoservice2") != -1) {
                //forward the request to Service2: /api/v1/service2
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String filterType() {
        return FilterConstants.ROUTE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 0;
    }
}

Я не могу понять, как направить запрос дальше этим службам, а затем получить ответ для отправки обратно через общую конечную точку.

Что я здесь не так делаю?Как я могу продолжить, чтобы мне не пришлось использовать жестко запрограммированный URL-адрес какой-либо службы.Пожалуйста, проведите меня через это.

Я пробовал некоторые вещи, такие как:1. используя DiscoveryClient для получения экземпляра и использования метода контекста setRouteHost.Он всегда выбрасывает исключительный URL-адрес zuulfilter, неправильный общий / конечная точка добавляется после URL-адреса службы, полученного через DiscoveryClient.2. Я попробовал самую глупую вещь, которая пришла мне в голову, используя RestTemplate, чтобы сделать запрос и получить ответ, и поместить его в контекстный ответ, который тоже не работал, однако запрос был перенаправлен в службу, но я не получил никакого ответа.

Любая помощь приветствуется !!

...