文档章节

zuul自定义SimpleHostRoutingFilter

go4it
 go4it
发布于 2017/08/17 14:49
字数 346
阅读 12
收藏 0

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<ConnectionSocketFactory> registryBuilder = RegistryBuilder
                    .<ConnectionSocketFactory> 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<ConnectionSocketFactory> 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

© 著作权归作者所有

go4it
粉丝 90
博文 1128
码字总数 1059793
作品 0
深圳
私信 提问
Spring Cloud Zuul记录接口响应数据

系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题。 如果需要在Zuul中进行详细的日志记录,这两种日志必不可少。 API请求信息 AP...

尹吉欢
2018/08/06
0
0
Spring cloud中zuul如何实现单点登录

1.参考资料 项目:https://github.com/kakawait/uaa-behind-zuul-sample/,按照这个项目实现后,虽然会跳转到认证服务的登录页,但登录成功后无法跳转回来,原因是做了二次302,具体情况是 先...

wilesun
2016/12/07
1K
0
实用技巧:快速定位Zuul的性能瓶颈

Zuul的性能不是特别好,特别是,某些项目对Zuul进行了一些扩展,代码还不那么考究时。 如何快速定位出Zuul的性能瓶颈呢?我们知道,Zuul的核心是过滤器,Zuul大多功能都是基于过滤器实现的。...

周立_ITMuch
03/25
409
0
【SpringCloud】Zuul在何种情况下使用Hystrix

首先,引入 spring-cloud-starter-zuul 之后会间接引入: hystrix依赖已经引入,那么何种情况下使用hystrix呢? 在Zuul的自动配置类 ZuulServerAutoConfiguration 和 ZuulProxyAutoConfigura...

微笑向暖wx
2018/11/26
18
0
Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式。 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实...

ityouknow
2018/10/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
6
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
14
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部