菜单

HTTP 服务器与客户端

相关源文件

本文档提供了 Go 中 HTTP 服务器和客户端实现的详细概述,位于 net/http 包内。它涵盖了处理 HTTP 请求和响应的架构、核心组件和工作流程,以及连接管理和配置选项。

net/http 包同时实现了功能丰富的 HTTP 客户端和服务器。这些组件可用于构建从简单的 API 客户端到功能齐全的 Web 服务器和框架的各种应用。有关操作系统和文件系统操作的信息,请参阅 操作系统和文件系统

概述

Go 标准库中的 HTTP 服务器和客户端遵循模块化设计模式,并具有明确定义的接口。这在保持易用性的同时,提供了高度的灵活性,并且具有合理的默认值。

架构图

来源

HTTP 服务器

HTTP 服务器的实现围绕几个关键类型和接口展开,它们协同工作以接受连接、处理请求和发送响应。

核心组件

服务器类型

Server 类型定义了运行 HTTP 服务器的参数。它负责接受新连接、为每个连接创建 goroutine 以及处理 HTTP 请求。

关键配置字段包括:

  • Addr:要监听的网络地址
  • Handler:为每个请求调用的处理程序
  • ReadTimeout/WriteTimeout:读取整个请求/响应的最大持续时间
  • ReadHeaderTimeout:读取请求头允许的时间
  • IdleTimeout:等待下一个请求的时间
  • MaxHeaderBytes:请求头数据的最大大小

来源

处理程序接口

Handler 接口是服务器可扩展性的核心。它定义了响应 HTTP 请求的行为。

当收到请求时,服务器会将其传递给适当处理程序的 ServeHTTP 方法。处理程序负责生成响应。

来源

ResponseWriter 接口

ResponseWriter 接口提供了构建 HTTP 响应的方法。

ResponseWriter 可能实现的额外接口:

  • Flusher:允许将缓冲的数据刷新到客户端
  • Hijacker:允许接管底层连接
  • CloseNotifier:通知客户端何时断开连接(已弃用,请使用 Request.Context)

来源

ServeMux (HTTP 路由器)

ServeMux 是一个 HTTP 请求多路复用器(路由器),它将 URL 模式匹配到处理程序。它支持:

  • 静态路径:/files/image.jpg
  • 目录前缀:/files/
  • 特定于主机的模式:example.com/files/
  • 特定于方法的模式:POST /users/
  • 路径通配符:/users/{id}

来源

请求处理工作流程

HTTP 请求流经服务器的流程:

来源

超时处理

服务器提供了多个超时设置,以防止资源耗尽。

超时类型描述默认
ReadTimeout读取请求(包括头和正文)的总时间无(无超时)
ReadHeaderTimeout读取请求头的时间无(无超时)
WriteTimeout写入响应的时间无(无超时)
IdleTimeout在保持连接时等待下一个请求的时间无(无超时)

来源

HTTP 客户端

HTTP 客户端实现旨在通过连接池高效地发起请求和处理响应。

核心组件

客户端类型

Client 类型是发起 HTTP 请求的高级 API。它管理以下细节:

  • 跟踪重定向
  • Cookie
  • 超时
  • 连接复用

来源

Transport 和 RoundTripper

Transport 类型实现了 RoundTripper 接口,负责 HTTP 请求的底层处理。

Transport 管理:

  • 连接池
  • 重用连接
  • TLS 握手
  • 代理
  • HTTP/2 支持
  • 请求取消

来源

请求工作流程

客户端请求工作流程:

来源

连接管理

Transport 管理具有各种配置选项的连接

配置描述默认
MaxIdleConns所有主机之间的最大空闲连接数100
MaxIdleConnsPerHost每个主机之间的最大空闲连接数2
MaxConnsPerHost每个主机之间的最大总连接数无限制
IdleConnTimeout空闲连接保留时长90 秒
DisableKeepAlives禁用连接重用false
ResponseHeaderTimeout等待响应头的超时时间无超时
ExpectContinueTimeout等待 100-continue 的超时时间1 秒

来源

超时和取消

客户端请求可以通过

  1. 使用 Client.Timeout 的客户端级别超时
  2. 使用 Request.Context() 的每个请求上下文来控制

来源

通用组件

服务器和客户端共享几个关键数据结构以进行 HTTP 通信。

请求

Request 类型表示服务器收到的或客户端将要发送的 HTTP 请求

来源

响应

Response 类型表示 HTTP 请求的响应

来源

Header 类型表示 HTTP 头,并提供了访问和修改头字段的方法

Header 不区分大小写,提供的方法包括:

  • Get(key string) string
  • Set(key, value string)
  • Add(key, value string)
  • Del(key string)
  • Clone() Header

来源

服务器辅助函数

该包为常见的服务器任务提供了几个有用的辅助函数

静态文件服务

来源

请求助手

来源

响应助手

来源

客户端辅助函数

该包提供了方便的函数用于常见的客户端请求

来源

高级特性

HTTP/2 支持

客户端和服务器都支持 HTTP/2,并具有以下功能:

  • 通过 ALPN 自动协议协商
  • 流多路复用
  • 头部压缩
  • 服务器推送

来源

上下文集成

请求可以与上下文关联以进行取消、超时和值传递

来源

连接控制

对连接行为进行细粒度控制

来源

实现考量

线程安全

  • ClientTransport 是并发安全的
  • ServerServeMux 是并发安全的
  • RequestResponse 不应并发修改

默认行为

  • 默认客户端使用连接池并跟随重定向
  • 默认服务器支持保持活动连接
  • 两者都使用合理的超时时间以确保安全性和性能

来源

示例工作流程

简单服务器示例

自定义服务器示例

简单客户端示例

自定义客户端示例

来源