zuul的SimpleHostRoutingFilter主要用来转发不走eureka的proxy,里头是使用httpclient来转发请求的,但是有时候我们需要改动相关httpclient的配置,这个时候,就需要修改SimpleHostRoutingFilter了,这里讲一下如何扩展SimpleHostRoutingFilter。

自定义SimpleHostRoutingFilter

比如把httpclient的CookieSpec设置为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

routing zuul_zuul自定义SimpleHostRoutingFilter相关推荐

  1. SpringCloud Netflix复习之Zuul

    文章目录 写作背景 Zuul是什么 Zuul的核心功能 上手实战 SpringCloud中Zuul如何使用 自定义过滤器 配置全局Fallback降级 Zuul请求头Ribbon等其他参数配置 过滤敏 ...

  2. 腾讯DCI网络SDN SR-TE方案详解

    中国SDN/NFV大会由SDN/NFV产业联盟联合中国通信学会.中国通信标准化协会共同举办.作为国内规格最高.专业性最强.规模最大.影响最广的SDN/NFV技术产业盛会,"2018·中国SD ...

  3. ElasticSearch 文档路由,你的数据到底存在哪一个分片上_06

    es 是一个分布式系统,当我们存储一个文档到 es 上之后,这个文档实际上是被存储到 master 节点中的某一个主分片上. 例如新建一个索引,该索引有两个分片,0个副本,如下: 接下来,向该索引中保 ...

  4. 网易云课堂 Service Worker 运用与实践

    前言 本文首先会简单介绍下前端的常见缓存方式,再引入Service Worker的概念,针对其原理和如何运用进行介绍.然后基于google推出的第三方库Workbox,在产品中进行运用实践,并对其原理 ...

  5. 简单的了解下 Service Worker

    前言 本文首先会简单介绍下前端的常见缓存方式,再引入serviceworker的概念,针对其原理和如何运用进行介绍.然后基于google推出的第三方库workbox,在产品中进行运用实践,并对其原理进 ...

  6. 网关 zuul 线程阻塞分析

    网关 zuul 线程阻塞分析 本文基于一个线上真实问题.在 Zuul 无任何安全防护措施时,若遇到较大流量(单个Zuul应用在默认配置下200并发即可),将产生非常严重的后果. 本文主要是探寻下问题产 ...

  7. elasticsearch 自定义routing

    由于线上elasticsearch集群数据量越来越大,优化已经已经是重中之重. 优化的方式有很多中,网上一大堆,自行百度. 优化方案中有个叫routing的方案是个需要熟悉业务日志才能使用.于是我就研 ...

  8. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 1 # ...

  9. 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

最新文章

  1. C# 3.0 入门系列(一)
  2. jq塞入不同状态html的写法 switch (defaults.type)
  3. linux上安装activeMQ
  4. 《好未来编程题》求和
  5. 光纤转CAN总线在消防报警主机联网中的应用
  6. paramiko远程密码连接、批量连接主机
  7. java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
  8. rem布局下使用背景图片和sprite图
  9. jquery 一个元素包含多个class时
  10. 苹果七绕过基带激活2020_【最新!】绕过苹果ID可激活
  11. VBA常用实例 | OUTLOOK批量下载选中邮件中的附件
  12. 计算机桌面怎样创建文件,怎么在电脑桌面新建一个透明的文件夹?
  13. 分布式Redis集群解决方案
  14. 微信扫码登陆或注册设计流程
  15. 栈的应用之符号匹配问题
  16. (13)web安全|渗透测试|网络安全 注入/跨库查询/文件读写/常见的防护原理 详细图解
  17. Centos/Debian 占用CPU100%挖矿病毒清理
  18. 老鼠喝毒药问题分析及代码
  19. wind客户端python接口 java调用
  20. 前端日期选择器--只选择年或者年月的My97

热门文章

  1. sql怎么撤回update_零基础快速自学SQL,2天足矣!
  2. python安装jupyterlab_超级详细 centos7 安装 jupyter lab
  3. 【计算机科学基础】透明性
  4. 【JSON】JSON入门详解(二)
  5. C++学习笔记系列二
  6. 操作系统(八)进程管理——进程同步
  7. 2009 CCTV体坛风云人物颁奖盛典,精彩语录
  8. 【安全牛学习笔记】缓冲区溢出
  9. 使用git恢复未提交的误删数据
  10. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成...