[转载]HTTPCLIENT性能调优

 

httpclient的默认配置提供了最大的可靠性和标准的遵守,而不是性能。(哪个标准?难道是指HTTP协议规范?)有几个配置选项和优化技术,可以显着提高httpclient 的性能表现。 本文档给出了对httpclient如何调优的大纲。

1.重用HTTPCLIENT实例。

          一般说来,建议一个通讯组件,甚至说一个应用软件就始终维持一个HttpClient对象实例存在。但是如果你的应用很稀罕才用到它,而且还不允许这么一个实例一直存在,那么,这里强烈建议,每次在disposing 它之前,一定要显式地shut down 它的 multithreaded connection manager 。这样做是确保连接池里的connection得到释放

2.持续连接不关闭。

httpclient总是尽量重用连接。它不要求任何配置,默认情况下就是这样。某些情况下,这可能导致连接泄漏,而耗尽资源。禁用持续连接最简单的方法是提供或扩展一个connection manager,在releaseConnection被调用的时候,这个connection manager将把connection真正关闭掉

3.http method的并发执行。(实际上是在对1.延伸)
如果应用程序逻辑允许并发执行多个HTTP请求,(例如对多个服务器的多个并发请求,或对同一个服务器代表不同用户身份的多个请求) ,应用程序可以为每一个HTTP session开启一个专门的线程,这样的设计自然将带来显著的性能提升。 而当使用一个线程安全的连接管理器,如multithreadedhttpconnectionmanager时,HttpClient能保证线程安全。这样,多个线程可以共享这么一个线程安全的HttpClient实例。请注意,应用程序的每个各自执行的线程必须使用各自的httpmethod实例;并且可配置各自的httpstate实例和/或hostconfiguration实例(代表一个特定的会话状态和主机配置)。这个共享的HttpClient和其标配的multithreadedhttpconnectionmanager将为各线程带来最高的性能
4.request/response entity 流技术处理
HttpClient能够有效地流处理request,response。就是说大的entity可以不用在内存(泛滥)缓存就发送或接收。这点在多请求并发时尤其关键。虽然提供了方法可以通过访问字符串或字节组的方式处理数据(而不是通过流),但是不建议这样做。因为除非特别仔细,这样做很容易引起内存溢出,因为这些方法实际上是把整个entity都缓存在了内存中。
response流API:建议使用HttpMethod#getResponseBodyAsStream,将response体作为字节/字符流处理;不建议使用HttpMethod#getResponseBody 和HttpMethod#getResponseBodyAsString 。
request流API:对于request的流处理,技术难题在于如果通讯过程出现问题(认证失败或io失败),那么需要对发送的request entity进行重新获取,重新发送。很明显,(request的数据来源于应用程序的各个方面),除了可以提供API(NameValuePair 形式)处理可完全缓存在内存的数据(字节组等),不容易提供统一的API。因此(对于大块的entity),程序员可通过自行继承
RequestEntity,在相应回调方法里进行流化处理。

5.Expect-continue handshake

HTTP提供HTTP 100 (Continue) 状态,是指客户端发送一个“预期HTTP100”的请求header,如果服务器响应100说明接受该客户端请求,则客户端继续发送body。是啊,如果服务器通过header就能判断是否响应100还是拒绝,那么不通过这条路就直接发送body(尤其是大body)真的太浪费资源了。授权拒绝是最典型的情形了。因此强烈建议对于那些有HTTP认证要求的服务器使用“预期HTTP100”这种通讯方式。注意如果通讯要通过代理,程序员要处理可能的警告,因为一些老的HTTP1.0代理服务器不能正确处理“预期HTTP100”通讯方式。
6. 钝态连接的检查
HTTP协议规范允许客户端或服务器端不知会对方,在任意时刻都可以终止一个连接(指底层网络连接),因此这个connection就变成了钝态或者说陈旧了,反正是不能用了。在默认情况下,HttpClient 会在执行HTTP方法前检查要用的连接,看看是否是钝态。这个检查需耗时15-30ms,根据使用的jre不同而不同。关闭这个检查能带来小部分的性能提升,尤其对于小负载response这种通讯。但是关闭后可能面临底层连接已关闭的异常(服务器主动关闭但没通知客户端)。
7.Cookie 处理
如果一个应用程序,例如web spider,不需要和服务器保持会话状态,则禁用cookie会带来轻微的性能提升。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在进行Spring Cloud Gateway的性能调优时,可以考虑以下几个方面: 1. 版本升级:确保使用最新的Spring Boot、Spring Cloud和Spring Cloud Alibaba版本,因为新版本通常会修复一些性能问题并引入一些优化。 2. 配置调整:根据实际情况对Spring Cloud Gateway的相关配置进行调整。比如,可以通过调整`spring.cloud.gateway.httpclient.pool.type`参数来选择合适的连接池类型(例如ELASTIC、FIXED或DISABLED)。此外,还可以调整连接池的最大连接数(`spring.cloud.gateway.httpclient.pool.max-connections`)和其他相关连接参数,以提高性能。 3. 路由优化:检查并优化Gateway的路由配置。可以通过减少路由规则的数量、简化路由规则表达式、合并相似的路由规则等方式来优化路由的性能。 4. 缓存机制:如果可以,考虑使用缓存机制来减轻后端服务的负载。可以使用Spring Cloud Gateway的内置缓存功能或者结合其他缓存组件来实现。 5. 异步处理:对于处理比较耗时的请求,可以考虑使用异步处理来提高性能。可以使用Spring Cloud Gateway的异步处理功能,将请求转发给异步处理的线程池进行处理。 总结起来,对于Spring Cloud Gateway的性能调优,可以从版本升级、配置调整、路由优化、缓存机制和异步处理等方面入手,根据具体需求和场景进行优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Spring Cloud Gateway 服务器性能异常,以及优化策略](https://blog.csdn.net/weixin_42321034/article/details/123284715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [spring cloud gateway性能优化](https://blog.csdn.net/weixin_42161936/article/details/123395773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值