本文介绍如何使用 go 标准库(无需 martini 等第三方框架)快速构建一个简洁、可靠、生产就绪的 api 网关,支持路径前缀路由、服务转发与静态资源托管。
在微服务架构中,API 网关是请求入口的统一枢纽,承担路由分发、协议转换、认证鉴权等职责。但对中小规模系统而言,无需引入复杂网关(如 Kong、Traefik),Go 的 net/http 和 net/http/httputil 即可实现高性能、零依赖的轻量级网关。
以下是一个完整、可直接运行的示例,将 /users/ 下的所有请求透明代理至后端服务 http://192.168.2.8:8000,同时支持 /public/ 路径下的静态文件服务:
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
// 1. 配置目标服务地址
target, err := url.Parse("http://192.168.2.8:8000")
if err != nil {
log.Fatal("无效的目标服务 URL:", err)
}
// 2. 创建反向代理实例
proxy := httputil.NewSingleHostReverseProxy(target)
// 3. 注册路由:/users/ → 代理到后端,自动剥离前缀
http.Handle("/users/", http.StripPrefix("/users/", proxy))
// 4. 可选:托管静态资源(如前端 HTML/JS/CSS)
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./Documents"))))
log.Println("API 网关已启动,监听 :8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
✅ 关键说明: