HTTP/1.1 的“单行道”——异步请求到底怎么走?
嗨,各位打工人!今天咱们聊点硬核却又不那么无聊的东西:HTTP/1.1 下的异步请求到底怎么跑?别担心,没有“茴香豆的四种写法”,只有接地气的“马路”比喻。
1. 单行道规则:HTTP/1.1 的“一根筋”
想象一条只能一辆车通行的乡间小路(TCP 连接)。
• 默认:车(请求)必须一辆接一辆开,前一辆没走完,后车只能干瞪眼。
• 官方外挂:HTTP Pipelining,理论上能让几辆车像火车车厢一样串着走。
• 现实:大多数收费站(服务器/代理/防火墙)不认这外挂,Apache、Java 自带的 HttpClient 也默认关着,怕出车祸。
2. 想并行?那就多修几条路!
既然一条小路堵车,那就多修几条并行的小路——这就是“多连接”。
• 连接池 = 停车场:停着一堆可随时上路的“共享汽车”(TCP 连接)。
• 线程池 = 司机休息室:负责真正踩油门、打方向盘(业务回调)。
• I/O 线程 = 红绿灯:只管读写字节,不让车撞车,不替你送货。
3. Apache HttpClient:老司机的玩法
代码片段
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. 老司机的生存指南
• 车位不够?把停车场扩建:
.setMaxConnections(200)• 能上高速就上高速:确认服务器支持 HTTP/2,直接起飞。
• 千万别让司机在红绿灯那儿打盹:
// 作死写法
.onBodyPartReceived(p -> { Thread.sleep(1000); … })
// 正确姿势
ExecutorService pool = Executors.newCachedThreadPool();
.onBodyPartReceived(p -> pool.submit(() -> /* 慢慢处理 */));6. 一句话总结
在 HTTP/1.1 这条“单行道”上,想飙车?要么多修路(连接池),要么换高速(HTTP/2)。千万别把 I/O 线程当苦力,不然整条街都得堵成停车场。整篇文章记住这一句话就够了:HTTP/1.1是多个请求可使用不同连接并行发送;同一连接上需等待响应(除非启用管道化)。
收工!祝你开车不堵车,异步永不卡。