在现代 Web 架构中,反向代理扮演着至关重要的角色。它不仅可以隐藏后端服务器的真实地址,还能实现负载均衡、缓存、SSL 终止等功能。而使用 Go语言 实现一个反向代理不仅高效简洁,还能充分发挥 Go 在并发和网络编程方面的优势。
本教程将手把手教你如何用 Go 语言编写一个基础但功能完整的反向代理服务。无论你是刚接触 Go网络编程 的小白,还是想深入理解 Go实现反向代理 原理的开发者,都能从中受益。

正向代理是客户端使用的(比如翻墙),而反向代理则是服务器端使用的。当用户访问某个域名时,请求首先到达反向代理服务器,再由它将请求转发给内部的后端服务(如 API 服务器、静态资源服务器等)。用户并不知道真实后端的存在。
幸运的是,Go 的标准库 net/http/httputil 中已经提供了 ReverseProxy 类型,我们可以直接使用它来构建反向代理,无需从零开始处理底层 HTTP 协议。
我们先写一个最基础的反向代理程序,将所有请求转发到 http://localhost:8080。
package mainimport ( "log" "net/http" "net/http/httputil" "net/url")func main() { // 目标后端服务地址 target, err := url.Parse("http://localhost:8080") if err != nil { log.Fatal(err) } // 创建反向代理 proxy := httputil.NewSingleHostReverseProxy(target) // 设置代理处理器 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { proxy.ServeHTTP(w, r) }) log.Println("反向代理服务器启动,监听 :9090") log.Fatal(http.ListenAndServe(":9090", nil))}这段代码做了以下几件事:
url.Parse 解析目标后端地址;httputil.NewSingleHostReverseProxy 创建一个代理实例;/)的请求交给该代理处理;有时我们需要在转发请求前修改请求头、添加认证信息或记录日志。可以通过设置 Director 函数实现。
// 自定义 Directorproxy.Director = func(req *http.Request) { req.URL.Scheme = "http" req.URL.Host = target.Host req.Header.Set("X-Forwarded-For", req.RemoteAddr) req.Header.Set("X-Real-IP", req.RemoteAddr)}这样,后端服务就能通过 X-Real-IP 获取到真实客户端 IP,而不是代理服务器的 IP。
1. 先启动一个简单的后端服务(例如用 Python):
# 终端执行python3 -m http.server 80802. 运行你的 Go 反向代理程序:
go run main.go3. 访问 http://localhost:9090,你将看到 Python 服务器返回的目录列表——说明反向代理工作正常!
虽然 NewSingleHostReverseProxy 只支持单个后端,但你可以通过轮询、随机或一致性哈希等方式选择多个后端 URL,并为每个请求动态创建 ReverseProxy 实例,从而实现简易负载均衡。这属于 Go HTTP反向代理 的高阶用法,适合后续深入学习。
通过本教程,你已经掌握了如何使用 Go 语言快速搭建一个功能完整的反向代理服务。借助标准库的强大能力,我们无需处理复杂的网络细节,就能实现高效、可靠的请求转发。
无论是用于开发调试、API 网关,还是生产环境的流量调度,Go语言反向代理 都是一个轻量又强大的选择。希望你能在此基础上继续探索更多高级特性,如 HTTPS 支持、健康检查、限流熔断等。
— 完 —
本文由主机测评网于2025-12-05发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123391.html