2015-09-22 103 views
1

我有一个关于配置连接池的大小时单独使用Zuul,而不是使用功能区或其他Netflix组件的问题。Zuul连接池大小

我们有一个使用Zuul将请求代理到Mule服务器的系统。我们只使用Zuul而不使用Ribbon。我们定义了4条叫做Mule服务的路线。其中一项服务是长时间运行的,大概每次通话约3秒。

当我们用40个用户同时使用加载系统,我们得到这个错误

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:412) 
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:298) 
    at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:238) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423) 
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:115) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 
    at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.forwardRequest(SimpleHostRoutingFilter.java:262) 
    at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.forward(SimpleHostRoutingFilter.java:225) 
    at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.run(SimpleHostRoutingFilter.java:177) 
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) 

当我看着通过代码来弄清楚如何更改连接池的大小,发现这个代码

private static ClientConnectionManager newConnectionManager() throws Exception { 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    trustStore.load(null, null); 
    SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
    sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    registry.register(new Scheme("https", sf, 443)); 
    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(registry); 
    cm.setMaxTotal(Integer.parseInt(System.getProperty("zuul.max.host.connections", "200"))); 
    cm.setDefaultMaxPerRoute(Integer.parseInt(System.getProperty("zuul.max.host.connections", "20"))); 
    return cm; 
} 

起初我以为我所要做的就是增加zuul.max.host.connections的值,那会增加每个路由最大的大小,但是后来我发现使用相同的系统属性来设置总数最大连接数。

设置此系统参数的值是控制池大小的正确方法吗?还是应该使用Ribbon等其他组件来更好地管理这些连接?

+0

如果设置'-dzuul.max.host.connections'作品,我会与去。 – spencergibb

+0

@ stephen-inzer你有没有在这个问题上找到任何解决方案? – agpt

回答

1

如果你仍然在寻找解决方案,我采取了以下方法。

1-通过将 (-Dzuul.SimpleHostRoutingFilter.route.disable = true)作为系统属性禁用(SimpleHostRoutingFilter)。 - 编写您自己的自定义路由过滤器,在我的情况下,我复制(SimpleHostRoutingFilter),并进行一些修改,以便能够设置这些属性。

0

可以配置

zuul.host.maxTotalConnections=1000 
zuul.host.maxPerRouteConnections=100