【问题标题】:Zuul reverse proxy preserve URLZuul 反向代理保留 URL
【发布时间】:2017-02-08 18:21:53
【问题描述】:

我有一个微服务架构,其中有几个使用 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=2zuul 时,会将用户重定向(http 302 状态)到 id 为 2 的 url,在本例中为 google.com。

如何保留来自客户端的原始请求 URL?

网址必须保留为http://myservice/serviceid/reverseproxy?url=2 而不是http://www.google.com

提前致谢。

【问题讨论】:

    标签: nginx url-rewriting reverse-proxy jhipster netflix-zuul


    【解决方案1】:

    您似乎误解了重定向和代理的概念。

    HTTP 重定向意味着 URL 更改,因为所有工作都由客户端完成,最终通过发出 2 次请求调用(一个到您的代理,一个到外部服务)。

    您想要的是将原始请求代理到外部服务(在您的示例中 google),这意味着您的过滤器应该是您的外部服务的客户端。这样一来,您的原始客户只会根据请求进行调用,并且不知道它正在与您的外部服务通话。

    【讨论】:

    • 感谢您的解释。是否可以使用 zuul 进行代理?或者我必须使用像 nginx 这样的其他工具?
    • Zuul 是代理,所以是有可能的。与 ngninx 的区别在于,在 Zuul 中,您可以在 java 中构建自己的业务逻辑。因此,如果您的代理规则很简单,那么 ngninx 就可以完成这项工作。
    • 让我回顾一下。我必须创建一个路由过滤器,在 run 方法中创建一个获取“外部”URL 内容的 HttpClient ?你能举个例子吗?
    • 对,您如何实现过滤器在很大程度上取决于您所针对的外部服务类型。
    • 外部服务将是 google.com 或 facebook.com 等 Web 应用程序(仅作为示例)。创建一个过滤器来管理这种资源很复杂,最好使用nginx。我错了吗?
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2016-09-16
    • 2019-01-21
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多