如何使用Golang实现简单API网关_路由和转发请求示例

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(如AuthorizationContent-Type),需显式拷贝。同时要修正X-Forwarded-ForX-Real-IP等字段,方便后端识别真实客户端。

  • 在代理的Director函数中设置req.Host = targetURL.Host,避免Host头被覆盖
  • proxy.Transport = &http.Transport{...}复用连接,提升性能
  • 若后端需要网关身份标识,可添加自定义Header:req.Header.Set("X-Gateway-ID", "api-gw-01")

简单中间件:健康检查与路径拦截

网关至少应提供自身健康状态接口,并支持按路径禁用/灰度某类请求。这些逻辑放在主handler链最外层,不侵入代理逻辑。

  • /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)均可
不复杂但容易忽略