Golang轻量级API网关核心是用net/http+httputil.NewSingleHostReverseProxy实现反向代理,自定义Handler匹配路由、修正Header、复用连接,并外置健康检查与路径拦截中间件。

用Golang实现轻量级API网关的核心思路
API网关本质是HTTP请求的统一入口,负责接收外部请求、解析路由、做基础校验(如鉴权、限流)、再将请求转发到后端服务。Golang适合做这件事——标准net/http库足够稳定,配合httputil.NewSingleHostReverseProxy可快速实现反向代理,无需引入复杂框架。
基础路由匹配与请求转发
不依赖第三方路由库(如Gin、Echo),直接用http.ServeMux或自定义http.Handler实现路径匹配。关键点是:区分网关自身管理接口(如/health)和需转发的业务路径(如/api/users)。
- 定义转发规则映射,例如map[string]string{"^/api/(.*)": "http://localhost:8081"},用正则提取路径片段
- 对匹配到的请求,构造新URL:targetURL.Path = "/api/" + submatches[0]
- 调用httputil.NewSingleHostReverseProxy(targetURL)得到代理handler,再ServeHTTP即可
保留原始请求头与修改必要字段
默认代理会丢弃部分Header(如Authorization、Content-Type),需显式拷贝。同时要修正X-Forwarded-For、X-Real-IP等字段,方便后端识别真实客户端。
- 在代理的Director函数中设置req.Host = targetURL.Host,避免Host头被覆盖
- 用proxy.Transport = &http.Transport{...}复用连接,提升性能
- 若后端需要网关身份标识,可添加自定义Header:req.Header.Set("X-Gateway-ID", "api-gw-01")
简单中间件:健康检查与路径拦截
网关至少应提供自身健康状态接口,并支持按路径禁用/灰度某类请求。这些逻辑放在主handler链最外层,不侵入代理逻辑。
立即学习“go语言免费学习笔记(深入)”;
- /health返回{"status":"ok","uptime":12345},用time.Since(startTime)计算运行时长
- 对敏感路径如/admin/.*,可在路由匹配后加判断:if strings.HasPrefix(r.URL.Path, "/admin") { http.Error(w, "Forbidden", http.StatusForbidden); return }
- 日志建议记录方法、路径、状态码、耗时,用log.Printf或结构化日志库(如zerolog)均可











