优雅停止 Go 服务器 是一门实践项目课,教你在关闭下载服务时保留已经开始的工作。先下载一份完整文本资料,观察立即停止如何中断已接受的传输,再实现关闭协调:拒绝新连接,同时让已有下载由原服务器进程继续完成。
两个引导实验将真实客户端结果与进程身份、信号投递、HTTP 关闭和 main 的等待责任联系起来。一个独立挑战把相同机制应用于两份不同的已接受资料传输。每个单元提供自己的环境和材料。预计约需 150 分钟;这是包含阅读和普通纠错的作者估计。
你将学到什么
完成本课程后,你将能够:
- 根据真实资料字节,比较可用的完整下载与被中断的传输;
- 识别课程原有的已编译 Go 进程,并向该进程精确发送
SIGTERM; - 在停止前确认请求已被接受,并观察已有工作继续时新连接被拒绝;
- 使用带有限 context 预算的
http.Server.Shutdown,让普通活动 HTTP 请求完成; - 区分
http.ErrServerClosed与真正的服务错误,并让 main 等待关闭完成; - 保留一份或两份完整下载资料,检查原客户端和服务器的结果,并保留提供的文件与观察记录。
本课程适合谁
本课程适合准备协调小型 HTTP 服务及其活动请求生命周期的 Go 学习者。
前置要求: 基本终端导航、构建失物招领 API中的 Go handler 和 error,以及使用 Go Worker 检查网站中的 goroutine 与 channel,或同等经验。进程 ID、信号、有限 context 和 main 的关闭等待会在使用前讲解。
学习环境: LabEx 在浏览器终端环境中提供 Go、起始生命周期代码、准备好的 HTTP handler、两份真实文本资料和观察工具。使用同一台机器上的 Server 与 Downloads 终端运行服务和客户端,无需本地安装 Go。命令、标签和程序输出保留英文。
常见问题
我需要事先了解操作系统信号吗?
不需要。实验会先介绍进程身份和 SIGTERM,再要求你停止课程自己的服务器。准备好的观察工具帮助识别已接受的请求和原生进程结果,不要求学习其内部跟踪格式。
调用 Shutdown 会自动完成所有工作吗?
main 必须等待关闭完成。截止时间错误不能证明活动工作已结束。服务器端处理可能先完成,而客户端仍在读取或刷写下载文件,因此需要检查两端结果,不假定两个终端消息的先后顺序。
挑战中有什么变化?
停止原服务器时,两份不同资料都必须已经开始传输。两份下载都要保留精确字节,活动工作期间新连接须被拒绝,并由同一服务器正常退出。范围仅为普通 HTTP;WebSocket、分布式流量切换和生产零停机保证不在本项目范围内。

