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. 为什么Eureka比ZooKeeper更适合做注册中心?
  2. Linux终端设备详解
  3. 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc
  4. centos nginx不是命令_虚拟机下Centos 8.0 安装PHP+Mysql+Nginx
  5. php语言冒泡法,冒泡排序法(php)
  6. Oracle行列转换小结
  7. getContentResolver().query()方法selection参数使用详解(转)
  8. 帝国CMS7.5仿《问答库》题库问答学习平台网站源码 带手机版
  9. dj鲜生-03-用户模块的创建与模型类的创建
  10. 2018第一场多校 -补题
  11. H3C三层交换机划分VLAN示例
  12. C#中BackgroundWorker的介绍
  13. 编译原理实验五:编译器自动生成工具
  14. 三种PS切图方法—简单易懂
  15. 学习3D建模电脑配置要求
  16. C# Teechart Pareto图实现 折线显示百分比,多坐标轴显示等
  17. 骨传导耳机的音质怎么样?
  18. WebGL入门(六)-通过坐标计算实现图形的平移、旋转和缩放变换
  19. 纪念Dropbox君
  20. 论文查重时图片会不会被检测?

热门文章

  1. proteus仿真micropython_基于micropython的滑动平均滤波器
  2. 专栏导读:数据驱动的优化
  3. 作者:赵妍妍(1983-),女,哈尔滨工业大学机电学院媒体技术与艺术系副教授、硕士生导师。...
  4. oracle PL/SQL编程基础
  5. 【操作系统】核心知识归纳总结
  6. 【软件质量】改善结构松散的代码
  7. 【离散数学】极小全功能集
  8. 快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server
  9. 推荐您使用 Markdown 来编辑文章
  10. 【SQL Server配置管理器】提示:无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问...