Golang反向代理接口转发:指定接口分端口实现求代码
Golang 反向代理路径匹配转发实现方案
实现思路
利用Go标准库net/http和net/http/httputil构建反向代理,通过路径匹配逻辑将不同请求转发到对应端口:
- 匹配
/api/v1/test、/api/v1/test/jiekou→ 转发到localhost:6666 - 匹配
/api/v1/test666/jiekou、/api/v1/test666/jiekou1→ 转发到localhost:8888
提供两种匹配方案:模糊前缀匹配(适合通路子路径)、精确正则匹配(适合指定固定路径),按需选择。
完整代码实现
方案1:模糊前缀匹配(匹配所有/api/v1/test开头的路径)
package main import ( "log" "net/http" "net/http/httputil" "net/url" "strings" ) func main() { // 初始化6666端口的代理目标 target666, err := url.Parse("http://localhost:6666") if err != nil { log.Fatalf("Failed to parse target URL for 6666: %v", err) } proxy666 := httputil.NewSingleHostReverseProxy(target666) // 初始化8888端口的代理目标 target888, err := url.Parse("http://localhost:8888") if err != nil { log.Fatalf("Failed to parse target URL for 8888: %v", err) } proxy888 := httputil.NewSingleHostReverseProxy(target888) // 自定义路由处理函数 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { path := r.URL.Path switch { case strings.HasPrefix(path, "/api/v1/test"): // 可选:如果后端不需要前缀,可以移除路径前缀 // r.URL.Path = strings.TrimPrefix(path, "/api/v1/test") proxy666.ServeHTTP(w, r) case strings.HasPrefix(path, "/api/v1/test666"): // 可选:移除路径前缀 // r.URL.Path = strings.TrimPrefix(path, "/api/v1/test666") proxy888.ServeHTTP(w, r) default: http.Error(w, "404 Not Found", http.StatusNotFound) } }) log.Println("Reverse proxy running on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
方案2:精确正则匹配(仅匹配指定的几个路径)
如果需要严格匹配用户指定的路径,避免误转发其他子路径,使用正则表达式:
package main import ( "log" "net/http" "net/http/httputil" "net/url" "regexp" ) // 预编译正则表达式,提升性能 var ( path666 = regexp.MustCompile(`^/api/v1/test(/jiekou)?$`) path888 = regexp.MustCompile(`^/api/v1/test666/(jiekou|jiekou1)$`) ) func main() { target666, err := url.Parse("http://localhost:6666") if err != nil { log.Fatalf("Failed to parse target URL for 6666: %v", err) } proxy666 := httputil.NewSingleHostReverseProxy(target666) target888, err := url.Parse("http://localhost:8888") if err != nil { log.Fatalf("Failed to parse target URL for 8888: %v", err) } proxy888 := httputil.NewSingleHostReverseProxy(target888) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { path := r.URL.Path switch { case path666.MatchString(path): proxy666.ServeHTTP(w, r) case path888.MatchString(path): proxy888.ServeHTTP(w, r) default: http.Error(w, "404 Not Found", http.StatusNotFound) } }) log.Println("Reverse proxy running on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
关键说明
- 路径修改:如果后端服务不需要请求前缀(比如希望转发到
localhost:6666/jiekou而不是localhost:6666/api/v1/test/jiekou),取消代码中路径修剪的注释即可。 - 错误处理:代码中添加了URL解析的错误检查,避免启动失败。
- 端口监听:示例中代理服务监听8080端口,可根据需求修改。
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

