Zuul 动态代理
Dynamic Proxying with Zuul
我正在尝试根据一些 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
我想我找到了答案。我应该设置 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";
}};
}
我正在尝试根据一些 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
我想我找到了答案。我应该设置 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";
}};
}