Java 基于查询参数动态更改Zuul中路由的url
正如标题所示,我希望根据给定的查询参数更改url。例如,如果我要求: http://api.company.com/path?service=A >>通往上游A的路线 http://api.company.com/path?service=B >>通往上游B的路线 我尝试了基于或的多个不同版本。这些示例都不起作用,也没有提供完整的环境代码+配置文件列表 当前非工作版本: application.yml: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
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
检查我的答案,然后你就不能写一个路由过滤器吗?若路由是基于查询参数的,则路由筛选器将不起作用。