很多时候我们都会把zuul网关作为各种应用系统后端的所有请求的前门,对接收的所有请求进行过滤然后再转发到各个各种应用系统,其中路由便是zuul网关转发请求的关键。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
zuul的路由有两种路由:
1、传统路由:路由规则映射具体的url路径
2、面向服务路由:路由规则映射到服务发现的服务ID(serviceId),如下:
zuul:
routes:
demo1: #传统路由
path: /demo1/**
url: http://localhost:8000/
stripPrefix: true
demo2: #面向服务路由
path: /demo2/**
serviceId: demo2
stripPrefix: true
目前碰到了这么一个需求,某系统url需要通过传统路由需要通过正向代理才能访问到。
解决方法,重写spring-cloud-netfix-zuul包中的SimpleHostRoutingFilter类的CloseableHttpClient newClient() 方法,代码如下:
protected CloseableHttpClient newClient() {
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(
this.hostProperties.getConnectionRequestTimeoutMillis())
.setSocketTimeout(this.hostProperties.getSocketTimeoutMillis())
.setConnectTimeout(this.hostProperties.getConnectTimeoutMillis())
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
//添加正向代理
SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(new ProxySelector() {
@Override
public List<Proxy> select(URI uri) {
ArrayList<Proxy> noProxies = new ArrayList<>();//设置不需要正向代理
noProxies.add(Proxy.NO_PROXY);
ArrayList<Proxy> proxies = new ArrayList<>();//设置需要正向代理
int port= 8000;//端口号
String ip = "";//正向代理地址
proxies.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip,port)));
//自定义判断条件,根据条件返回是否需要正向代理
if (true){
return noProxies;
}
return proxies;
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
log.error("connectFailed 的uri" + uri);
}
});
return httpClientFactory.createBuilder().setDefaultRequestConfig(requestConfig)
.setRoutePlanner(routePlanner)
.setConnectionManager(this.connectionManager).disableRedirectHandling()
.build();
}