Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于查询参数动态更改Zuul中路由的url_Java_Spring Cloud_Netflix Zuul - Fatal编程技术网

Java 基于查询参数动态更改Zuul中路由的url

Java 基于查询参数动态更改Zuul中路由的url,java,spring-cloud,netflix-zuul,Java,Spring Cloud,Netflix Zuul,正如标题所示,我希望根据给定的查询参数更改url。例如,如果我要求: http://api.company.com/path?service=A >>通往上游A的路线 http://api.company.com/path?service=B >>通往上游B的路线 我尝试了基于或的多个不同版本。这些示例都不起作用,也没有提供完整的环境代码+配置文件列表 当前非工作版本: application.yml: zuul: ignoredServices: '*' routes: ser

正如标题所示,我希望根据给定的查询参数更改url。例如,如果我要求:

http://api.company.com/path?service=A >>通往上游A的路线 http://api.company.com/path?service=B >>通往上游B的路线 我尝试了基于或的多个不同版本。这些示例都不起作用,也没有提供完整的环境代码+配置文件列表

当前非工作版本:

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⏎

您的代码看起来不错,但缺少的是服务发现。 你说:

ctx.put("serviceId", "serviceA");
但您没有定义服务id,而是使用服务url,如下所示:

serviceA:
  path: /statistics/**
  url: http://localhost:3000/a
配置服务发现后,您将拥有:

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

检查我的答案,然后

你就不能写一个路由过滤器吗?若路由是基于查询参数的,则路由筛选器将不起作用。