如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多系列文章在我博客
Golang 版本 1.16
Talk is cheap, show me the code
测试 代理服务器
$ curl 'http://127.0.0.1:2002/sda?sda=111' # 2003 设置了 打印请求地址代码: upath := fmt.Sprintf("http://%s%s\n", r.Addr, req.URL.Path) http://127.0.0.1:2003/base/sda RemoteAddr=127.0.0.1:51738,X-Forwarded-For=127.0.0.1,X-Real-Ip= headers =map[Accept:[*/*] Accept-Encoding:[gzip] User-Agent:[curl/7.69.1] X-Forwarded-For:[127.0.0.1]]
查看 httputil.NewSingleHostReverseProxy()
函数, 便可以找到 ReverseProxy
源码。 位于该路径下文件go/src/net/http/httputil/reverseproxy.go
ServeHTTP()
最终会在请求到达代理服务器, 有监听方法调起。调用链路为:
http.ListenAndServe(addr string, handler Handler) -> Server.ListenAndServeTLS(certFile, keyFile) -> Server.ServeTLS(ln, certFile, keyFile) -> Server.Serve(l net.Listener) -> go c.serve(connCtx) -> serverHandler{c.server}.ServeHTTP(w, w.req)
所以 ReverseProxy 对象也实现了 ServeHTTP 方法 , 方法实现功能有:
这些都能在下面的代码实现中一一找到对应: