// HTTP cannot have multiple simultaneous active requests.[*]
// Until the server replies to this request, it can't read another,
// so we might as well run the handler in this goroutine.
// [*] Not strictly true: HTTP pipelining. We could let them all process
// in parallel even if their responses need to be serialized.
// But we're not going to implement HTTP pipelining because it
// was never deployed in the wild and the answer is HTTP/2.
// HTTP 不能有多个同时活动的请求。[*]
// 在服务器回复这个请求之前,它不能读取另一个,
// 所以我们不妨在这个 goroutine 中运行处理程序。
// [*] 不完全正确:HTTP 流水线。 我们可以让他们全部处理
// 并行,即使它们的响应需要序列化。
// 但是我们不打算实现 HTTP 流水线,因为它
// 从未在野外部署过,答案是 HTTP/2。
客户端
发送请求报文流程
客户端比较复杂一点。
客户端使用了连接池,复用 TCP 连接,避免重复建立连接。
充分利用 goroutine 机制,使用了 chan 进行协程间通信和超时控制等;
为什么服务端的 read 和 write 不是同时进行的,而客户端可以呢?
1
2
3
4
5
6
7
// Write the request concurrently with waiting for a response,
// in case the server decides to reply before reading our full
// request body.
// 在等待响应的同时写入请求,
// 如果服务器决定在阅读我们的完整内容之前回复
// 请求正文。