首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HTTP1明明是串行的,httpclient是怎么支持的异步呢?

HTTP1明明是串行的,httpclient是怎么支持的异步呢?

作者头像
用户12591013
发布2026-07-10 15:28:27
发布2026-07-10 15:28:27
00
举报

HTTP/1.1 的“单行道”——异步请求到底怎么走?

嗨,各位打工人!今天咱们聊点硬核却又不那么无聊的东西:HTTP/1.1 下的异步请求到底怎么跑?别担心,没有“茴香豆的四种写法”,只有接地气的“马路”比喻。

1. 单行道规则:HTTP/1.1 的“一根筋”

想象一条只能一辆车通行的乡间小路(TCP 连接)。

• 默认:车(请求)必须一辆接一辆开,前一辆没走完,后车只能干瞪眼。

• 官方外挂:HTTP Pipelining,理论上能让几辆车像火车车厢一样串着走。

• 现实:大多数收费站(服务器/代理/防火墙)不认这外挂,Apache、Java 自带的 HttpClient 也默认关着,怕出车祸。

2. 想并行?那就多修几条路!

既然一条小路堵车,那就多修几条并行的小路——这就是“多连接”。

• 连接池 = 停车场:停着一堆可随时上路的“共享汽车”(TCP 连接)。

• 线程池 = 司机休息室:负责真正踩油门、打方向盘(业务回调)。

• I/O 线程 = 红绿灯:只管读写字节,不让车撞车,不替你送货。

3. Apache HttpClient:老司机的玩法

代码片段

代码语言:javascript
复制
 var client = Dsl.asyncHttpClient(b -> b
       .setMaxConnections(100)          // 停车场总车位
       .setMaxConnectionsPerHost(10));  // 同一个目的地最多停 10 辆
   client.prepareGet("http://example.com/1").execute();
   client.prepareGet("http://example.com/2").execute();

场景复盘:

• 停车场里有空位?两辆车直接走不同的小路,并行呼啸而去。

• 没空位?第二辆车只能等第一辆车回来,继续走同一条小路,排队。

• 想玩 Pipelining?得自己改配置,风险自负,出了事故别哭。

4. Java 11+ HttpClient:官方“滴滴”

它更鸡贼:

• 默认先问服务器“能不能上高速(HTTP/2)?”能就直接多车道并行,爽歪歪。

• 不能就退回乡间小路,规则同上——多修路,少哔哔。

5. 老司机的生存指南

• 车位不够?把停车场扩建:

代码语言:javascript
复制
.setMaxConnections(200)

• 能上高速就上高速:确认服务器支持 HTTP/2,直接起飞。

• 千万别让司机在红绿灯那儿打盹:

代码语言:javascript
复制
     // 作死写法
     .onBodyPartReceived(p -> { Thread.sleep(1000); … })
     // 正确姿势
     ExecutorService pool = Executors.newCachedThreadPool();
     .onBodyPartReceived(p -> pool.submit(() -> /* 慢慢处理 */));

6. 一句话总结

在 HTTP/1.1 这条“单行道”上,想飙车?要么多修路(连接池),要么换高速(HTTP/2)。千万别把 I/O 线程当苦力,不然整条街都得堵成停车场。整篇文章记住这一句话就够了:HTTP/1.1是多个请求可使用不同连接并行发送;同一连接上需等待响应(除非启用管道化)。

收工!祝你开车不堵车,异步永不卡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鹏哥调优笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档