golang 代理服务

在 Go 语言中实现代理服务,你可以创建两种类型的代理:正向代理(Forward Proxy)和反向代理(Reverse Proxy)。正向代理通常由客户端配置,它代表客户端向服务器发起请求。反向代理则对客户端透明,客户端通常不知道代理的存在,代理服务器会将请求转发到真实的服务器。
正向代理
正向代理的实现可以通过监听一个端口并接受来自客户端的连接,然后根据客户端的请求转发到目标服务器。以下是一个简单的正向代理服务器的示例代码:
package main

import (
“io”
“log”
“net”
“strings”
)

func handleClientRequest(client net.Conn) {
defer client.Close()
request, err := io.ReadAll(client)
if err != nil {
log.Println(err)
return
}
requestStr := string(request)
method, host, _ := parseRequest(requestStr)
log.Printf(“Method: %s, Host: %s\n”, method, host)
// 这里可以添加更多的处理逻辑,比如请求过滤、修改等
server, err := net.Dial(“tcp”, host)
if err != nil {
log.Println(err)
return
}
defer server.Close()
server.Write(request)
io.Copy(client, server)
}

func parseRequest(requestStr string) (method, host string, _ error) {
lines := strings.SplitN(requestStr, “\n”, 2)
requestLine := strings.SplitN(lines[0], ” “, 3)
if len(requestLine) < 3 { return "", "", err } method = requestLine[0] host = requestLine[1] return } func main() { l, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } for { client, err := l.Accept() if err != nil { log.Println(err) continue } go handleClientRequest(client) } } 反向代理 反向代理的实现可以使用 Go 标准库中的 httputil.ReverseProxy 。以下是一个简单的反向代理服务器的示例代码: package main import ( "log" "net/http" "net/http/httputil" "net/url" ) func main() { proxy := httputil.NewSingleHostReverseProxy(&url.URL{ Scheme: "http", Host: "localhost:8080", }) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { proxy.ServeHTTP(w, r) }) log.Fatal(http.ListenAndServe(":9090", nil)) } 在这个示例中,反向代理服务器将请求转发到 localhost:8080 。 设置 GOPROXY 环境变量 如果你是在中国大陆使用 Go,可能会遇到访问 goproxy.io 等代理服务器速度慢的问题。你可以通过设置 GOPROXY 环境变量来使用国内的代理服务,比如: export GOPROXY=https://goproxy.cn,direct 这样配置后,你的 Go 工具链就会通过指定的代理服务器来下载依赖包。 注意事项 代理服务器可以实现各种功能,如内容过滤、缓存、负载均衡、增加安全性等。 在实现代理服务器时,需要注意处理各种 HTTP 请求和响应,包括但不限于修改请求头、处理 HTTPS 请求等。 在生产环境中,代理服务器应该具备错误处理、日志记录、安全性防护等特性。 通过上述代码示例和设置,你可以在 Go 语言中实现一个基本的代理服务。