【问题标题】:Dynamic Proxying with Zuul使用 Zuul 进行动态代理
【发布时间】:2016-06-28 05:22:50
【问题描述】:

我正在尝试根据一些 cookie 信息使用 Zuul 进行代理。我想我将不得不编写一些过滤器来实现动态过滤。 Presumably, something as describe in this thread:

第一个问题是我无法进行基本测试。我查看了 PreDecorationFilter 过滤器并尝试对转发部分进行建模。这产生了以下基本过滤器:

     @Bean
 public ZuulFilter myFilter() {
     return new ZuulFilter(){
                private UrlPathHelper urlPathHelper = new UrlPathHelper();

                 @Override
                 public Object run() {
                         RequestContext ctx = RequestContext.getCurrentContext();
                         final String requestURI = this.urlPathHelper.getPathWithinApplication(ctx.getRequest());
                         ctx.put("requestURI", requestURI);
                         ctx.set("forward.to", "localhost:8983");
                         ctx.setRouteHost(null);
                         return null;
                 }

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

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

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

我的问题是这不起作用。当我从浏览器热 Zuul 时,过滤器被调用,但转发并没有真正发生。我收到内容长度为 0 的响应。

我遗漏了哪些拼图?

编辑:添加我的 application.yml 内容:

info:
    component: Zuul Server

endpoints:
    restart:
        enabled: true
    shutdown:
       enabled: true
    health:
       sensitive: false

server:
   port: 8080

zuul:
   proxy:
      addProxyHeaders: true
   routes:
      dynamic:
          path: /dynamic/**
          url: http://route-to-nowhere.com

【问题讨论】:

  • 你的路由配置是什么?
  • 添加了我的配置。 route-to-nowhere.com 不存在,因为我不希望在那里路由。我希望动态提供真正的目的地。

标签: spring-cloud netflix-zuul


【解决方案1】:

我想我找到了答案。我应该设置 routeHost 而不是 URI 和 forward.to。以下代码适用于我。它会忽略 application.yml 中的条目并路由到我动态指定的主机。

@Bean
 public ZuulFilter myFilter() {
     return new ZuulFilter(){
                 @Override
                 public Object run() {
                         RequestContext ctx = RequestContext.getCurrentContext();
                         try {
                            ctx.setRouteHost(new URL("http://localhost:8983"));
                        } catch (MalformedURLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                         return null;
                 }

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2017-09-30
    • 2018-09-20
    • 2019-02-15
    • 2023-03-24
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多