URL-адрес сохранения обратного прокси-сервера Zuul

У меня есть микросервисная архитектура с несколькими сервисами, созданными с использованием JHipster.

Внутри одного сервиса я реализовал фильтр zuul route.

public class TestZuulFilter extends ZuulFilter {

  @Override
  public String filterType() {
      return "route";
  }

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

  @Override
  public boolean shouldFilter() {
      String requestUri = RequestContext.getCurrentContext().getRequest().getRequestURI();
      return "/serviceid/reverseproxy".equals(requestUri);
  }

  @Override
  public Object run() {

       // get url from id
       String id = ctx.getRequest().getParameter("id"); 
       Strign url = URLService.getURLFromId(id);

       try 
       {
          RequestContext ctx = RequestContext.getCurrentContext();

          // redirect
          ctx.setRouteHost(new URL(url));

       } catch(MalformedURLException ex) {}

       return null;
  }
}

Когда клиент вызывает мою службу, http://myservice/serviceid/reverseproxy?id=2 zuul перенаправляет (состояние http 302) пользователя на URL-адрес с идентификатором 2, в данном случае google.com.

Как я могу сохранить исходный URL-адрес запроса от клиента?

URL-адрес должен оставаться http://myservice/serviceid/reverseproxy?url=2 вместо http://www.google.com

Заранее спасибо.


person DropTheCode    schedule 30.09.2016    source источник


Ответы (1)


Кажется, вы неправильно поняли концепции перенаправления и проксификации.

Перенаправление HTTP означает изменение URL-адреса, потому что вся работа выполняется клиентом, который в конечном итоге делает 2 вызова запроса (один на ваш прокси-сервер и один на внешнюю службу).

Здесь вы хотите проксировать исходный запрос к внешней службе (в вашем примере Google), это означает, что ваш фильтр должен быть клиентом вашей внешней службы. Таким образом, ваш первоначальный клиент делает вызов только по запросу и не знает, что он разговаривает с вашей внешней службой.

person Gaël Marziou    schedule 30.09.2016
comment
Спасибо за объяснение. Можно ли сделать проксирование с помощью zuul? Или мне нужно использовать другой инструмент, например nginx? - person DropTheCode; 30.09.2016
comment
Zuul — это прокси, так что да, это возможно. Разница с ngninx в том, что в Zuul вы можете построить свою собственную бизнес-логику на java. Так что, если ваши правила проксификации просты, ngninx справится с этой задачей. - person Gaël Marziou; 30.09.2016
comment
Позвольте мне резюмировать. Мне нужно создать фильтр маршрута, внутри метода запуска создать HttpClient, который получает содержимое внешнего URL-адреса? Можете ли вы привести мне пример? - person DropTheCode; 30.09.2016
comment
ПРАВИЛЬНО, то, как вы реализуете свой фильтр, будет сильно зависеть от того, на какой внешний сервис вы ориентируетесь. - person Gaël Marziou; 30.09.2016
comment
Внешними службами будут веб-приложения, такие как google.com или facebook.com (просто примеры). Создать фильтр для управления такого рода ресурсами сложно, и лучше использовать nginx. Я ошибаюсь ? - person DropTheCode; 30.09.2016
comment
Проксирование веб-приложения всегда сложно, а иногда и невозможно из-за ссылок, доменов и т. д. Ваш контекст слишком расплывчат. На вашем месте я бы попытался построить доказательство концепции без какого-либо программирования с использованием nginx, таким образом вы сможете оценить осуществимость. - person Gaël Marziou; 30.09.2016
comment
Я буду использовать nginx, потому что это намного проще. Спасибо за вашу помощь. Очень признателен - person DropTheCode; 04.10.2016