routing zuul_zuul自定义SimpleHostRoutingFilter
序
zuul的SimpleHostRoutingFilter主要用來轉(zhuǎn)發(fā)不走eureka的proxy,里頭是使用httpclient來轉(zhuǎn)發(fā)請求的,但是有時候我們需要改動相關(guān)httpclient的配置,這個時候,就需要修改SimpleHostRoutingFilter了,這里講一下如何擴(kuò)展SimpleHostRoutingFilter。
自定義SimpleHostRoutingFilter
比如把httpclient的CookieSpec設(shè)置為default,比如把SSLContext升級為TLSv1.2
public class CustomHostRoutingFilter extends SimpleHostRoutingFilter{
private static final Logger LOGGER = LoggerFactory.getLogger(CustomHostRoutingFilter.class);
@Value("${zuul.host.socket-timeout-millis}")
int SOCKET_TIMEOUT;
@Value("${zuul.host.connect-timeout-millis}")
int CONNECTION_TIMEOUT;
private ZuulProperties.Host hostProperties;
private boolean sslHostnameValidationEnabled;
private PoolingHttpClientConnectionManager connectionManager;
public CustomHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties properties) {
super(helper, properties);
this.sslHostnameValidationEnabled = properties.isSslHostnameValidationEnabled();
this.hostProperties = properties.getHost();
LOGGER.error("CustomHostRoutingFilter init");
}
@Override
protected CloseableHttpClient newClient() {
final RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(SOCKET_TIMEOUT)
.setConnectTimeout(CONNECTION_TIMEOUT)
// 這里改為default
.setCookieSpec(CookieSpecs.DEFAULT).build();
HttpClientBuilder httpClientBuilder = HttpClients.custom();
if (!this.sslHostnameValidationEnabled) {
httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
}
return httpClientBuilder.setConnectionManager(newConnectionManager())
.disableContentCompression()
.useSystemProperties().setDefaultRequestConfig(requestConfig)
.setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
.setRedirectStrategy(new RedirectStrategy() {
@Override
public boolean isRedirected(HttpRequest request,
HttpResponse response, HttpContext context)
throws ProtocolException {
return false;
}
@Override
public HttpUriRequest getRedirect(HttpRequest request,
HttpResponse response, HttpContext context)
throws ProtocolException {
return null;
}
}).build();
}
@Override
protected PoolingHttpClientConnectionManager newConnectionManager() {
try {
// 這里改為TLS
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates,
String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates,
String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
} }, new SecureRandom());
RegistryBuilder registryBuilder = RegistryBuilder
. create()
.register(HTTP_SCHEME, PlainConnectionSocketFactory.INSTANCE);
if (this.sslHostnameValidationEnabled) {
registryBuilder.register(HTTPS_SCHEME,
new SSLConnectionSocketFactory(sslContext));
}
else {
registryBuilder.register(HTTPS_SCHEME, new SSLConnectionSocketFactory(
sslContext, NoopHostnameVerifier.INSTANCE));
}
final Registry registry = registryBuilder.build();
this.connectionManager = new PoolingHttpClientConnectionManager(registry, null, null, null,
hostProperties.getTimeToLive(), hostProperties.getTimeUnit());
this.connectionManager
.setMaxTotal(this.hostProperties.getMaxTotalConnections());
this.connectionManager.setDefaultMaxPerRoute(
this.hostProperties.getMaxPerRouteConnections());
return this.connectionManager;
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
配置自定義的filter
@Configuration
@EnableZuulProxy
public class CustomZuulProxyConfig extends ZuulProxyConfiguration{
@Bean
@Override
public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties) {
return new CustomHostRoutingFilter(helper, zuulProperties);
}
}
這樣就大功告成了
doc
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的routing zuul_zuul自定义SimpleHostRoutingFilter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [云炬创业管理笔记]第6章制定创业行动测
- 下一篇: [云炬创业管理笔记]第6章制定创业行动测