汇集 httpclient 的最佳方法是什么?
What is the best way for pooling httpclient?
我的主要目标是以静默方式或以某种方式汇集一个 httpclient,我想调用一个方法给我一个 httpclient...因为我认为它对每个 rest 调用来说太耗资源添加一个新的 httpclient实例和设置等等...是否有最佳实践?
如果您参考Apache
HTTP 客户端,那么您可以按照以下步骤操作:
仅启动 Apache
HTTP 客户端一次,因为它是线程安全的,您可以安全地重用它。如果您使用 Spring 那么将它作为 Bean 存储在 Spring 上下文中应该是安全的。有关线程安全,请参阅以下 link。
尽管 HTTP 客户端实例本身没有池化(因为您将使用它的单个实例),但您可以通过在 HTTP 客户端上配置池化连接管理器来提高性能。有关详细信息,请参阅以下 link。
(在该页面上搜索 'Pooling connection manager')。实际代码应该类似于下面的代码片段:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("localhost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
希望这对您有所帮助。
我的主要目标是以静默方式或以某种方式汇集一个 httpclient,我想调用一个方法给我一个 httpclient...因为我认为它对每个 rest 调用来说太耗资源添加一个新的 httpclient实例和设置等等...是否有最佳实践?
如果您参考Apache
HTTP 客户端,那么您可以按照以下步骤操作:
仅启动
Apache
HTTP 客户端一次,因为它是线程安全的,您可以安全地重用它。如果您使用 Spring 那么将它作为 Bean 存储在 Spring 上下文中应该是安全的。有关线程安全,请参阅以下 link。尽管 HTTP 客户端实例本身没有池化(因为您将使用它的单个实例),但您可以通过在 HTTP 客户端上配置池化连接管理器来提高性能。有关详细信息,请参阅以下 link。 (在该页面上搜索 'Pooling connection manager')。实际代码应该类似于下面的代码片段:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("localhost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
希望这对您有所帮助。